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

13

假设我有两个集合,每个集合的值彼此独立,但它们彼此相关。它们是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" 的姓名从 "Donna Smith" 更改为 "Donna Chang" 时,我该如何确保 photos 集合中的文档的一致性?

由于非事务性,我理解一致性将是最终实现的。

一个简单(天真)的实现可能会在更改用户 "AABC" 后触发后台作业,以更新其 user_id = "AABC" 的所有照片。对于单个更新,这将运作良好。但这是一个多用户环境,会有并发地更新。例如,在将照片背景更新为更改 "Donna Smith" 为 "Donna Chang" 的过程中,如果用户 "AABC" 的名称中途被更改回 "Donna Smith",该怎么办?

在线搜索时,我看到了很多关于如何建模去规范化数据的讨论。但是任何关于如何维护的讨论似乎都被轻描淡写地归纳为“您还需要更新所有相关记录”而已。是否有任何 NoSQL 系统可以在此情况下为您完成繁重的工作?有任何框架或实用程序吗?

我阅读了 Thomas Wanschik 的博客文章,讨论了关于“物化视图”和后台更新的这种情况。但是我仍然担心:

  1. 后台作业必须延迟预定的时间大于更新允许的最长时间(如何确定延迟?如果操作需要更长时间怎么办?),以及;
  2. 这是我目前发现的唯一有关实际解决方案的讨论。NoSQL 是一个很重要的事情,为什么我没有看到更多关于此的讨论?我失去了什么?

有什么想法吗?我原以为随着 NoSQL 的流行,这个问题早就被“解决”了。 - Snixtor
1个回答

4
我的早期理解是,当向用户/应用程序传递大量数据时,需要真正分析成本。
在应用程序中返回照片时,更有可能发生什么情况?将照片返回给用户和他们的朋友,还是更改用户的姓名?
由于在应用程序中更改用户姓名的情况较少见,NoSQL的去规范化(Denormalization)声名鹊起的原因是您可以在传统规范化/RDBMS环境中不需要JOIN的情况下向用户提供高速的照片数据。
使用现有的一些工具(因为您写这篇文章已经相当长时间了)可以帮助处理这种情况,但您基本上是正确的,可以安排代码更改来处理这个问题……它会很慢……它会很昂贵……但它会工作……而且您仍然拥有向应用程序传递照片的速度优势,这基本上是您应用程序的主要目的。
这个问题演变成了一部史诗般的小说,SQL Defender站在一边,"乌合之众" NoSQL追随者站在另一边。传统的DBA想到为了速度而牺牲结构就感到不寒而栗,但是想象一下NoSQL是以前的“超级表”概念,我们曾经考虑的是返回什么而不是需要存储什么。基本上……这就是NoSQL概念的产生,并且在大型应用程序和大数据报告中证明非常有帮助。
我知道这是一个老问题,但我仍然希望我的答案可以帮助像我这样的其他人解决NoSQL在这种类型问题中的好处。

1
我的问题不是很旧,还不到2周。@Indy-Jones,你提出了一些好的讨论点,但我以前在不同的地方看过这些点很多次了。我正在寻找的是实现所述模式的模式和/或工具,用于那个“缓慢、昂贵的更新”。我仍然感到惊讶的是,这个非常复杂的工程任务被留给应用程序开发人员。 - Snixtor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接