Cassandra数据建模-确定最佳行键

Cassandra数据建模-确定最佳行键,cassandra,Cassandra,我有一个平台,在这个平台上,各种应用程序都会放置注释,注释由note\u id标识,应用程序由app\u key标识,note\u id和app\u key都是唯一的,我的所有查询仅限于单个应用程序密钥,我不需要跨多个应用程序查询注释 现在我必须选择一个主键 如果我只选择app\u key作为分区键和note\u id作为集群键,则会出现宽行。也就是说,单个应用程序的所有注释将在单个分区中根据app\u key进行分组 所以: 查找应用程序的所有注释将是有效的(单分区搜索) 查找一个应用程序的注

我有一个平台,在这个平台上,各种应用程序都会放置注释,注释由
note\u id
标识,应用程序由
app\u key
标识,
note\u id
app\u key
都是唯一的,我的所有查询仅限于单个应用程序密钥,我不需要跨多个应用程序查询注释

现在我必须选择一个主键

如果我只选择
app\u key
作为分区键
note\u id
作为集群键,则会出现宽行。也就是说,单个应用程序的所有注释将在单个分区中根据
app\u key
进行分组

所以:

  • 查找
    应用程序的所有
    注释
    将是有效的(单分区搜索)
  • 查找一个
    应用程序的
    注释
    将是有效的
  • 删除
    应用程序的所有
    注释将是有效的
  • 删除一个
    应用程序的
    注释
    是有效的
  • 但是,不能保证一行的宽度,即单个
    应用程序可以拥有的
    注释的数量没有限制。数据分布将不均匀。
    应用程序
    的所有
    注释
    都将位于一个分区,因此具有大量
    注释的
    应用程序
    将创建一个巨大分区,从而产生热点

    现在让我们检查选项B,分区键将同时是
    app\u键
    note\u键

    在这种情况下,
    应用程序
    的分区计数将取决于它将具有的
    注释的数量

  • 查找
    应用程序的所有
    注释
    (不可能)

  • 查找一个
    应用程序的
    注释
    (如果快速查找分区,效率会很高)

  • 删除
    应用程序的所有
    注释
    (不可能)

  • 删除单个
    注释
    很快(假设与上述相同)


  • 所以我的问题是:

    • 这里的正确余额是多少
    • 我遗漏了什么概念吗
    • 热点真的重要吗
    • 在第二个选项中,整个查询是不可能的,是否有其他方法可以对此建模

      • 我的建议是,您可以根据吞吐量将分区划分为基于时间的桶(例如:每日/每周/每月/每年),这样您就不会受到宽行分区的影响

        例如,在每日分区的情况下,您的分区密钥将是(应用程序密钥,insert_day)…此处insert_day是日期,例如8-8-2018-00:00:00:000

        现在,当要按应用程序键读取所有注释时,您需要从当前日期迭代到不再查找数据的日期。。删除也是如此。。选择bucket以减少迭代次数


        注释id(集群键)您可以采用时间uuid类型(将从插入日期生成)…现在是按注释id和appkey进行选择。。您可以从节点id值计算所需的插入日期(即,note id->insert date->insert day)

        请注意,对于复合分区键(选项B),您必须限制构成分区键的所有列的值(包括
        app_key
        note_id
        )。如果你需要查找某个应用程序的所有注释,那么查询怎么可能?好的,我没有注意到,编辑如果查找单个应用程序的所有注释是你的要求之一,那么我发现选项B根本无效。对于选项A,我发现您需要使用真实数据运行性能测试,以查看可能形成的热点的严重性,以及您的解决方案需要什么硬件规格(即机器数量和机器规格)。这可能是一种方法,而我仍在尝试解决此问题,您认为二级索引或物化视图是否可以启用选项B中的其他查询?由于性能问题,我们最好避免二级索引,尽管在某些特定情况下它可以工作,但不确定在这种情况下您将如何计划使用SI。就MV而言,它是否已准备好生产是一个关键讨论,