嵌套括号在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. 我们什么时候使用第一张桌子,什么时候使用第二张桌子

差异是主要的关键。Cassandra主键分为(Partition key,Clustering key)

分区键决定寄存器在环中的位置,集群决定具有相同分区键的寄存器的存储方式,以利用查询中列的磁盘排序。

第一个表

  • Sensor_id是您的分区密钥,因此您知道具有相同Sensor_id的每个寄存器都将转到同一节点
  • 您有两个集群键,collected_at和volts字段,因此具有相同sensor_id的数据将按collected_a特字段升序存储,而具有相同sendor_id、collected_at字段的数据将按照volts字段升序存储

第二表

  • 您将有一个复合分区密钥(sensor_id,collected_at),这样您就知道具有相同sensor_id和collected_at的每个寄存器都将转到同一节点
  • 您的集群密钥是伏特,所以具有相同(sensor_id,collected_at)的数据将按伏特升序存储

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

第一个表仅对sensor_id上的数据进行分区。这意味着每个sensor_id下面的所有数据都存储在同一个数据分区中。sensor_id的散列令牌值还决定了数据分区存储在集群中的哪个节点上。每个分区内的数据按collected_atvolts排序。

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

我们什么时候使用第一张表,什么时候使用第二张表?

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

实际上,对时间戳(第二表)值进行分区通常不是很有用,因为在执行查询之前,必须具有确切的时间戳。通常,当在分区键中使用时间戳组件时,您会看到一种称为"日期桶"的技术,在这种技术中,您会使用精度较低的东西,如月或日。这样,你仍然可以查询整个月/天,或者你的水桶是什么。

最新更新