Tôi đang cố gắng chia nhỏ suy nghĩ RDBMS của mình với Mongoose trong ứng dụng node.js và có thể sử dụng một số hướng dẫn để thực hành tốt nhất.Thực hành tốt nhất về lược đồ/truy vấn Mongoose (MongoDB, node.js)
Ví dụ đơn giản: Giả sử có hai bộ sưu tập, tổ chức và địa chỉ liên hệ. Đó là mối quan hệ một-nhiều và cả hai đều cần phải cô đơn. Tuy nhiên, trong một phương thức chỉ mục, tôi muốn trả về một mảng các đối tượng tổ chức, mỗi đối tượng có một mảng các đối tượng liên lạc thành viên. (Và sau này tôi muốn trả về một mảng liên lạc, mỗi người có một đối tượng tổ chức.)
Dường như với tôi rằng tôi hiểu nhầm cách tốt nhất để thực hiện việc này. Dưới đây là các tùy chọn như tôi thấy chúng cho đến thời điểm này:
Nhúng địa chỉ liên hệ với id của chúng trong tài liệu tổ chức. Truy vấn chỉ mục có thể là
Organization.find({}, function(err, orgs) { orgs[n].contacts[n]...})
. Bất lợi: Rất nhiều bộ nhớ bổ sung cần thiết và phải cập nhật tài liệu liên hệ được nhúng bất cứ khi nào bạn thay đổi tài liệu liên hệ "chính".Tận dụng cấu trúc populate/DBRef của Mongoose để lưu trữ id "khóa ngoài" trong cả hai bảng. Truy vấn có thể là:
Organization.find({}}.populate('contacts').run(...)
. Bất lợi: Bạn phải lưu trữ khóa ở cả hai bên.Chuyển tuyến "khóa ngoại" truyền thống hơn, chỉ lưu trữ id tổ chức trong tài liệu liên hệ. Truy vấn tài liệu của tổ chức và sau đó truy vấn tất cả các liên hệ trong cuộc gọi lại của truy vấn tổ chức, kết hợp dữ liệu vào một đối tượng để trả về. Nhược điểm: Nhiều truy vấn và phí xử lý bổ sung (Tôi tin rằng chúng tôi phải tìm tổ chức và địa chỉ liên hệ cho các tổ chức đó một cách độc lập và sau đó lặp lại từng trường hợp, kết hợp thủ công trên trường _id chung để kết hợp chúng thành đối tượng đầu ra mới) .
Tôi phải thiếu tùy chọn tốt hơn. Một cái gì đó cho phép lược đồ của # 3 nhưng trả về đối tượng kết hợp mong muốn với chi phí thấp hơn nhiều.
LƯU Ý: Mô-đun async có vẻ như nó có thể giúp ích cho điều này, nhưng đây thực sự là cách tốt nhất/tốt nhất?
Cảm ơn bạn đã trả lời. Ứng dụng này phụ thuộc như nhau trên cả địa chỉ liên hệ và tổ chức. Đó là, một số người dùng định hướng mạnh mẽ hơn cho tổ chức, một số người liên hệ.Trong mọi trường hợp, tất cả các liên hệ sẽ cần được hiển thị cho từng tổ chức. Nói chung, sẽ có yêu cầu đọc lớn hơn viết, nhưng không gian lưu trữ cuối cùng sẽ là mối quan ngại nếu chúng tôi nhúng dữ liệu liên hệ vào tất cả các tài liệu org. Bây giờ, tôi nghĩ rằng nó có thể có ý nghĩa nhất để gắn bó với # 2 vì nó giảm thiểu trách nhiệm của những người khác. Nhưng vẫn có vẻ vô lý để lưu trữ id trên cả hai mặt! – glortho
Nó không phải là xấu, bạn chỉ cần thực hiện 2 truy vấn (một cho bộ sưu tập và một cho dữ liệu tham chiếu). Đó là giải pháp an toàn nhất cho bạn vào lúc này, sau đó bạn có thể thay đổi cấu trúc trong tương lai nếu bạn muốn. – alessioalex