MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoEngine:EmbeddedDocument v/s. Campo de referência


A resposta para isso realmente depende do que pretende fazer com os dados que você está armazenando no mongodb. É importante lembrar que um ReferenceField apontará para um documento em outra coleção no mongodb, enquanto um EmbeddedDocument é armazenado no mesmo documento na mesma coleção.

Considere este esquema:
Person
    -> name
    -> address

Address
    -> street
    -> city
    -> country

Se você espera que cada pessoa tenha apenas um endereço e cada endereço seja associado apenas a uma pessoa (um relacionamento um-para-um) e você geralmente consulta o banco de dados para uma ou mais Person documentos, o campo Person.address deve ser EmbeddedDocumentField .

Se você espera que cada pessoa tenha mais de um endereço, mas cada endereço só será associado a uma pessoa (um relacionamento um-para-muitos) e você ainda consultará principalmente uma pessoa, poderá usar um EmbeddedDocumentListField .

Se você espera que cada pessoa tenha mais de um endereço e cada endereço será associado a muitas pessoas (um relacionamento muitos-para-muitos), você provavelmente deve usar ReferenceField .

No entanto, mesmo se você for um para um ou um para muitos, se o Endereço faz parte do seu modelo de dados que é de interesse, então pode ser vantajoso tê-lo armazenado em sua própria coleção, pois facilita a agregação e a indexação.

Um outro ponto a considerar é que, a menos que você transforme-o desligado mongoengine irá desreferenciar cada ReferenceField quando você recupera um documento - isso pode introduzir penalidades de desempenho com muitos ReferenceField ou referências a documentos muito grandes.