如何处理 NoSQL 中重复数据的变化

Posted

技术标签:

【中文标题】如何处理 NoSQL 中重复数据的变化【英文标题】:How to handle changes in duplicated data in NoSQL 【发布时间】:2012-03-21 04:14:41 【问题描述】:

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

我了解在 NoSQL 中复制数据不会被视为错误。我无法理解的是修复数据更改以防止异常。

举例说明问题:

您正在组织一系列扑克锦标赛。你有球员, 地点和比赛活动。据我了解,锦标赛 事件可能包含一个位置和一组玩家。它确实 不需要拥有所有玩家数据,但如果你想获取名称 以及参加下一场锦标赛的每个人的家庭住址,这些信息 应该在锦标赛收藏中。

有人结婚并搬家,改变了他们的姓氏和 地址。应用程序是否需要更新播放器集合和 锦标赛收藏?还是我的收藏模型错了?怎么做 开发人员“跟踪”信息在哪里重复?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

我看到最近使用的模型是拥有一个不可变的“主”数据集合(在您的情况下,玩家列表,每个锦标赛中的玩家的锦标赛列表“相关”建模,其中锦标赛记录有一个玩家 ID 列表)和一个非规范化列表(在您的情况下,是一个包含完整玩家数据的锦标赛列表),该列表仅通过对“主”数据运行定期进程来更新。

这样应用只需要更新主数据,周期性的更新过程最终会重建非规范化的结果。

【讨论】:

当您说“不可变”时,您的字面意思是如果 anything 在该主对象上发生更改,您将删除它并创建一个新对象? 对不起,这里的词可能用错了。不可变是指在创建非规范化列表的过程中不会修改主列表。 @ChrisShain 基本上,您建议维护 2 个单独的写入(主集合)和读取(非规范化集合)集合。您还提到了定期更新以最终重建非规范化结果。所以这里的权衡是不渲染即时更新对吗?如果我们需要为查询呈现近乎实时的更新怎么办?而且我还担心周期性更新和连续读取对去规范化集合的影响。另外,您能否提供一些您提到的真实用例示例:The model that I see being used quite a bit lately...... @oblivion 对不起-这个答案已经 6 岁了,我不会再把它当作福音。根据您使用的平台,可能会有更好的方法来执行此操作,例如 Cassandra 中的物化视图。 所以这基本上是在模拟外键?还是我错过了这里的重点?

以上是关于如何处理 NoSQL 中重复数据的变化的主要内容,如果未能解决你的问题,请参考以下文章

python:如何处理if语句中的NaN数据[重复]

如何处理数据仓库中重复id包含略有不同值的维度表?

Codeigniter:当我插入数据时出现重复键错误,我该如何处理这个错误?

如何处理重复条目的错误?

android分页请求,重复数据如何处理

如何处理多个音轨中重复的note_on、note_off、节奏变化,以及midi文件中没有program_change的轨道?