2011-12-19 36 views
5

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:

  1. 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".

  2. 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.

  3. 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?

Trả lời

2

Điều này thực sự phụ thuộc vào các truy vấn bạn sắp thực hiện. - Trang web của bạn có phụ thuộc nhiều vào địa chỉ liên hệ hoặc tổ chức không? - Bạn có thường xuyên cần hiển thị tất cả địa chỉ liên hệ từ một tổ chức không? - Bạn cần hiển thị chi tiết nào cho địa chỉ liên hệ trên trang tổ chức?

Vv

Điều này thực sự phụ thuộc vào nhu cầu của dự án của bạn. Bạn có tổ chức và trang liên hệ liên tục được cập nhật không? Nếu không phải là nhân bản dữ liệu không có vẻ như một ý tưởng tồi, đặc biệt nếu trang web của bạn được đọc nhiều hơn.

Dòng dưới cùng: suy nghĩ về những trang bạn sẽ có trên trang web và trang sẽ cần hiển thị (do đó cần phải thực hiện truy vấn nào).

+0

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

+0

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

Các vấn đề liên quan