我有一些彼此相关的表,它看起来像这样:
organizations:
- id
- name
- ... other fields
users:
- id
- name
- organization_id
- organization_name
- ... other fields
我在organization_name
表中保留users
字段,这样就无需查找组织以获取组织名称
问题是,如果更改了组织名称,则必须更新与组织相关的所有用户以反映新名称。在我的真实场景中,有更多的表格可以存储organization_name
。
问题:目前我只是异步启动更新语句,如果它中途失败,那么我最终会得到不一致的数据
问题:如何处理此类问题是否有最佳做法?
可能的解决方案:
BATCH
语句。但我发现它非常有限,因为默认它只允许50kb的查询大小(在我的情况下,1更新可能导致更新来自两个或三个不同表的8,000个其他实体,在字段值中具有不同的长度 - 因此查询大小相当不可预测)
BATCH
语句来更新100个项目(需要更新的600个项目),并且因“批量大小太大”异常而失败... PS - 我的行不是太宽,最多每个表大约有20列
更新
忘记添加,这是一个需要尽快反映更新的webapp,因此批处理作业将不适用
更新2:
关于读取模式,我当前的示例过于简单,但无论如何我都需要获取用户列表(它可能来自多个组织) - 这可能会使数百个组织的数千名用户返回,这就是我存储的原因organization_name
表格中的users
我的理解是,使用Cassandra数据非规范化是要走的路
答案 0 :(得分:3)
与每个长期运行的更新过程一样,您应该使用书签的概念:
如果发生崩溃,您只需通过阅读书签即可恢复崩溃的位置。
要执行此类任务,您必须已经知道必须更新哪些记录,但我假设您已经了解它们或知道如何检索该信息。
答案 1 :(得分:2)
尝试使用分页。大多数司机都支持它。
1)从users表接收更新结果,每页分页x行。
2)为页面中的每条记录运行异步更新。
3)转到下一页。