【问题标题】:Manage many to many relationship in Cassandra在 Cassandra 中管理多对多关系
【发布时间】:2018-11-05 15:17:58
【问题描述】:

我有这两张表:

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。我知道这两种方法都有自己的优点和缺点。我想要最少的重复性,但我对读/写速度也有同样的重视。另外,这两种方法背后是否还有更多隐藏成本?

【问题讨论】:

  • 您有查询给定组中所有用户的用例吗?
  • 嗯,是的。

标签: cassandra cql cassandra-3.0


【解决方案1】:

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

还值得注意的是,您基于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,视图将按组处理搜索。

正如您所指出的,每个都有优点和缺点,这里无法详细说明。请查看有关每个选项限制的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多