似乎我遇到了很多情况,其中构建数据的适当方法是将其拆分为两个文档。假设这是一家链式店,您正在保存每个客户访问过的商店。商店和客户需要是独立的数据片段,因为它们与许多其他事物交互,但我们确实需要将它们关联起来。
因此,简单的答案是将用户的 Id 存储在商店文档中,或者将商店的 Id 存储在用户的文档中。通常,您希望访问 1-2 条其他数据用于显示目的,因为 Id 没有用。可能是客户名称或商店名称。
非常感谢您的意见和/或任何类型的“最佳实践”或至少对这些主题进行合理讨论的链接。
最佳答案
基本上有两种情况:fresh和stale。
存储重复数据很容易。维护重复数据是困难的部分。因此,最简单的做法是避免维护,一开始就不要存储任何重复的数据。如果您需要新鲜数据,这主要是有用的。仅存储引用,并在需要检索信息时查询集合。
在这种情况下,由于额外的查询,您会有一些开销。另一种方法是跟踪重复数据的所有位置,并在每次更新时更新所有实例。这也涉及开销,尤其是在您提到的 N 对 M 关系中。因此,无论哪种方式,如果您需要新数据,您将有一些开销。你不能两全其美。
如果您有能力拥有过时的数据,事情就会变得容易得多。为避免查询开销,您可以存储重复数据。为避免必须维护重复数据,您不会存储重复数据。至少不会主动。
在这种情况下,您还希望只存储文档之间的引用。然后使用周期性的 map-reduce 作业来生成重复数据。然后,您可以查询单个 map-reduce 结果,而不是单独的集合。这样可以避免查询开销,但也不必追踪数据更改。
仅存储对其他文档的引用。如果您负担得起陈旧的数据,请使用定期 map-reduce 作业来生成重复数据。避免维护重复数据;它复杂且容易出错。
https://stackoverflow.com/questions/3956756/
相关文章:
mongodb - MongoDB中聚合($match)和查找之间的区别?
java - 编码对象时未使用 MongoDB BSON 编解码器
mongodb - 使用 sphinx 搜索与 mongodb 作为数据源
mongodb - 如何在 MongoDB 中将子文档展平为根级别?
java - 如何直接从 Java 中的 mongodb 查询返回原始 JSON?
javascript - MongoError,错误 :E11000 duplicate key e
mongodb - 使用 mongodb 或 cassandra 的空间数据