MongoDB關係
MongoDB中的關係代表文件如何在各種邏輯上彼此相關。關係可以通過嵌入和引用的方法來模擬。這樣的關係可以是 1:1, 1: N, N: 1 或 N: N.
讓我們考慮存儲用戶地址的情況(例子)。這樣,一個用戶可以有多個地址,那麼就成為一個 1:N 的關係。
下麵是用戶文件的示例文檔的結構:
{ "_id":ObjectId("52ffc33cd85242f436000001"), "name": "Tom Hanks", "contact": "987654321", "dob": "01-01-1991" }
下麵是地址文件的示例文檔結構:
{ "_id":ObjectId("52ffc4a5d85242602e000000"), "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }
嵌入建模關係
在嵌入式方法中,我們將嵌入地址文件到用戶文檔中。
{ "_id":ObjectId("52ffc33cd85242f436000001"), "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address": [ { "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }, { "building": "170 A, Acropolis Apt", "pincode": 456789, "city": "Chicago", "state": "Illinois" }] }
這種方法保持在一個單一的文件,它可以很容易地檢索和維護所有相關數據。 整份文件,可檢索這樣一個查詢:
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
需要注意上麵的查詢,db和用戶分彆代表數據庫和集合。
缺點是,如果嵌入的文檔不斷增長過大,這會影響到讀/寫性能。
模型引用關係
這是設計標準化關係的方法。在這種方法中,用戶和地址的文件將被分彆維護,但用戶文檔將包含的字段將引用地址文檔的id字段。
{ "_id":ObjectId("52ffc33cd85242f436000001"), "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address_ids": [ ObjectId("52ffc4a5d85242602e000000"), ObjectId("52ffc4a5d85242602e000001") ] }
如上圖所示,用戶文檔包含數組字段address_ids,它包含相應地址的ObjectID。使用這些的ObjectID,我們可以查詢地址文檔,並從中獲得地址的詳細信息。通過這種方法,我們將需要兩個查詢:首先來從用戶文檔取出address_ids字段,再次從地址集合獲取這些地址。
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1}) >var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})