12

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

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

作为非事务性的,我理解一致性将是最终的。

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

在网上搜索,我看到很多关于如何对非规范化数据建模的讨论。但是任何关于如何维护它的讨论似乎都是微不足道的,因为“你还需要更新所有相关记录”。在这种情况下,是否有任何 NoSQL 系统可以为您完成繁重的工作?任何框架或实用程序?

我已经阅读了Thomas Wanschik关于“物化视图”主题的优秀博客文章以及针对此场景的背景更新。但我担心的是:

  1. 后台作业必须延迟超过允许更新的最长时间的预定量(我如何确定该延迟?如果操作需要更长的时间怎么办?),并且;
  2. 这是我迄今为止找到的关于实际解决方案的唯一讨论。NoSQL 确实很重要,为什么我没有看到更多关于这个的讨论?我错过了什么?
4

1 回答 1

3

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

在您的应用程序中返回您的照片时,更有可能更频繁地发生什么?将照片返回给用户,也许还有他们正在查看它们的朋友……或者改变用户的名字?

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

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

这个问题变成了一部史诗般的小说,一边是 SQL Defenders,另一边是“暴民” NoSQL 追随者。传统 DBA 对牺牲结构以换取速度的想法感到不寒而栗,但将 NoSQL 视为很久以前的旧“超级表”概念,我们过去常常考虑返回的内容与需要存储的内容。本质上……这就是 NoSQL 概念的产生原因,事实证明它在大规模应用程序和大数据报告中非常有帮助。

我知道这是一个老问题,但我仍然希望我的回答能帮助像我这样的其他人在涉及此类问题时揭开 NoSQL 好处的神秘面纱。

于 2016-02-09T13:03:26.447 回答