mongodb - 文档数据库 : Redundant data, 引用等(特别是 MongoDB)

似乎我遇到了很多情况,其中构建数据的适当方法是将其拆分为两个文档。假设这是一家链式店,您正在保存每个客户访问过的商店。商店和客户需要是独立的数据片段,因为它们与许多其他事物交互,但我们确实需要将它们关联起来。

因此,简单的答案是将用户的 Id 存储在商店文档中,或者将商店的 Id 存储在用户的文档中。通常,您希望访问 1-2 条其他数据用于显示目的,因为 Id 没有用。可能是客户名称或商店名称。

  1. 您通常会存储整个文档的副本吗?还是只存储您需要的数据?可能取决于文档的大小以及您需要多少。
  2. 您如何处理存在重复数据的事实?当数据发生变化时,你会去寻找数据吗?加载时每隔一段时间更新数据?仅在您负担得起陈旧数据时才复制?

非常感谢您的意见和/或任何类型的“最佳实践”或至少对这些主题进行合理讨论的链接。

最佳答案

基本上有两种情况:freshstale

新鲜数据

存储重复数据很容易。维护重复数据是困难的部分。因此,最简单的做法是避免维护,一开始就不要存储任何重复的数据。如果您需要新鲜数据,这主要是有用的。仅存储引用,并在需要检索信息时查询集合。

在这种情况下,由于额外的查询,您会有一些开销。另一种方法是跟踪重复数据的所有位置,并在每次更新时更新所有实例。这也涉及开销,尤其是在您提到的 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?

java - Mongodb避免重复条目

javascript - MongoError,错误 :E11000 duplicate key e

mongodb - 使用 mongodb 或 cassandra 的空间数据

mongodb - 寻找 1 x 100 万个交叉点的最佳解决方案? Redis、Mongo、其他

mongodb - mongoengine - 忽略模式验证的额外字段