我正在使用Cassandra构建一个应用程序作为数据存储,它可以捕获来自大量传感器的数据,并允许不同的监控组件监控这些传感器。
例如,服务器机房可能有温度传感器,10个不同的服务器监控组件可能从该传感器接收值。同样,监控组件将从多个传感器接收数据。
我的(非常简化的)概念架构看起来像:
我需要运行以下查询:
它是我遇到问题的第二个。
当测量到达时,我只知道传感器ID,时间戳和值。如何建模允许我保持监视器上每个属性的当前值的表?
我尝试了下表:
CREATE TABLE monitor_subscriptions (
sensor_id uuid,
monitor_id uuid,
attribute text, # e.g. 'Temperature'
timestamp timestamp,
value double,
PRIMARY KEY (sensor_id, monitor_id, attribute)
);
我尝试做的是更新订阅该传感器的每个显示器的时间戳/值,但显然以下查询不起作用,因为我没有指定{{1 }或monitor_id
:
attribute
虽然我收到了新的衡量标准,但我只知道UPDATE monitor_subscriptions
SET timestamp = ?, value = ?
WHERE sensor_id = ?;
,sensor_id
和timestamp
。
答案 0 :(得分:3)
我猜您可能会重新访问您的monitor_subscriptions表:
例如:
create table sensor_data (
sensor_id uuid,
timestamp timestamp,
value double,
primary key (sensor_id, timestamp)
) with clustering order by (timestamp desc);
此表用于存储原始传感器读数,您可以有效地查询特定传感器的最新数据。如果您计划插入大量传感器读数(例如每秒),您可能希望将当前日期添加到群集键以便稍后处理可能的压缩问题。
监视器表可能如下所示:
create table monitor_subscriptions (
monitor_id uuid,
sensor_id uuid,
attribute text,
primary key (monitor_id, attribute, sensor_id)
)
此表可用于查询监视器的所有属性或这些属性的所有传感器。因此,要查询每个属性的最新值,您: