管理Cassandra的多对多关系

ogq8wdun  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(297)

我有两张table:

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

一个用户可以在多个组中,一个组显然可以有多个用户。
所以我有两种方法来维持多对多的关系(从这里开始),一种是:

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

我用的是Cassandra3.9.0。我知道这两种方法各有优缺点。我想要最少的口是心非,但我也有同样的重量读/写速度。另外,这两种方法背后是否还有更多的隐性成本?

s1ag04yj

s1ag04yj1#

为此使用集合可能是不切实际的,因为集合的大小有限制(尽管对于只有几个用户的系统来说这不应该是个问题),组中的用户集太大的可能性很高。
值得注意的是,您的解决方案基于 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 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 只有和视图将负责按组进行搜索。
正如你所说的,每种方法都有优点和缺点,这里不能详细说明。请检查每个选项的限制文件。

相关问题