为传感器数据建模Cassandra多对多关系

时间:2015-11-25 21:51:50

标签: database-design cassandra cql

我正在使用Cassandra构建一个应用程序作为数据存储,它可以捕获来自大量传感器的数据,并允许不同的监控组件监控这些传感器。

例如,服务器机房可能有温度传感器,10个不同的服务器监控组件可能从该传感器接收值。同样,监控组件将从多个传感器接收数据。

我的(非常简化的)概念架构看起来像:

ERD

我需要运行以下查询:

  1. 单个传感器的历史值
  2. 监视组件上每个属性的最新值
  3. 它是我遇到问题的第二个。

    当测量到达时,我只知道传感器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_idtimestamp

1 个答案:

答案 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)
)

此表可用于查询监视器的所有属性或这些属性的所有传感器。因此,要查询每个属性的最新值,您:

  1. 查询属性 - >传感器映射的monitor_subscriptions(最佳情况:1个磁盘读取)
  2. 查询每个传感器的sensor_data(最佳情况:N个磁盘读取,其中N =传感器数量)。