嵌套括号在PRIMARY KEY定义中表示什么

时间:2016-03-29 07:48:18

标签: cassandra primary-key

Cassandra中这两种表有什么区别?

第一:

    CREATE TABLE data (
    sensor_id int,
    collected_at timestamp,
    volts float,
    volts2 float,
    PRIMARY KEY (sensor_id, collected_at,volts )
)

和第二:

    CREATE TABLE data (
    sensor_id int,
    collected_at timestamp,
    volts float,
    volts2 float,
    PRIMARY KEY ((sensor_id, collected_at),volts )
)

我的问题:

  1. 这两张桌子有什么区别?
  2. 我们何时使用第一张表,何时使用第二张表?

2 个答案:

答案 0 :(得分:6)

区别在于主键。 Cassandra主键分为(分区键,聚类键)

分区键决定寄存器在环内的位置,而Clustering确定如何存储具有相同分区键的寄存器,以利用查询中列的磁盘排序。

第一张表

  • Sensor_id是您的分区键,因此您知道具有相同 sensor_id 的每个寄存器将转到同一节点。
  • 您有两个聚类键,gather_at和volts字段,因此具有相同sensor_id的数据将按照collect_at字段的升序排序,而具有相同sendor_id的数据,gather_at字段将按伏特字段按升序排序。

第二张表

  • 您将拥有一个复合分区键(sensor_id,gather_at),因此您知道具有相同 sensor_id和gather_at 的每个寄存器将转到同一节点。
  • 您的群集密钥为伏特,因此具有相同数据(sensor_id,gather_at)的数据将按伏特按升序排序。

想象一下,您为同一个sensor_id拥有数十亿个寄存器。使用第一种方法,您将它存储在同一节点中,因此可能会耗尽空间。如果您使用第二种方法,则必须使用精确的sensor_id和gather_at时间戳进行查询,因此可能没有意义。因此,在Cassandra建模中,您必须知道在创建模型之前要执行哪些查询。

答案 1 :(得分:3)

第一个表仅对sensor_id上的数据进行分区。这意味着,每个sensor_id下面的所有数据都存储在同一个数据分区中。哈希标记值sensor_id还确定数据分区中存储的群集中的哪个节点。每个分区中的数据按collected_atvolts排序。

第二个表使用sensor_idcollected_at上的复合键来确定数据分区。每个分区中的数据按volts排序。

  

当我们使用第一张桌子和使用第二张桌子的时候?

由于您必须在查询中传递所有分区键,第一个表提供了更多查询灵活性。也就是说,您可以决定仅在sensor_id上进行查询,然后您可以选择是否还要collected_at然后volts进行查询。在第二个表格中,您sensor_idcollected_at进行查询。因此,您的查询灵活性较低,但您可以从第二个模型中获得更好的数据分发

实际上,对时间戳(第二个表)值进行分区通常不是很有用,因为在执行查询之前必须有准确的时间戳。通常,您在分区键中使用时间戳组件时看到的是一种称为“日期分段”的技术,在该技术中,您将使用精度较低的内容(如月或日)。这样,您仍然可以查询整个月/日或任何存储桶。