mongodb中的数据重复太多?

mongodb中的数据重复太多?,mongodb,duplicates,norm,Mongodb,Duplicates,Norm,我是NOSQL的新手,最近对mongoDB很感兴趣。我正在从头开始创建一个新网站,并决定使用MONGODB/NORM(用于C#)作为我唯一的数据库。我已经阅读了很多关于如何正确设计文档模型数据库的内容,我认为在大多数情况下,我的设计都做得很好。我进入新网站大约6个月了,我开始发现我需要反复处理的数据复制/同步问题。据我所知,这是文档模型所期望的,对于性能来说是有意义的。也就是说,您将嵌入的对象粘贴到文档中,以便快速读取-无连接;当然,您不能总是嵌入,所以mongodb有DbReference的概

我是NOSQL的新手,最近对mongoDB很感兴趣。我正在从头开始创建一个新网站,并决定使用MONGODB/NORM(用于C#)作为我唯一的数据库。我已经阅读了很多关于如何正确设计文档模型数据库的内容,我认为在大多数情况下,我的设计都做得很好。我进入新网站大约6个月了,我开始发现我需要反复处理的数据复制/同步问题。据我所知,这是文档模型所期望的,对于性能来说是有意义的。也就是说,您将嵌入的对象粘贴到文档中,以便快速读取-无连接;当然,您不能总是嵌入,所以mongodb有DbReference的概念,基本上类似于关系数据库中的外键

这里有一个例子:我有用户和事件;两者都有自己的文档,用户参加活动,活动有用户参加。我决定将数据有限的事件列表嵌入到用户对象中。我还将用户列表作为“与会者”嵌入到事件对象中。这里的问题是,现在我必须使用户与事件对象中嵌入的用户列表保持同步。正如我所读到的,这似乎是首选的方法,也是NOSQL的工作方式。检索速度很快,但退后一步是当我更新主用户文档时,我还需要进入事件对象,可能会找到对该用户的所有引用,并对其进行更新


所以我的问题是,这是人们需要处理的一个相当普遍的问题吗?在你开始说“也许NOSQL策略不适合我在这里尝试做的事情”之前,这个问题要发生多少?什么时候不必执行连接的性能优势变成了劣势,因为您很难在嵌入式对象中保持数据同步,并且需要多次读取数据库才能做到这一点?

这就是与文档存储的权衡。您可以像任何标准RDM一样以规范化的方式进行存储,并且您应该尽可能努力实现规范化。只有在性能受到影响的情况下,您才应该打破规范化并扁平化数据结构。取舍是读取效率与更新成本

Mongo有非常高效的索引,可以像传统的RDM一样简化规范化(大多数文档存储不会免费提供这一功能,这就是为什么Mongo更像是一个混合而不是纯文档存储)。使用它,您可以在用户和事件之间建立关系集合。它类似于表格数据存储中的代理表。为事件和用户字段编制索引,它应该非常快,并将帮助您更好地规范化数据

我喜欢绘制结构扁平化的效率与在更新记录数据与读取查询中所需内容时保持结构规范化的效率。你可以用大O符号来表示,但你不必那么花哨。只需在纸上写下一些数据,这些数据基于几个不同模型的用例,并对需要做多少工作有一个良好的直觉

基本上,我所做的是首先尝试预测一条记录的更新次数与读取频率的概率。然后,我尝试预测一次更新和一次读取的成本是多少,当它都被规范化或扁平化时(或者可能是我能想到的这两者的部分组合…许多优化选项)。然后,我可以判断将其保持平坦所节省的成本与从标准化源构建数据的成本。一旦我画出了所有的变量,如果保持平放可以节省很多,那么我会保持平放

以下是一些提示:

  • 如果您需要快速查找以实现快速和原子化(完全最新),那么您可能需要一个支持扁平化而非规范化的解决方案,并在更新中获得成功
  • 如果您需要快速更新,并立即访问,则支持标准化
  • 如果您需要快速查找,但不需要完全更新的数据,请考虑在批处理作业中建立规范化数据(可能使用MAP/RADION)。李> <> LI>如果您的查询需要快速,并且更新是罕见的,并且不一定要求您的更新立即可访问或需要事务级锁定,那么它会经历100%的时间(以保证您的更新被写入磁盘),您可以考虑将更新写入后台的队列中。(在此模型中,您可能需要稍后处理冲突解决和和解)
  • 剖析不同的模型。在代码中构建一个数据查询抽象层(某种程度上类似于ORM),以便以后重构数据存储结构
你还可以运用很多其他的想法。在线上有很多很棒的博客,比如HighScalability.org,确保你们理解CAP定理

还考虑缓存层,比如ReDIS或MyCask。我将把其中一个产品放在我的数据层前面。当我查询mongo(它存储所有规范化的内容)时,我使用数据构造一个扁平表示并将其存储在缓存中。当我更新数据时,我将使缓存中引用我正在更新的内容的任何数据无效。(尽管考虑到您的缩放因子,您必须花费一定的时间使缓存中的数据和跟踪数据无效,这些数据将被更新)。有人曾经说过:“计算机科学中最难的两件事是命名和缓存失效。”


希望有帮助

尝试将UserEvent属性类型的IList添加到用户对象中。您没有详细说明域模型的设计方式。检查常模组
例如。

谢谢您的回复!很多好的见解/建议!我没有想到用户事件关系集合。和缓存