【问题标题】:MongoEngine: EmbeddedDocument v/s. ReferenceFieldMongoEngine:EmbeddedDocument v/s。参考字段
【发布时间】:2016-04-26 03:39:54
【问题描述】:
EmbeddedDocument 将允许将一个文档存储在另一个文档中,而RefereneField 只存储它的引用。但是,他们正在实现类似的目标。他们有特定的用例吗?
PS:
SO上已经有question,但没有好的答案。
【问题讨论】:
标签:
python
mongodb
mongoengine
【解决方案1】:
这个问题的答案实际上取决于您打算如何处理您存储在 mongodb 中的数据。请务必记住,ReferenceField 将指向 mongodb 中另一个集合中的文档,而 EmbeddedDocument 存储在同一集合中的同一文档中。
考虑这个架构:
Person
-> name
-> address
Address
-> street
-> city
-> country
如果您希望每个人只有一个地址,并且每个地址只与一个人关联(一对一关系),并且您通常要在数据库中查询一个或多个 Person 文档,那么Person.address 字段应为EmbeddedDocumentField。
如果您希望每个人都有多个地址,但每个地址只会与一个人关联(一对多关系)并且您仍然主要查询一个人,那么您可以使用EmbeddedDocumentListField .
如果您希望每个人都有多个地址,并且每个地址将与很多人相关联(多对多关系),您可能应该使用ReferenceField。
但是,即使您是一对一或一对多,如果 Address 是您感兴趣的数据模型的一部分,那么将其存储在自己的集合中可能是有利的,因为它使聚合和索引更容易。
要考虑的另一点是,除非您在检索文档时 turn it off mongoengine 将取消引用每个 ReferenceField - 这可能会导致性能损失,因为大量 ReferenceField 或引用非常大的文档。
【解决方案2】:
这实际上是关于 MongoDB 中集合的架构设计。通常它取决于不同的因素,例如关系的基数、访问数据的方式或文档的大小。官方MongoDB's blog中已经解释的很好,举了一些例子,推荐大家看看。