MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoEngine:EmbeddedDocument v/s. Pole referencyjne

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose, znajdź, zwróć określone właściwości

  2. wyklucz pola w agregacji $ lookup

  3. Jak posortować dwa pola z mangustą?

  4. Zrozumienie znajdowania w węźle/Mongo

  5. MongoDB — nie można użyć .explain(), aby uzyskać informacje o zapytaniu w kodzie C#?