【问题标题】:Select Cassandra row key选择 Cassandra 行键
【发布时间】:2015-04-04 21:55:41
【问题描述】:

在 cassandra 中为列族选择 rowid 时应考虑哪些标准?我想迁移一个不包含任何主键的关系数据库。在那种情况下,最好的 rowid 选择应该是什么?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    如果可能,使用可以从数据集中派生的自然键(例如,电话簿的电话号码,用户表的用户名)。如果那不可能,请使用 UUID。

    【讨论】:

      【解决方案2】:

      在考虑cassandra系统的主键时需要考虑很多事情

      1. 了解primarypartition键的区别

        创建表用户 ( 用户名 varchar 主键, 密码 varchar, );

      在上述情况下,主键和分区键是相同的。

      CREATE TABLE users (
        user_name varchar,
        user_email varchar,
        password varchar,
        PRIMARY KEY (user_name, user_email)
      );
      

      这里的主键是用户名和用户电子邮件,其中用户名是分区键。

      CREATE TABLE users (
        user_name varchar,
        user_email varchar,
        password varchar,
        PRIMARY KEY ((user_name, user_email))
      );
      

      这里主键和分区键都等于user_name,user_email

      1. 仔细定义您的分区键。 cassandra 使用分区键进行查找,因此您必须通过查看选择查询来定义分区键。

      Cassandra 使用前面的示例组织使用分区键进行查找的数据

      对于第一种情况:

      user_name ---> email:password email:data_of_birth 
      
      ABC --> abc@gmail.com:abc123 abc@gmail.com:22/02/1950 abc@yahoo.com:def123...
      

      第二种情况:

      user_name,email ---> password data_of_birth ABC,abc@gmail.com --> abc123 22/02/1950
      
      1. 使包含许多数据的分区键更加复杂,这将确保您有很多行,而不是包含很多列的单行。平衡您可能诱导的行数与每行可能具有的列数可能是有益的。拥有令人难以置信的大量小行可能对读取没有太大帮助

      2. 分区键表示数据如何跨节点分布,因此请考虑是否有热点并决定是否要进一步分解。

      案例 1: 所有名为 ABC 的用户都将在一个节点中

      案例 2: 名为 ABC 的用户可能在也可能不在单个节点中,具体取决于随电子邮件生成的密钥。

      【讨论】:

        【解决方案3】:

        您的分区键应该是您想要存储数据的方式以及您将始终如何查找它。您只能通过分区键检索数据,因此选择您自然会查找的内容很重要(这就是为什么有时数据在 Cassandra 中通过将其存储在多个模拟物化视图的表中来非规范化)。

        如果您有时想检索分区中的所有数据而有时只需要其中的一部分,则集群列键(如果有)最有用。这对于时间序列数据之类的东西非常有用,因为您可以将数据聚集在 timeuuid 上,将其排序存储,然后对数据进行有效的范围查询。

        【讨论】:

          猜你喜欢
          • 2014-05-26
          • 1970-01-01
          • 2018-01-15
          • 2015-06-29
          • 2013-12-31
          • 2013-09-04
          • 2015-09-21
          • 2012-07-28
          • 2012-12-28
          相关资源
          最近更新 更多