La réponse à cela dépend vraiment de ce que vous avez l'intention de faire avec les données que vous stockez dans mongodb. Il est important de se rappeler qu'un ReferenceField
pointera vers un document dans une autre collection dans mongodb, alors qu'un EmbeddedDocument
est stocké dans le même document dans la même collection.
Considérez ce schéma :
Person
-> name
-> address
Address
-> street
-> city
-> country
Si vous vous attendez à ce que chaque personne n'ait qu'une seule adresse et que chaque adresse ne soit associée qu'à une seule personne (une relation un à un) et que vous allez généralement interroger la base de données pour une ou plusieurs Person
documents, le champ Person.address doit être EmbeddedDocumentField
.
Si vous vous attendez à ce que chaque personne ait plus d'une adresse, mais que chaque adresse ne soit associée qu'à une seule personne (une relation un à plusieurs) et que vous recherchiez toujours principalement une personne, vous pouvez utiliser un EmbeddedDocumentListField
.
Si vous vous attendez à ce que chaque personne ait plus d'une adresse et que chaque adresse soit associée à de nombreuses personnes (une relation plusieurs à plusieurs), vous devriez probablement utiliser ReferenceField
.
Cependant, même si vous êtes un à un ou un à plusieurs, si l'Address
fait partie de votre modèle de données qui vous intéresse, il peut être avantageux de le stocker dans sa propre collection car cela facilite l'agrégation et l'indexation.
Un autre point à considérer est qu'à moins que vous l'activez désactivé
mongoengine déréférencera chaque ReferenceField
lorsque vous récupérez un document - cela peut introduire des pénalités de performance avec beaucoup de ReferenceField
ou des références à des documents très volumineux.