如何在NoSQL中维护非规范化的一致性?

Sni*_*tor 8 eventual-consistency nosql denormalized

假设我有两个集合,每个集合的值彼此独立,但每个集合彼此相关.他们是photosusers.用户和照片之间存在一对多的关系.

非规范化数据的一个例子:

users:
{
  "id": "AABC",
  "name": "Donna Smith"
}

photos:
{
  "id": "FAD4",
  "description": "cute dog",
  "user_id": "AABC",  // This is the relationship
  "user_name": "Donna Smith"  // This is the denormalized value from the "users" collection
}
Run Code Online (Sandbox Code Playgroud)

photos当用户"AABC"将名称从"Donna Smith"更改为"Donna Chang"时,如何确保与集合中的文档保持一致?

作为非交易性的,我理解一致性将是最终的.

在更改用户"AABC"以更新user_id ="AABC"的所有照片后,简单(天真)实现可能会触发后台作业.在单次更新的情况下,这将很好.但这是一个多用户环境,并且会同时在各个方向上进行更新.例如,如果在照片的背景更新中途将"Donna Smith"更改为"Donna Chang",用户"AABC"的名称将更改为"Donna Smith"?

在线搜索,我看到很多关于如何建模非规范化数据的讨论.但是关于如何维护它的任何讨论似乎都被轻视为"你还需要更新所有相关记录".在这种情况下,是否有任何NoSQL系统为您提供繁重的工作?任何框架或实用程序?

我已经阅读了Thomas Wanschik关于"物化视图"主题的精彩博客文章以及这个场景的背景更新.但我担心:

  1. 后台作业必须延迟一个大于更新允许的最大时间的预定量(如何确定延迟?如果操作需要更长时间?),和;
  2. 这是我发现实际解决方案的唯一讨论.NoSQL是一个大问题,为什么我没有看到更多关于此的讨论?我错过了什么?

Ind*_*nes 4

我对 NoSQL 的早期理解是,在将大量数据传递回用户/应用程序时,需要进行真正的成本分析。

当您在应用程序中传回照片时,哪些情况更有可能发生得更频繁?将照片传送回用户,或许还有正在查看照片的朋友……或者更改用户的姓名?

由于更改用户名在应用程序中不太常见,NoSQL 的非规范化之所以出名,是因为您可以将高速照片数据块传送回用户,而无需在传统规范化/RDBMS 环境中进行 JOIN。

使用现在的一些工具(因为你很久以前写过这篇文章)可以帮助解决这样的情况,但你基本上是正确的,因为你可以安排代码更改来处理这个......它将是慢...它会很昂贵...但它会起作用...并且您仍然可以享受将照片传送到应用程序的速度的好处,这本质上是您的应用程序的主要目的。

这个问题发展成为一部史诗小说,其中一边是 SQL 捍卫者,一边是“乌合之众”NoSQL 追随者。传统 DBA 对为了速度而牺牲结构的想法感到不寒而栗,但将 NoSQL 视为很久以前的旧“超级表”概念,我们过去常常根据返回的内容和需要存储的内容来思考。本质上...这就是 NoSQL 概念的产生,并且事实证明它对于大规模应用程序和大数据报告非常有帮助。

我知道这是一个老问题,但我仍然希望我的回答可以帮助其他人(例如我自己)在涉及此类问题时揭开 NoSQL 优势的神秘面纱。