【问题标题】:Cassandra schema use set collection or multiple rowsCassandra 架构使用集合集合或多行
【发布时间】:2016-08-13 09:51:41
【问题描述】:

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

  • 只有通过请求特定组中包含哪些用户并更新组中包含的用户才能访问此数据。
  • 读取将比写入频繁得多。
  • 每个组最多可包含 20,000 个用户 ID

为此,我正在考虑两种设计。

  1. 每组多行:该表将有两列 TEXT 类型,并以主键(GroupID,UserID)为键,读取组中的用户将由 select * from table where GroupID = {GroupID} 完成,并将返回与那里一样多的行是组中的用户。
  2. 使用 Cassandra 集合集合的每组一行:该表将有两列,第一列 (GroupID) 为 TEXT 类型,第二列 (UserID) 为 SET[TEXT] 类型,并以 Pimary Key (GroupID) 为键。读取群组中的用户将由 select * from table where GroupID = {GroupID} 完成,并将返回一行,其中包含在其 UserIDs 列集中的一组用户 ID。

我找不到很多关于这种场景的更好设计的文档。对这两种情况有什么想法或优缺点?

【问题讨论】:

    标签: collections cassandra schema cql


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      来自 Datastax:

      When to use collections

      Using collections

      在您的情况下,使用集合不会达到允许的限制。每个项目UserID 可能

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 2014-10-16
        • 2015-10-20
        • 2019-07-28
        • 2019-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多