在Cassandra 2中使用CQL3建模多对多关系

10

如何使用CQL3建模多对多关系是一个经典问题,那么应该采用哪种方式呢?假设现在有两个表:

CREATE TABLE actor (
    id text PRIMARY KEY,
    given text,
    surname text,
)

CREATE TABLE fan (
    id text PRIMARY KEY,
    given text,
    surname text,
)

我希望模拟这样一个事实,即演员可以有多个粉丝,每个粉丝都可以喜欢许多演员。

我首先想到的是使用 集合,像下面这样(对于粉丝也是类似的):

CREATE TABLE actor (
    id text PRIMARY KEY,
    given text,
    surname text,
    fans set<text>
)

<similarly for fan>

但是看起来它们似乎只适用于小集合,并且我没有看到一种方法可以在不完全加载两个集合的情况下检查风扇是否与演员相关。

我发现的第二种选择是制作两个映射表,每个表对应一种关系方向:

CREATE TABLE actor_fan (
    text actor,
    text fan,
    PRIMARY KEY(actor,fan)
);

<similarly for fan_actor>

这会让我能够获取演员的粉丝列表并检查特定人是否是给定演员的粉丝吗? Cassandra有很多文档,但通常与旧版本相关,并且似乎在不同版本之间存在许多差异。

2个回答

8
在Cassandra中正确的方法是将数据分解成两个表。你不用担心需要写两次,因为Cassandra被设计成可以快速处理写入以支持这种模型。
请查看这些数据建模教程,将有助于理解这些内容: 数据建模教程 此外,我还看到你提到了集合。虽然这不是你问题的答案,但你可能想了解一些新功能,例如:http://www.datastax.com/dev/blog/cql-in-2-1

感谢提供链接。Cassandra 的不同版本在功能方面差异很大(Cassandra 1.2 及以上版本看起来就像是一个完全不同的产品),因此很容易找到不完整或过时的文档。 - Marco Righele

2
实现此目标的方法是对数据进行去规范化,创建一个actors_by_fans和一个fans_by_actors。您也可以使用集合,但是这种方式存在已经提到的限制。
希望对你有所帮助,Carlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接