我有两张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。我知道这两种方法各有优缺点。我想要最少的口是心非,但我也有同样的重量读/写速度。另外,这两种方法背后是否还有更多的隐性成本?
1条答案
按热度按时间s1ag04yj1#
为此使用集合可能是不切实际的,因为集合的大小有限制(尽管对于只有几个用户的系统来说这不应该是个问题),组中的用户集太大的可能性很高。
值得注意的是,您的解决方案基于
user_group
表不工作,因为它不支持按组查询。您需要维护另一个表来支持此查询(并且始终维护这两个记录):这将允许按组查询。
其他选项:
将辅助索引添加到
user_group
:另一种方法是扩大
user_group
解决方案:如果在group
字段中,您将能够以两种方式执行查找:使用物化视图
也可以使用物化视图而不是
group_user
table。之间的数据user_group
Cassandra将保持这一观点的同步(最终):有了这个,你就必须在
user_group
只有和视图将负责按组进行搜索。正如你所说的,每种方法都有优点和缺点,这里不能详细说明。请检查每个选项的限制文件。