Postgresql 使用用户定义的事件将实时传感器数据记录到RDBMS中

Postgresql 使用用户定义的事件将实时传感器数据记录到RDBMS中,postgresql,rdbms,sensors,Postgresql,Rdbms,Sensors,我有一个由两个主要组件组成的系统,传感器和触发器 系统负责记录传感器发送的信息,并向用户报告某些触发器激活或未激活的时间 有关传感器的一些信息: 所有传感器记录同一组字段 传感器发送记录时带有记录时间戳 触发因素: 触发器是用户定义的 输入仅为一个传感器的一个读数,而不是随时间或多个传感器的读数 仅具有活动/非活动状态 传感器按多对多原则分配给触发器 我遇到的问题与跟踪触发器何时处于活动或非活动状态有关 例如,对于触发器检查值>1 sensor_id | reading

我有一个由两个主要组件组成的系统,传感器和触发器

系统负责记录传感器发送的信息,并向用户报告某些触发器激活或未激活的时间

有关传感器的一些信息:

所有传感器记录同一组字段 传感器发送记录时带有记录时间戳 触发因素:

触发器是用户定义的 输入仅为一个传感器的一个读数,而不是随时间或多个传感器的读数 仅具有活动/非活动状态 传感器按多对多原则分配给触发器

我遇到的问题与跟踪触发器何时处于活动或非活动状态有关

例如,对于触发器检查值>1

sensor_id | reading             | value | trigger_value
1           2011-04-25T20:09:00   0       false
1           2011-04-25T20:11:00   1       false
1           2011-04-25T20:13:00   4       true
1           2011-04-25T20:15:00   5       true
1           2011-04-25T20:17:00   3       true
1           2011-04-25T20:19:00   6       true
1           2011-04-25T20:21:00   1       false
它可能会返回:

sensor_id | reading             | event
1           2011-04-25T20:13:00   1 -- 'went active'
1           2011-04-25T20:21:00   0 -- 'went in-active'
我目前的方法是记录每个传感器触发器集的当前状态。当传感器的下一个输入进入并评估触发器时,它会将其与该传感器的当前触发器状态列表进行比较。对于状态的每次变化,记录“激活”或“取消激活”

这种方法非常简单,但它会生成数据库中已有的状态更改数据;但是,数据不在单个元组中,它位于同一表中元组之间的关系中

因此,问题是:

我是否因为数据“已经存在”而改变我的方法;通过更改模式以减少对元组之间关系的依赖,或创建视图/存储过程以在请求时对其进行分析

我是否坚持使用这个系统,因为它解决了问题,并隐藏了同一个表中元组之间存在时间关系的事实,我知道这是不好的

以更一般的形式:

如何在表中存储基于时间的统计数据/数据,并在不破坏RDBMS的情况下分析连续统计数据之间的差异

当前实施结构的示例:

-- log incoming sensor data, keyed by sensor and when it was recorded
create table sensor_log (
  sensor_id integer references sensors (sensor_id),
  reading timestamp,
  data_point_a integer NOT NULL, -- example name only
  data_point_b integer NOT NULL,
  -- ...  various other data points
  primary key(sensor_id, reading)
);
-- data storage for trigger configuration
create table triggers (
  trigger_id integer,
  -- ...  configuration for the triggers
  primary key(trigger_id)
);
-- associate triggers with particular sensors on a many to many basis
create table sensor_triggers (
  sensor_id integer references sensors (sensor_id),
  trigger_id integer references triggers (trigger_id),
  -- ...  configuration for the triggers
  primary key(sensor_id, trigger_id)
);
-- record which triggers were active for a particular sensor input
-- not necessary, unless to save on recomputing past trigger activations
create table sensor_trigger_activations (
  sensor_id integer,
  reading timestamp,
  trigger_id integer references triggers (trigger_id),
  primary key (sensor_id, reading, trigger_id),
  foreign key (sensor_id, reading) references sensor_log (sensor_id, reading)
);
-- record trigger 'activations' & 'deactivations'
-- activation: active state preceded by in-active state (for a particular trigger)
-- deactivation: in-active state preceded by an active state ""
-- absense
create table sensor_trigger_events (
  sensor_id integer,
  reading timestamp,
  trigger_id integer,
  event_type smallint CHECK (event_type = 0 OR event_type = 1), -- 0 = deactivation, 1 = activation
  primary_key (sensor_id, reading, trigger_id),
  foreign key (sensor_id, reading) references sensor_log (sensor_id, reading)
);

首先,我不认为同一个表中元组之间的时态关系一定是坏的。它不是很直接,所以隐藏它是可以的


考虑到您的需求集,我真的看不到有什么可以改进的地方。

首先,我不认为同一个表中元组之间的时态关系一定不好。它不是很直接,所以隐藏它是可以的

考虑到您的一系列要求,我真的看不到有多少地方可以改进