Cassandra 模式使用集集合或多行
Cassandra schema use set collection or multiple rows
我正在 Cassandra 中设计一个键空间,它将保存有关用户组的信息。关于它的一些信息:
- 只能通过请求某个组中包含哪些用户并更新组中包含的用户来访问此数据。
- 读取将比写入更频繁。
- 每个组最多可包含 20,000 个用户 ID
我正在考虑两种设计。
- 每组多行:table 将有两列 TEXT 类型并以主键(GroupID、UserID)为键,读取组中的用户将由
select * from table where GroupID = {GroupID}
完成并会 return 与组中的用户一样多的行。
- 使用 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:
在你的情况下,使用集合不会达到允许的限制。每个项目 UserID
可能 <=64K,并且您有 <= 20K 个条目,小于最大值 64K。
但是,正如 Jeff 所说,使用复合键、按 GroupID
(您的查询列)分区并按 UserID
(您从中接收的值)进行聚类,您的性能可能会好得多您的查询)。
我正在 Cassandra 中设计一个键空间,它将保存有关用户组的信息。关于它的一些信息:
- 只能通过请求某个组中包含哪些用户并更新组中包含的用户来访问此数据。
- 读取将比写入更频繁。
- 每个组最多可包含 20,000 个用户 ID
我正在考虑两种设计。
- 每组多行:table 将有两列 TEXT 类型并以主键(GroupID、UserID)为键,读取组中的用户将由
select * from table where GroupID = {GroupID}
完成并会 return 与组中的用户一样多的行。 - 使用 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:
在你的情况下,使用集合不会达到允许的限制。每个项目 UserID
可能 <=64K,并且您有 <= 20K 个条目,小于最大值 64K。
但是,正如 Jeff 所说,使用复合键、按 GroupID
(您的查询列)分区并按 UserID
(您从中接收的值)进行聚类,您的性能可能会好得多您的查询)。