在 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
添加一条记录,视图将按组进行搜索。
如您所述,每种方法都各有利弊,此处无法详述。请查看有关每个选项限制的文档。
我有这两个表:
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
添加一条记录,视图将按组进行搜索。
如您所述,每种方法都各有利弊,此处无法详述。请查看有关每个选项限制的文档。