Odpowiedź na to naprawdę zależy od tego, co zamierzasz zrobić z danymi, które przechowujesz w mongodb. Należy pamiętać, że ReferenceField
wskaże na dokument w innej kolekcji w mongodb, podczas gdy EmbeddedDocument
jest przechowywany w tym samym dokumencie w tej samej kolekcji.
Rozważ ten schemat:
Person
-> name
-> address
Address
-> street
-> city
-> country
Jeśli oczekujesz, że każda osoba będzie miała tylko jeden adres, a każdy adres będzie skojarzony tylko z jedną osobą (relacja jeden-do-jednego) i zazwyczaj będziesz przeszukiwać bazę danych o jedną lub więcej osoby
dokumenty to pole Person.address powinno mieć wartość EmbeddedDocumentField
.
Jeśli oczekujesz, że każda osoba będzie miała więcej niż jeden adres, ale każdy adres będzie powiązany tylko z jedną osobą (relacja jeden-do-wielu) i nadal będziesz głównie wysyłać zapytania o osobę, możesz użyć EmbeddedDocumentListField .
Jeśli oczekujesz, że każda osoba będzie miała więcej niż jeden adres, a każdy adres będzie powiązany z wieloma osobami (relacja wiele-do-wielu), prawdopodobnie powinieneś użyć ReferenceField
.
Jednak nawet jeśli jesteś jeden do jednego lub jeden do wielu, jeśli Adres
jest częścią modelu danych, która jest przedmiotem zainteresowania, może być korzystne przechowywanie go we własnej kolekcji, ponieważ ułatwia to agregację i indeksowanie.
Inną kwestią do rozważenia jest to, że jeśli nie nie przekręcisz wyłączony
mongoengine usunie referencje z każdego ReferenceField
kiedy pobierasz dokument - może to spowodować obniżenie wydajności z dużą ilością ReferenceField
lub odniesienia do bardzo dużych dokumentów.