簡體   English   中英

使用用戶定義的事件將實時傳感器數據記錄到RDBMS中

[英]Recording real-time sensor data in to RDBMS with user defined events

我有一個由兩個主要組件,傳感器和觸發器組成的系統。

該系統負責記錄從傳感器發送的信息,並向用戶報告某些觸發器處於活動或不活動狀態的時間。

有關傳感器的一些信息:

  • 所有傳感器記錄同一組字段
  • 傳感器發送記錄時帶有時間戳記的時間戳

觸發條件:

  • 觸發器是用戶定義的
  • 一個傳感器的輸入僅為一個讀數(即不是隨時間推移的讀數或多個傳感器的讀數)
  • 僅具有活動/非活動狀態

傳感器在許多基礎上分配給觸發器。

我遇到的問題與跟蹤“何時”觸發器變為活動狀態或非活動狀態有關。

例如,對於觸發檢查值> 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)
);

首先,我認為同一張表中元組之間的時間關系不一定很糟糕。 它不是直接的,所以可以隱藏它。

鑒於您的要求,我真的看不到有什么可以改善的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM