La risposta a questo dipende davvero da cosa intendi fare con i dati che stai archiviando in mongodb. È importante ricordare che un ReferenceField
punterà a un documento in un'altra raccolta in mongodb, mentre un EmbeddedDocument
è archiviato nello stesso documento nella stessa raccolta.
Considera questo schema:
Person
-> name
-> address
Address
-> street
-> city
-> country
Se prevedi che ogni persona abbia un solo indirizzo e che ogni indirizzo sia associato a una sola persona (una relazione uno-a-uno) e generalmente interrogherai il database per una o più Person
documenti, quindi il campo Person.address dovrebbe essere EmbeddedDocumentField
.
Se prevedi che ogni persona abbia più di un indirizzo, ma ogni indirizzo sarà associato a una sola persona (una relazione uno-a-molti) e continuerai a interrogare principalmente una Persona, puoi utilizzare un EmbeddedDocumentListField
.
Se ti aspetti che ogni persona abbia più di un indirizzo e ogni indirizzo sarà associato a molte persone (una relazione molti-a-molti), probabilmente dovresti usare ReferenceField
.
Tuttavia, anche se sei uno a uno o uno a molti, se l'Address
fa parte del tuo modello di dati che è di interesse, quindi potrebbe essere vantaggioso averlo archiviato nella propria raccolta perché semplifica l'aggregazione e l'indicizzazione.
Un altro punto da considerare è che, a meno che tu non lo giri spento
mongoengine de-reference ogni ReferenceField
quando recuperi un documento, ciò potrebbe introdurre penalità di prestazioni con molti ReferenceField
o riferimenti a documenti molto grandi.