【问题标题】:How to maintain denormalized consistency in NoSQL?如何在 NoSQL 中保持非规范化的一致性?
【发布时间】:2016-05-05 04:55:30
【问题描述】:

假设我有两个集合,每个集合的值彼此独立,但每个集合彼此相关。它们是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's excellent blog articles 关于“物化视图”的主题以及针对此场景的背景更新。但我很担心:

  1. 后台作业必须延迟预先确定的数量 大于允许更新的最长时间(我该如何 确定延迟?如果手术需要更长的时间怎么办?),以及;
  2. 这是我唯一讨论的一个实用解决方案。 NoSQL 确实很重要,为什么我没有看到更多关于此的讨论?我错过了什么?

【问题讨论】:

  • 有什么想法吗?我原以为随着 NoSQL 的流行,这将是一个“已解决”的问题。

标签: eventual-consistency denormalized nosql


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我的问题并不老,不到 2 周。 @Indy-Jones,您提出了一些很好的 讨论 点,但我以前在不同的地方多次看到这些点。我正在寻找的是用于为“缓慢、昂贵的更新”实现所述模式的模式和/或工具。我仍然对这项重要的工程任务留给应用程序开发人员感到惊讶。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2015-01-28
  • 2015-09-09
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多