【发布时间】:2017-05-15 06:41:29
【问题描述】:
我无法弄清楚如何跨多个表维护属性更新以确保数据一致性。
例如,假设我在演员和粉丝之间有多对多的关系。一个粉丝可以支持很多演员,一个演员有很多粉丝。我制作了几张表格来支持我的查询
CREATE TABLE fans (
fan_id uuid,
fan_attr_1 int,
fan_attr_2 int
PRIMARY KEY ((fan_id))
)
CREATE TABLE actors (
actor_id uuid,
actor_attr_1 int,
actor_attr_2 int
PRIMARY KEY ((actor_id))
)
CREATE TABLE actors_by_fan (
fan_id uuid,
actor_id uuid,
actor_attr_1 int,
actor_attr_2 int
PRIMARY KEY (fan_id, actor_id)
)
CREATE TABLE fans_by_actor (
actor_id uuid,
fan_id uuid,
fan_attr_1 int,
fan_attr_2 int
PRIMARY KEY (actor_id, fan_id)
)
假设我是一个粉丝,我在我的设置页面上,我想将我的 fan_attr_1 更改为不同的值。
在fans 表上,我可以很好地更新我的属性,因为应用程序知道我的fan_id 并且可以键入它。
但是,如果不先查询与粉丝关联的 actor_id,我就无法更改 fans_by_actor 上的 fan_attr_1。
只要您想更新fans 或actors 的任何属性,就会出现此问题。
我尝试在网上寻找遇到类似问题的人,但我找不到他们。例如,在 Datastax 的数据建模课程中,他们使用具有多对多关系的演员和视频的示例,其中他们有表格 actors_by_video 和 videos_by_actor。与我咨询过的其他在线资源一样,该课程讨论了查询后的建模表,但没有深入研究如何维护数据完整性。在actors_by_video 表中,如果我想更改演员的属性会发生什么?不必遍历actors_by_video 的每一行来查找包含actor 的分区并更新属性吗?这听起来非常低效。另一种选择是事先查找视频 ID,但我在其他地方读到,在写入之前读取是 Cassandra 中的反模式。
从数据建模的角度或从 CQL 的角度来说,解决此问题的最佳方法是什么?
编辑: - 固定句子存根 - 增加了背景和先前的研究
【问题讨论】:
-
您要进行哪些查询?您围绕查询建模数据,而不是围绕它们的关系(它不是关系数据库)。可能想查看academy.datastax.com/resources/ds220-data-modeling 了解有关 cassandra 数据建模的一些教程
-
是的,我在问这里之前实际上参加了课程,但课程本身似乎并没有回答问题。在他们的 KillrVideo 示例中,他们同时使用了
videos_by_actor和actors_by_videos,这是与上述类似的范例。但是,他们从未讨论过如果演员属性或视频属性发生变化应该如何维护这些表 -
这真是一个好问题。所有关于这些 nosql 数据存储的数据建模教程似乎都忽略了如果您在不同的表中有重复数据时如何维护数据完整性的主题:cassandra.apache.org/doc/latest/cassandra/data_modeling/…
标签: cassandra data-modeling cql data-consistency