我有这两个表:
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。我知道这两种方法各有优缺点。我想要最少的重复性,但是我拥有相等的权重来读写速度。而且,两种方法中的任何一种都有隐藏的成本吗?
答案 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
添加一条记录,该视图将按组进行搜索。
正如您所指出的,每个都有优点和缺点,这里不再赘述。请检查有关每个选项限制的文档。