Cassandra 模式使用集集合或多行

Cassandra schema use set collection or multiple rows

我正在 Cassandra 中设计一个键空间,它将保存有关用户组的信息。关于它的一些信息:

我正在考虑两种设计。

  1. 每组多行:table 将有两列 TEXT 类型并以主键(GroupID、UserID)为键,读取组中的用户将由 select * from table where GroupID = {GroupID} 完成并会 return 与组中的用户一样多的行。
  2. 使用 Cassandra Set Collection 每组一行:table 将有两列,第一列 (GroupID) 类型为 TEXT,第二列 (UserIDs) 类型为 SET[TEXT] 并键入主键 (GroupID)。读取组中的用户将由 select * from table where GroupID = {GroupID} 完成,并且会 return 一行,其 UserIDs 列集中包含一组用户 ID。

我找不到很多关于这种情况下更好设计的文档。对这两种情况有什么想法或利弊吗?

对于一组 20k 用户 ID,我绝对会不惜一切代价避免使用集合。集合是一个方便的功能,但它们的性能远不如使用传统的 CQL 数据模型,在传统的 CQL 数据模型中,所有用户都在一个分区中排序 PRIMARY KEY(GroupID,UserID) 。这将既易于推理,也易于查询(可以 SELECT 单个分区和页面遍历所有组成员,或者您可以 SELECT ... WHERE GroupID=X and UserID=Y 确定用户是否在组中),并且非常高效。

来自 Datastax:

When to use collections

Using collections

在你的情况下,使用集合不会达到允许的限制。每个项目 UserID 可能 <=64K,并且您有 <= 20K 个条目,小于最大值 64K。

但是,正如 Jeff 所说,使用复合键、按 GroupID(您的查询列)分区并按 UserID(您从中接收的值)进行聚类,您的性能可能会好得多您的查询)。