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 )
)
我的问题:
答案 0 :(得分:6)
区别在于主键。 Cassandra主键分为(分区键,聚类键)。
分区键决定寄存器在环内的位置,而Clustering确定如何存储具有相同分区键的寄存器,以利用查询中列的磁盘排序。
第一张表:
第二张表:
想象一下,您为同一个sensor_id拥有数十亿个寄存器。使用第一种方法,您将它存储在同一节点中,因此可能会耗尽空间。如果您使用第二种方法,则必须使用精确的sensor_id和gather_at时间戳进行查询,因此可能没有意义。因此,在Cassandra建模中,您必须知道在创建模型之前要执行哪些查询。
答案 1 :(得分:3)
第一个表仅对sensor_id
上的数据进行分区。这意味着,每个sensor_id
下面的所有数据都存储在同一个数据分区中。哈希标记值sensor_id
还确定数据分区中存储的群集中的哪个节点。每个分区中的数据按collected_at
和volts
排序。
第二个表使用sensor_id
和collected_at
上的复合键来确定数据分区。每个分区中的数据按volts
排序。
当我们使用第一张桌子和使用第二张桌子的时候?
由于您必须在查询中传递所有分区键,第一个表提供了更多查询灵活性。也就是说,您可以决定仅在sensor_id
上进行查询,然后您可以选择是否还要collected_at
然后volts
进行查询。在第二个表格中,您有来sensor_id
和collected_at
进行查询。因此,您的查询灵活性较低,但您可以从第二个模型中获得更好的数据分发。
实际上,对时间戳(第二个表)值进行分区通常不是很有用,因为在执行查询之前必须有准确的时间戳。通常,您在分区键中使用时间戳组件时看到的是一种称为“日期分段”的技术,在该技术中,您将使用精度较低的内容(如月或日)。这样,您仍然可以查询整个月/日或任何存储桶。