【问题标题】:Modelling Cassandra Many-to-Many Relation for Sensor Data为传感器数据建模 Cassandra 多对多关系
【发布时间】:2015-11-26 18:37:03
【问题描述】:

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

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

我的(非常简化的)概念架构类似于:

我需要运行以下查询:

  1. 单个传感器的历史值
  2. 监控组件上每个属性的最新值

这是我遇到的第二个问题。

当测量到达时,我只知道传感器 ID、时间戳和值。如何建模一个表格,让我可以在 Monitor 上保留每个属性的当前值?

我试过下表:

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)
);

我试图做的是更新订阅该传感器的每个监视器的时间戳/值,但显然以下查询不起作用,因为我没有指定 monitor_idattribute:

UPDATE monitor_subscriptions
SET timestamp = ?, value = ?
WHERE sensor_id = ?;

不过,在我收到新测量值时,我只知道sensor_idtimestampvalue

【问题讨论】:

  • 对于多对多关系,您必须添加一个额外的表,并且必须将两个表都连接到这个新创建的表才能正常工作

标签: database-design cassandra cql


【解决方案1】:

我猜你可能会重新访问你的 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 = 传感器数量)。

【讨论】:

  • 这也是我得出的结论(我已经拥有与您描述的完全一样的 sensor_data 表)。我试图避免的是在客户端连接中查询订阅表,然后查询每个订阅的数据表(执行大量网络 I/O)。
猜你喜欢
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多