Cassandra中一个用例的数据模型设计方法

Cassandra中一个用例的数据模型设计方法,cassandra,cassandra-3.0,Cassandra,Cassandra 3.0,我需要以下用例的最佳方法 我有'Device'表,只有一个分区Id:'Device',我有另一个表'DeviceStatistics'分区Id:'deviceId',因此此表的分区数与设备数相同,这意味着每个设备每分钟都会收集一次统计数据 CREATE TABLE device( "partitionId" text,"name" text,"deviceId" text, ..., primary key ("partitionId","name","deviceId")); 其中pa

我需要以下用例的最佳方法

我有'Device'表,只有一个分区Id:'Device',我有另一个表'DeviceStatistics'分区Id:'deviceId',因此此表的分区数与设备数相同,这意味着每个设备每分钟都会收集一次统计数据

CREATE TABLE device(
   "partitionId" text,"name" text,"deviceId" text, ..., primary key ("partitionId","name","deviceId"));
其中partitionId-它是一个常量“设备”

CREATE TABLE deviceStatistics (    
"deviceId" text,     
"timestamp" timestamp, ...,
primary key ("deviceId","timestamp")) with clustering order by ("timestamp" DESC);
其中'deviceId'-是分区键,每个分区下都有时间戳条目列表

在这之前一切都很好,因为我只需要以下问题

1) select * from device where partitionId = 'device'
   - which list all the devices available. 
2) select * from deviceStatistics where deviceId = 'deviceId_1'
   - which list all the device statistics for a deviceId
3) select * from deviceStatistics where deviceId = 'deviceId_1' LIMIT 1
   - which gets the most recent statistics for a deviceId 
现在我需要以下用例的解决方案

我需要收集群集级别的统计信息,这意味着我需要收集时间戳的所有设备统计信息

i、 e如果4个设备的deviceStatistics可用于时间戳,那么我需要收集时间戳和插件设备组级别的所有四个统计信息

这意味着my DeviceGroupstatistics是时间戳的所有设备统计信息的聚合

现在的问题是,因为我有'deviceId'作为deviceStatistics表的分区ID,所以我需要执行这个查询select*from deviceStatistics,其中deviceId='deviceId'限制1用于所有deviceId。 假设我有1000台设备,那么我需要每分钟为所有1000台设备触发这个查询


有更好的设计吗

我建议使用单独的表,其中时间戳是分区键,设备ID是集群键。时间戳的粒度可能取决于您的应用程序-例如,将秒数舍入到分钟,或者类似的东西


您可以实现存储应用程序中的数据(首选),也可以使用物化视图,但它们是实验性的,并不总是推荐使用。

Alex Ott的建议是一种良好的做法:在另一个表中复制数据,并使用时间戳桶日、时、分、秒,具体取决于作为分区键的输入速度,和deviceid作为第一个集群列,具体取决于您的查询

差不多

PRIMARY KEY (bucket, device_id, timestamp ... etc)
选择合适的存储桶大小很重要:根据几篇文章,cassandra中的分区不应该超过100MB左右

如果您每分钟收集一次统计数据,则1000台设备和100字节数据记录的日存储桶将导致 1440 24x60 x设备的nbr 1000 x记录大小100分区大小 =>每个分区144000000字节 这听起来不错,但是你必须用你的数据进行估计和测量,这是一个粗略的计算

如果您必须查询七天,您将不得不在查询中添加IN子句,有限数量的条款10被视为一个批次,或者执行多个查询,但它们会很快…:

最好的


Alain

谢谢你的建议,但问题是“我根据我的查询设计了表”如果我将时间戳保留为分区键,那么分区会太多,并且此查询也会受到影响:选择*from deviceStatistics,其中deviceId='deviceId_1'和timestamp from somevalue to timestamp to somevalue当前我我正在寻找查询框devicegroupstatistics,当设备数量增加时,它对我来说变得越来越复杂。我需要收集每个deviceId在最后一分钟的统计信息,这会增加查询量,但当前的表设计满足此查询:选择*from deviceStatistics,其中deviceId='deviceId_1'和timestamp from somevalue to timestamp to somevalue我相信上面的解决方案是构建第三个以timestamp作为分区的表键和设备ID作为群集列。写入表deviceStatistics_by_timestamp和deviceStatistics_by_deviceId。根据分区键是什么来读取相应的表。@dilsingi-是的,你是正确的-这是我的建议-要么显式编写,要么创建物化view@AlexOtt谢谢你的解决方案。这真是明智的谢谢你的解释