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

时间:2016-01-28 00:40:28

标签: eventual-consistency denormalized nosql

假设我有两个集合,每个集合的值彼此独立,但每个集合彼此相关。它们是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
}

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

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

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

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

我已阅读Thomas Wanschik's excellent blog articles关于"物化视图"的主题确切地说这个场景的背景更新。但我还是担心:

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

1 个答案:

答案 0 :(得分:1)

我对NoSQL的早期理解是,在向用户/应用程序提供大量数据时,会对成本进行真正的分析。

在应用程序中回传照片时,更有可能发生更频繁的事情?将照片交付给用户,也许他们的朋友正在查看他们......或者更改用户的名字?

由于用户名称的更改是应用程序中不太常见的实例,NoSQL的Denormalization声名鹊起的是,您可以将高速的照片数据传回给用户而无需传统规范化/中的JOIN费用RDBMS环境。

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

这个问题成长为一部史诗小说,一方面有SQL Defenders,另一方面有“乌合之众”NoSQL粉丝。传统的DBA对于速度结构的妥协感到不寒而栗,但将NoSQL视为很久以前的旧“超级表”概念,我们过去常常会考虑返回的内容与需要存储的内容。基本上......这就是产生NoSQL概念的原因,它在大规模应用和大数据报告中非常有用。

我知道这是一个老问题,但我仍然希望我的回答可以帮助其他人,比如我自己在解决这类问题时揭开NoSQL的好处。