2016-01-20 5 views
2

EmbeddedDocument позволит хранить документ внутри другого документа, а RefereneField просто сохраняет ссылку. Но они достигают аналогичной цели. Имеют ли они конкретные варианты использования?MongoEngine: EmbeddedDocument v/s. ReferenceField

PS: Здесь есть question, но нет хороших ответов.

+0

Если вы думаете об использовании «RefereceField» в своем проекте, вероятно, вам стоит подумать об использовании ORM Django и [подключения его к MongoDB] (https://nesdis.github.io/djongo/) вместо использования MongoEngine , – nesdis

ответ

5

Ответ на этот вопрос действительно зависит от того, что вы собираетесь делать с данными, хранящимися в mongodb. Важно помнить, что ReferenceField будет указывать на документ в другой коллекции в mongodb, тогда как EmbeddedDocument хранится в том же документе в том же сборнике.

Рассмотрим эту схему:

Person 
    -> name 
    -> address 

Address 
    -> street 
    -> city 
    -> country 

Если вы ожидаете, каждый человек имеет только один адрес, и каждый адрес, который будет связан только с одним лицом (один-к-одному), и вы, как правило, собираются запросите базу данных для одного или нескольких документов Person, тогда поле Person.address должно быть EmbeddedDocumentField.

Если вы ожидаете, что у каждого человека будет более одного адреса, но каждый адрес будет связан только с одним человеком (отношения «один ко многим»), и вы по-прежнему будете в основном запрашивать Личность, тогда вы можете использовать EmbeddedDocumentListField.

Если вы ожидаете, что у каждого человека будет более одного адреса, и каждый адрес будет связан со многими людьми (отношения «многие-ко-многим»), вы, вероятно, должны использовать ReferenceField.

Однако, даже если вы один-на-один или один-ко-многим, если Address является частью вашей модели данных, которая представляет интерес, то может быть выгодно, чтобы она хранилась в ее собственной коллекции, потому что она упрощает агрегацию и индексирование.

Еще один момент, чтобы рассмотреть, что если вам turn it off mongoengine будет разыменовываются каждый ReferenceField при извлечении документа - это может ввести штрафы производительности с большим количеством ReferenceField или ссылки на очень большие документы.

1

Это действительно схема дизайна ваших коллекций в MongoDB. Как правило, это зависит от разных факторов, таких как мощность отношений, способ доступа к данным или размеру документов. Это хорошо объясняется в официальном MongoDB's blog с некоторыми примерами, и я рекомендую вам взглянуть на него.

Смежные вопросы