如何在cassandra中跨多个表保持数据一致性?

Jam*_*Maa 6 data-modeling cql data-consistency cassandra

我无法弄清楚如何跨多个表维护属性更新以确保数据一致性。

例如,假设我有演员和粉丝之间的多对多关系。一个粉丝可以养很多演员,一个演员也有很多粉丝。我做了几个表来支持我的查询

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)
)
Run Code Online (Sandbox Code Playgroud)

假设我是一个粉丝,我在我的设置页面上,我想将 my 更改fan_attr_1为不同的值。

fans表上,我可以很好地更新我的属性,因为应用程序知道我的 fan_id 并且可以键入它。

但是fan_attr_1,如果fans_by_actor不先查询与风扇关联的 actor_id,我就无法更改我的状态。

每当您想要更新fans或 的任何属性时都会出现此问题actors

我试过在网上寻找遇到类似问题的人,但我找不到他们。例如,在 Datastax 的数据建模课程中,他们将示例与演员和视频以多对多的关系使用,其中他们有表格actors_by_videovideos_by_actor. 该课程与我咨询过的其他在线资源一样,讨论了查询后的建模表,但没有深入研究如何维护数据完整性。在actors_by_video表中,如果我想改变一个演员的属性会发生什么?不必遍历每一行actors_by_video来查找包含actor 的分区并更新属性?这听起来非常低效。另一种选择是事先查找视频 ID,但我在其他地方读到在写入之前读取是 Cassandra 中的反模式。

从数据建模的角度或从 CQL 的角度来看,解决这个问题的最佳方法是什么?

编辑: - 固定的句子存根 - 添加了上下文和先前的研究

Cle*_*ath 2

数据建模

Cassandra 不是关系数据库,数据建模需要遵循某些基本规则,在高层次上,我们的数据模型需要遵循以下目标。

1)将数据均匀分布在集群周围

2)最小化读取的分区数量

此外,我们应该选择单个大表,而不是将其分成多个表并在表之间添加关系。在这种方法中会发生记录重复。记录复制并不是一个成本较高的操作,因为它只需要多一点的磁盘空间,而不是 CPU、内存、磁盘 IOP 或网络。

请注意,列键名称和值有大小限制。最大列键(和行键)大小为 64KB。最大列值大小为 2 GB。但由于没有流式传输,并且在请求时会在堆内存中获取整个值,因此将大小限制为仅几 MB。

更多信息:

http://www.datastax.com/dev/blog/basic-rules-of-cassandra-data-modeling

http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/

http://www.ebaytechblog.com/2012/08/14/cassandra-data-modeling-best-practices-part-2/

https://docs.datastax.com/en/cql/3.1/cql/cql_reference/refLimits.html

CQL

可以使用批处理物化视图来维护表之间的一致性。物化视图从 3.0 版本开始可用

请参见

如何保证Cassandra中不同表上的数据一致性?

我的偏好是更改数据模型并针对我们的查询进行相应的设计,如果可能的话将其作为一个大表。

希望能帮助到你!

  • 我在这里仍然没有看到光明,也许一个具体的例子会有所帮助。假设您正在对上述示例进行建模。您将如何构建表来支持查询? (3认同)