假设我有两个集合,每个集合的值彼此独立,但它们彼此相关。它们是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" 的姓名从 "Donna Smith" 更改为 "Donna Chang" 时,我该如何确保 photos
集合中的文档的一致性?
由于非事务性,我理解一致性将是最终实现的。
一个简单(天真)的实现可能会在更改用户 "AABC" 后触发后台作业,以更新其 user_id = "AABC" 的所有照片。对于单个更新,这将运作良好。但这是一个多用户环境,会有并发地更新。例如,在将照片背景更新为更改 "Donna Smith" 为 "Donna Chang" 的过程中,如果用户 "AABC" 的名称中途被更改回 "Donna Smith",该怎么办?
在线搜索时,我看到了很多关于如何建模去规范化数据的讨论。但是任何关于如何维护的讨论似乎都被轻描淡写地归纳为“您还需要更新所有相关记录”而已。是否有任何 NoSQL 系统可以在此情况下为您完成繁重的工作?有任何框架或实用程序吗?
我阅读了 Thomas Wanschik 的博客文章,讨论了关于“物化视图”和后台更新的这种情况。但是我仍然担心:
- 后台作业必须延迟预定的时间大于更新允许的最长时间(如何确定延迟?如果操作需要更长时间怎么办?),以及;
- 这是我目前发现的唯一有关实际解决方案的讨论。NoSQL 是一个很重要的事情,为什么我没有看到更多关于此的讨论?我失去了什么?