MongoEngine:嵌入式文档 v/s。参考字段
MongoEngine: EmbeddedDocument v/s. ReferenceField
EmbeddedDocument
将允许将文档存储在另一个文档中,而 RefereneField
仅存储它的引用。但是,他们正在实现类似的目标。他们有具体的用例吗?
PS:
SO 上已经有 question,但没有好的答案。
这个问题的答案实际上取决于打算如何处理您存储在 mongodb 中的数据。重要的是要记住 ReferenceField
将指向 mongodb 中另一个集合中的文档,而 EmbeddedDocument
存储在同一集合中的同一文档中。
考虑这个模式:
Person
-> name
-> address
Address
-> street
-> city
-> country
如果您希望每个人只有一个地址并且每个地址只与一个人相关联(一种 one-to-one 关系)并且您通常要查询一个或多个数据库 Person
文档那么 Person.address 字段应该是 EmbeddedDocumentField
.
如果您希望每个人都有一个以上的地址,但每个地址只会与一个人相关联(一种 one-to-many 关系)并且您仍然主要查询一个人,那么您可以使用 EmbeddedDocumentListField
.
如果您希望每个人都有一个以上的地址,并且每个地址将与许多人相关联(一种 many-to-many 关系),您可能应该使用 ReferenceField
.
但是,即使您是 one-to-one 或 one-to-many,如果 Address
是您感兴趣的数据模型的一部分,那么将其存储在它是自己的集合,因为它使聚合和索引更容易。
要考虑的另一点是,除非您 turn it off mongoengine 将 de-reference 每隔 ReferenceField
检索文档 - 这可能会导致性能损失,其中有很多 ReferenceField
或对非常大的文档的引用。
这实际上是关于 MongoDB 中集合的架构设计。通常它取决于不同的因素,如关系的基数、访问数据的方式或文档的大小。官方MongoDB's blog解释的很好,有一些例子,我推荐你看一下。
EmbeddedDocument
将允许将文档存储在另一个文档中,而 RefereneField
仅存储它的引用。但是,他们正在实现类似的目标。他们有具体的用例吗?
PS: SO 上已经有 question,但没有好的答案。
这个问题的答案实际上取决于打算如何处理您存储在 mongodb 中的数据。重要的是要记住 ReferenceField
将指向 mongodb 中另一个集合中的文档,而 EmbeddedDocument
存储在同一集合中的同一文档中。
考虑这个模式:
Person
-> name
-> address
Address
-> street
-> city
-> country
如果您希望每个人只有一个地址并且每个地址只与一个人相关联(一种 one-to-one 关系)并且您通常要查询一个或多个数据库 Person
文档那么 Person.address 字段应该是 EmbeddedDocumentField
.
如果您希望每个人都有一个以上的地址,但每个地址只会与一个人相关联(一种 one-to-many 关系)并且您仍然主要查询一个人,那么您可以使用 EmbeddedDocumentListField
.
如果您希望每个人都有一个以上的地址,并且每个地址将与许多人相关联(一种 many-to-many 关系),您可能应该使用 ReferenceField
.
但是,即使您是 one-to-one 或 one-to-many,如果 Address
是您感兴趣的数据模型的一部分,那么将其存储在它是自己的集合,因为它使聚合和索引更容易。
要考虑的另一点是,除非您 turn it off mongoengine 将 de-reference 每隔 ReferenceField
检索文档 - 这可能会导致性能损失,其中有很多 ReferenceField
或对非常大的文档的引用。
这实际上是关于 MongoDB 中集合的架构设计。通常它取决于不同的因素,如关系的基数、访问数据的方式或文档的大小。官方MongoDB's blog解释的很好,有一些例子,我推荐你看一下。