Ответ на этот вопрос действительно зависит от того, что вы собираетесь делать с данными, хранящимися в mongodb. Важно помнить, что ReferenceField
будет указывать на документ в другой коллекции в mongodb, тогда как EmbeddedDocument
хранится в том же документе в том же сборнике.
Рассмотрим эту схему:
Person
-> name
-> address
Address
-> street
-> city
-> country
Если вы ожидаете, каждый человек имеет только один адрес, и каждый адрес, который будет связан только с одним лицом (один-к-одному), и вы, как правило, собираются запросите базу данных для одного или нескольких документов Person
, тогда поле Person.address должно быть EmbeddedDocumentField
.
Если вы ожидаете, что у каждого человека будет более одного адреса, но каждый адрес будет связан только с одним человеком (отношения «один ко многим»), и вы по-прежнему будете в основном запрашивать Личность, тогда вы можете использовать EmbeddedDocumentListField
.
Если вы ожидаете, что у каждого человека будет более одного адреса, и каждый адрес будет связан со многими людьми (отношения «многие-ко-многим»), вы, вероятно, должны использовать ReferenceField
.
Однако, даже если вы один-на-один или один-ко-многим, если Address
является частью вашей модели данных, которая представляет интерес, то может быть выгодно, чтобы она хранилась в ее собственной коллекции, потому что она упрощает агрегацию и индексирование.
Еще один момент, чтобы рассмотреть, что если вам turn it off mongoengine будет разыменовываются каждый ReferenceField
при извлечении документа - это может ввести штрафы производительности с большим количеством ReferenceField
или ссылки на очень большие документы.
Если вы думаете об использовании «RefereceField» в своем проекте, вероятно, вам стоит подумать об использовании ORM Django и [подключения его к MongoDB] (https://nesdis.github.io/djongo/) вместо использования MongoEngine , – nesdis