我正在设计一个Cassandra的密钥空间,它将保存有关用户组的信息 . 一些信息:
-
只能通过请求某个组中包含的用户以及更新组中包含的用户来访问此数据 .
-
读取将比写入更频繁 .
-
每个组最多可包含20,000个用户ID
我有两个设计,我正在考虑这个 .
-
每组多行:该表有两列TEXT类型,并在主键(GroupID,UserID)上键入,读取组中的用户将由
select * from table where GroupID = {GroupID}
完成,并返回与用户中的用户一样多的行组 . -
使用Cassandra集合集合每行一行:该表将有两列,第一个(GroupID)类型为TEXT,第二个(UserIDs)类型为SET [TEXT],并且键入Pimary Key(GroupID) . 读取gorup中的用户将由
select * from table where GroupID = {GroupID}
完成,并返回包含在其UserIDs列集中的用户ID集的单行 .
我找不到很多关于这个场景的更好设计的文档 . 任何一种情况的想法或利弊?
2 回答
对于一组20k用户ID,我绝对不惜一切代价避免使用集合 . 集合是一个方便的功能,但它们并不像使用传统的CQL数据模型那样具有
PRIMARY KEY(GroupID,UserID)
,其中所有用户都在单个分区中进行排序 . 这将很容易理解,易于查询(可以SELECT
单个分区和页面通过所有组成员,或者您可以SELECT ... WHERE GroupID=X and UserID=Y
来确定用户是否在组中),并且非常高效 .来自Datastax:
When to use collections
Using collections
在您的情况下,使用集合看起来不会达到允许的限制 . 每个项目
UserID
可能<= 64K,并且您有<= 20K个条目,小于最大64K .但是,正如杰夫所说,使用复合键,按
GroupID
(您的查询列)进行分区并按UserID
(您从查询中收到的值)进行聚类可能会更好 .