MongoDB - Mối quan hệ
Các mối quan hệ trong MongoDB thể hiện cách các tài liệu khác nhau liên quan với nhau một cách hợp lý. Các mối quan hệ có thể được mô hình hóa thông quaEmbedded và Referencedcác phương pháp tiếp cận. Các mối quan hệ như vậy có thể là 1: 1, 1: N, N: 1 hoặc N: N.
Chúng ta hãy xem xét trường hợp lưu trữ địa chỉ cho người dùng. Vì vậy, một người dùng có thể có nhiều địa chỉ làm cho mối quan hệ 1: N này.
Sau đây là cấu trúc tài liệu mẫu của user tài liệu -
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"name": "Tom Hanks",
"contact": "987654321",
"dob": "01-01-1991"
}
Sau đây là cấu trúc tài liệu mẫu của address tài liệu -
{
"_id":ObjectId("52ffc4a5d85242602e000000"),
"building": "22 A, Indiana Apt",
"pincode": 123456,
"city": "Los Angeles",
"state": "California"
}
Mô hình hóa các mối quan hệ được nhúng
Trong phương pháp nhúng, chúng tôi sẽ nhúng tài liệu địa chỉ vào bên trong tài liệu người dùng.
> db.users.insert({
{
"_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"
}
]
}
})
Cách tiếp cận này duy trì tất cả dữ liệu liên quan trong một tài liệu duy nhất, giúp dễ dàng truy xuất và bảo trì. Toàn bộ tài liệu có thể được truy xuất trong một truy vấn đơn lẻ, chẳng hạn như -
>db.users.findOne({"name":"Tom Benzamin"},{"address":1})
Lưu ý rằng trong truy vấn trên, db và users là cơ sở dữ liệu và bộ sưu tập tương ứng.
Hạn chế là nếu tài liệu nhúng tiếp tục tăng quá nhiều về kích thước, nó có thể ảnh hưởng đến hiệu suất đọc / ghi.
Mô hình hóa các mối quan hệ được tham chiếu
Đây là cách tiếp cận thiết kế mối quan hệ bình thường hóa. Trong cách tiếp cận này, cả tài liệu người dùng và địa chỉ sẽ được duy trì riêng biệt nhưng tài liệu người dùng sẽ chứa một trường sẽ tham chiếu đến tài liệu địa chỉ củaid cánh đồng.
{
"_id":ObjectId("52ffc33cd85242f436000001"),
"contact": "987654321",
"dob": "01-01-1991",
"name": "Tom Benzamin",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000"),
ObjectId("52ffc4a5d85242602e000001")
]
}
Như được hiển thị ở trên, tài liệu người dùng chứa trường mảng address_idstrong đó chứa các ObjectIds của các địa chỉ tương ứng. Sử dụng các ObjectIds này, chúng tôi có thể truy vấn các tài liệu địa chỉ và lấy chi tiết địa chỉ từ đó. Với cách tiếp cận này, chúng tôi sẽ cần hai truy vấn: trước tiên để tìm nạpaddress_ids lĩnh vực từ user tài liệu và thứ hai để tìm nạp các địa chỉ này từ address bộ sưu tập.
>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})