在 Cassandra 中管理多对多关系

Manage many to many relationship in Cassandra

我有这两个表:

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)
);

A user can be in multiple groups, a group can obviously have multiple users.

所以我有两种维护多对多关系的方法(取自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。我知道这两种方法都有自己的优点和缺点。我想要最少的口是心非,但我对 read/write 速度也有同等的重视。另外,这两种方法背后是否还有更多隐藏成本?

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

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

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 table。 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 添加一条记录,视图将按组进行搜索。

如您所述,每种方法都各有利弊,此处无法详述。请查看有关每个选项限制的文档。