Câu trả lời cho điều này thực sự phụ thuộc vào những gì bạn định làm với dữ liệu bạn đang lưu trữ trong mongodb. Điều quan trọng cần nhớ là ReferenceField
sẽ trỏ đến một tài liệu trong một bộ sưu tập khác trong mongodb, trong khi một EmbeddedDocument
được lưu trữ trong cùng một tài liệu trong cùng một bộ sưu tập.
Hãy xem xét lược đồ này:
Person
-> name
-> address
Address
-> street
-> city
-> country
Nếu bạn mong đợi mỗi người chỉ có một địa chỉ và mỗi địa chỉ chỉ được liên kết với một người (mối quan hệ một-một) và bạn thường sẽ truy vấn cơ sở dữ liệu cho một hoặc nhiều Người
tài liệu thì trường Person.address phải là EmbeddedDocumentField
.
Nếu bạn mong đợi mỗi người có nhiều địa chỉ nhưng mỗi địa chỉ sẽ chỉ được liên kết với một người (mối quan hệ một-nhiều) và bạn vẫn chủ yếu truy vấn một Người thì bạn có thể sử dụng EmbeddedDocumentListField .
Nếu bạn mong đợi mỗi người có nhiều hơn một địa chỉ và mỗi địa chỉ sẽ được liên kết với nhiều người (mối quan hệ nhiều-nhiều), bạn có thể nên sử dụng ReferenceField
.
Tuy nhiên, ngay cả khi bạn là một-một hay một-nhiều, nếu Địa chỉ
là một phần của mô hình dữ liệu mà bạn quan tâm thì việc lưu trữ nó trong bộ sưu tập của chính nó có thể là một điều thuận lợi vì nó làm cho việc tổng hợp và lập chỉ mục dễ dàng hơn.
Một điểm khác cần xem xét là trừ khi bạn biến nó tắt
mongoengine sẽ hủy tham chiếu mọi ReferenceField
khi bạn truy xuất một tài liệu - điều này có thể dẫn đến các hình phạt về hiệu suất với nhiều ReferenceField
hoặc tham chiếu đến các tài liệu rất lớn.