nosql 数据更新和一致性问题

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 and users . There is a one-to-many relationship between users and photos.

如何保证 consistency with data in the photos 当 user “AABC” changes name from “Donna Smith” to “Donna Chang”?

可行方案1. async tasks to update photos(user_name)
this will be only eventually consistency

  1. 请问还有其他更好的方法吗?
  2. 如何保证应用层开发的时候更新 user “AABC” changes name from “Donna Smith” to “Donna Chang”? 不会忘记更新photos(user_name), 因为这里面没有强约束。比如如果还有一个videos或者feeds table如果都包含 use_id, user_name. 感觉如果业务不熟很容易忘记更新全部 photos, videos, feeds的 user_name, 从而造成数据的不一致
  3. 如何保证跨组的时候不会造成数据并不一致. 比如A组做user service, B组做video service (user_id, user_name), C组做photo service (user_id, user_name). 那现在如果A组的服务给一些users改名, 如何通知B, C 组也update user_name. 极端情况下, A根本就不知道B, 和 C做了denormalisation (user_id, user_name 加到 video 或者 photo db里). 请问跨组情况如何解决 数据一致性问题

谢谢

我们先给我们讲的一致性做一个区分。上课时候将的一致性指的是数据库本身的一致性,跟应用层向数据库发什么信息无关,比如说把用户的名字写到了 Photos 表的多个行中就是应用层做的事,数据库是不知道也不需要知道这些名字之间的联系的。

你在这里提到的一致性指的是应用的一致性,你希望这个应用中,一旦用户名更新之后,在界面上可以实时反映出来。

如果这是硬性要求的话,我们只能在读取时,实时读取最新的 User Table 中的数据,没有别的办法。
但是如果我们可以允许用户在体验上在 Photo 表上显示当时的用户名而不需要实时更新的话,我们才有意义 denormalize.
Async update photos DB 不是太合理,在用户改名之后更新这个用户发过的所有照片有点太 Expensive,反而不如就实时读取来得合理直接。

1 个赞