在卡桑德拉管理多对多关系

时间:2018-11-05 05:42:06

标签: cassandra cql cassandra-3.0

我有这两个表:

create table users (
    id UUID,
    email ascii,
    created_at timeuuid,
    primary key(id, email)
);
create table groups (
    id UUID,
    name ascii,
    created_at timeuuid,
    primary key(id, name)
);
  

一个用户可以在多个组中,一个组显然可以有多个用户。

因此,我有两种方法来保持多对多关系(取自here),一种是:

CREATE TABLE user_group (
  user UUID,
  group UUID,
  PRIMARY KEY (user, group)
)

另一个是(使用集):

CREATE TABLE user_jn_group (
  user UUID PRIMARY KEY,
  groups set<UUID>
)
CREATE TABLE group_jn_user (
  group UUID PRIMARY KEY,
  users set<UUID>
)

我正在使用Cassandra 3.9.0。我知道这两种方法各有优缺点。我想要最少的重复性,但是我拥有相等的权重来读写速度。而且,两种方法中的任何一种都有隐藏的成本吗?

1 个答案:

答案 0 :(得分:2)

为此使用集合可能是不切实际的,因为集合的大小受到限制(尽管对于只有几个用户的系统而言,这不应该是一个问题),但一个组中的用户集也很可能会太大大。

还值得注意的是,基于user_group表的解决方案不起作用,因为它不支持按组查询。您需要维护 另一个 表以支持该查询(并始终维护两条记录):

CREATE TABLE group_user (
  user UUID,
  group UUID,
  PRIMARY KEY (group, user)
)

这将允许按组查询。


其他选项:

user_group 添加二级索引:
另一种方法是扩展user_group解决方案:如果group字段上有二级索引,则可以通过两种方式执行查找:

CREATE INDEX ON user_group (group);

使用实例化视图
还可以使用实例化视图代替group_user表。 user_group与该视图之间的数据将由cassandra保持同步(最终):

CREATE MATERIALIZED VIEW group_user
AS SELECT group, user
FROM user_group
WHERE user IS NOT NULL AND group IS NOT NULL
PRIMARY KEY (group, user);

有了这个,您只需要向user_group添加一条记录,该视图将按组进行搜索。

正如您所指出的,每个都有优点和缺点,这里不再赘述。请检查有关每个选项限制的文档。