假设我有两个集合,每个集合的值彼此独立,但每个集合彼此相关。它们是photos
和users
。用户和照片之间存在一对多的关系。
非规范化数据的一个例子:
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关于"物化视图"的主题确切地说这个场景的背景更新。但我还是担心:
答案 0 :(得分:1)
我对NoSQL的早期理解是,在向用户/应用程序提供大量数据时,会对成本进行真正的分析。
在应用程序中回传照片时,更有可能发生更频繁的事情?将照片交付给用户,也许他们的朋友正在查看他们......或者更改用户的名字?
由于用户名称的更改是应用程序中不太常见的实例,NoSQL的Denormalization声名鹊起的是,您可以将高速的照片数据传回给用户而无需传统规范化/中的JOIN费用RDBMS环境。
现在使用一些现有的工具(因为你很久以前写过这篇文章)可以帮助解决这类问题,但你本质上是正确的,因为你可以安排代码更改来处理这个......它会很慢......它会很昂贵......但它会起作用......你仍然可以享受将照片传送到应用程序的速度,这实际上是你应用程序的主要目的
这个问题成长为一部史诗小说,一方面有SQL Defenders,另一方面有“乌合之众”NoSQL粉丝。传统的DBA对于速度结构的妥协感到不寒而栗,但将NoSQL视为很久以前的旧“超级表”概念,我们过去常常会考虑返回的内容与需要存储的内容。基本上......这就是产生NoSQL概念的原因,它在大规模应用和大数据报告中非常有用。
我知道这是一个老问题,但我仍然希望我的回答可以帮助其他人,比如我自己在解决这类问题时揭开NoSQL的好处。