如何在NoSQL中处理重复数据中的更改

如何在NoSQL中处理重复数据中的更改,nosql,denormalization,Nosql,Denormalization,我们正在为即将到来的项目评估NoSQL。我倾向于以RDBMS的方式思考问题,并且在概念化缺乏规范性方面遇到了困难 我知道在NoSQL中复制数据并不被认为是错误的。我在理解上遇到的困难是修复对数据的更改以防止异常 举例说明问题: 你正在组织一系列的扑克比赛。你有球员, 地点,比赛项目。据我所知,这是一场比赛 事件可能包含一个位置和一组玩家。是的 不需要有所有的球员数据,但如果你想得到的名字 还有参加下一场比赛的每个人的家庭地址,这些信息 应该在锦标赛系列中 有人结婚了,搬家了,改变了姓氏 地址。应

我们正在为即将到来的项目评估NoSQL。我倾向于以RDBMS的方式思考问题,并且在概念化缺乏规范性方面遇到了困难

我知道在NoSQL中复制数据并不被认为是错误的。我在理解上遇到的困难是修复对数据的更改以防止异常

举例说明问题:

你正在组织一系列的扑克比赛。你有球员, 地点,比赛项目。据我所知,这是一场比赛 事件可能包含一个位置和一组玩家。是的 不需要有所有的球员数据,但如果你想得到的名字 还有参加下一场比赛的每个人的家庭地址,这些信息 应该在锦标赛系列中

有人结婚了,搬家了,改变了姓氏 地址。应用程序是否需要更新播放器集合和 锦标赛系列?还是我的收藏模式错了?怎么办 开发人员“跟踪”信息复制的位置


我最近看到的一个模型是有一个不可变的“主”数据集合(在你的例子中,球员列表,比赛列表,每个比赛中的球员都是“关系式”建模的,其中比赛记录有一个球员ID列表),以及一个非规范化的列表(在您的例子中,是一个包含完全填充的玩家数据的锦标赛列表),只有通过在“主”数据上运行定期进程才能进行更新


这样,应用程序只需更新主数据,定期更新过程最终将重建非规范化结果。

要做的一件事是为您拥有的每种类型的数据提供一个“记录系统”或主数据。不需要为所有数据提供单一源,但每个数据都应该有一个


另一个需要采取的措施是对数据进行版本化(保留历史更改),以便非规范化数据可以是不可变的-在您的示例中,过去发生的比赛的球员数据适用于该时间。如果球员从那时起移动到新地址,您仍然可以通过转到球员的“记录系统”来获得该数据获取当前地址,但比赛记录会反映他/她的当时地址等。

当您说“不可变”时你的字面意思是说,如果主对象上有任何更改,你就要删除它并创建一个新的对象吗?对不起,可能是这个词用错了。所谓不可变,我的意思是主列表在创建非规范化列表的过程中没有被修改。@ChrisShain基本上,你建议维护两个单独的写操作(主集合)和读取(非规范化集合)集合。您还提到了定期更新,以最终重建非规范化结果。因此,这里的折衷办法是不立即提供更新,对吗?如果我们需要为查询提供近实时更新,该怎么办?我还担心定期更新和连续读取对非规范化集合的影响。另外,您能否提供一些您提到的真实用例示例:
我最近看到的模型被大量使用……
@oblivion抱歉-这个答案已经有6年了,我不再把它当作福音书了。根据您使用的平台,可能有更好的方法来实现这一点,例如材料在Cassandra中对视图进行了优化。所以这基本上是在模拟外键?还是我没有抓住要点?