Sni*_*tor 8 eventual-consistency nosql denormalized
假设我有两个集合,每个集合的值彼此独立,但每个集合彼此相关.他们是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
}
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关于"物化视图"主题的精彩博客文章以及这个场景的背景更新.但我担心:
我对 NoSQL 的早期理解是,在将大量数据传递回用户/应用程序时,需要进行真正的成本分析。
当您在应用程序中传回照片时,哪些情况更有可能发生得更频繁?将照片传送回用户,或许还有正在查看照片的朋友……或者更改用户的姓名?
由于更改用户名在应用程序中不太常见,NoSQL 的非规范化之所以出名,是因为您可以将高速照片数据块传送回用户,而无需在传统规范化/RDBMS 环境中进行 JOIN。
使用现在的一些工具(因为你很久以前写过这篇文章)可以帮助解决这样的情况,但你基本上是正确的,因为你可以安排代码更改来处理这个......它将是慢...它会很昂贵...但它会起作用...并且您仍然可以享受将照片传送到应用程序的速度的好处,这本质上是您的应用程序的主要目的。
这个问题发展成为一部史诗小说,其中一边是 SQL 捍卫者,一边是“乌合之众”NoSQL 追随者。传统 DBA 对为了速度而牺牲结构的想法感到不寒而栗,但将 NoSQL 视为很久以前的旧“超级表”概念,我们过去常常根据返回的内容和需要存储的内容来思考。本质上...这就是 NoSQL 概念的产生,并且事实证明它对于大规模应用程序和大数据报告非常有帮助。
我知道这是一个老问题,但我仍然希望我的回答可以帮助其他人(例如我自己)在涉及此类问题时揭开 NoSQL 优势的神秘面纱。