存储各种传感器类型的传感器数据

Storing sensor data for various sensor types

我有一个问题,当传感器类型不同时,如何最好地存储产生的传感器数据。

一些背景知识:

我有两个不同的传感单元。

一个单元(比如 A 型单元)内置传感器(温度、湿度等)并按固定顺序生成长度为 12 的 CSV 字符串,其中所有 12 个值对我都有用。

另一个单元(单元类型 B)是一个可以插入探针和能量监控夹等的单元,在所有情况下它都会生成一个长度为 13 的 CSV 字符串,但是如果你只连接了两个东西,你仅从 13 个 CSV 值中的两个获取有用信息。我们将使用该装置的两种不同配置。

所有传感器都有一个 ID(在 CSV 字符串中给出),我将通过 ID link将传感器发送到数据库中已有的房间(SQL 2016)通过网络 UI (ASP.NET).

我将要进行的查询类型是 "what is the current temp in room a",我还需要查询趋势,例如 "give me all the rooms with a high humidity average"。

我的问题

考虑到目前我将有大约 250 个传感器,每个传感器 post 大约每 10 秒左右通过网络 API,我目前有两种不同类型的 CSV 字符串(将来可能会更多),并且在一种情况下,CSV 字符串将在 CSV 字符串的不同部分包含有用的信息,您会推荐什么作为 suitable table 结构来支持这个?理想情况下在 SQL 服务器中(也许 2016 年 JSON 支持?)因为 SQL 服务器是我更熟悉的东西,但是如果这是一个糟糕的选择,我当然愿意接受你的想法。

我试图避免 table 'per sensor type',因为这看起来很乱,如果没有新的 tables 等,它也会使将来添加不同的传感器类型变得更加困难.

我确实考虑过将我的 API 与我的网络应用分开,post 将我的传感器连接到它并让 API 将 CSV 'as is' 存储到数据库中,以及 'sensor type' ID。然后我想我可以 post 使用存储过程分批处理它(某种服务)以分批插入我的主数据库,因为我认为这可能会减少一些 API 开销。

数据库结构

一栋楼有很多房间,一个房间有很多传感器。传感器有一个类型。我将在映射 table 中记录房间和传感器 ID 之间的映射。

传感器类型说明

传感器类型 A 具有以下信息:

  1. 日期(字符串)
  2. 时间(字符串)
  3. 传感器 ID(字符串)
  4. 温度(十进制)
  5. 湿度(十进制)
  6. PIR 计数(整数)

传感器 B 有两种不同的配置,在这两种情况下,相同的 CSV 字符串是 posted,不同的是从中使用的值,但我想存储:

配置 1(管道温度)

  1. 日期时间(unix 时间戳)
  2. 传感器 ID
  3. 管道温度 1(十进制)
  4. 管道温度 2(十进制)

配置2(电源监控)

  1. 日期时间(unix 时间戳)
  2. 传感器 ID(字符串)
  3. 1 的幂(十进制)
  4. 2 的幂(十进制)
  5. 3 的幂(十进制)
  6. 4 的幂(十进制)

所有传感器都有相同的公共数据:

  1. 日期时间
  2. 传感器 ID

我想一个解决方案是让一个房间在配置 1 中有许多“传感器类型 A”和许多传感器类型 b,在配置 2 中有许多传感器类型 b,每个传感器类型都有自己的 table对于它的数据,但是我认为如果我可以只为传感器 table 中的所有传感器提供一个 table,并从类型 table 中给它们一个类型,那就太好了这样会更灵活 if/when 添加更多传感器。这种方法的缺点是我什么时候 link 这些不同的传感器数据 types/shapes

谢谢

你的基本选项是discussed in this question,但是这个例子很有趣。

好的,让我们一点一点地进行。

A building has many rooms

马上,我们知道我们有两个 tables:

Building

Room 
  --fk to Building

a room has many sensors.

Sensor
  --fk to Room

(或者,如果传感器可能监视来自多个房间的事件)

Sensor

Room_Sensor
  --fk to Room
  --fk to Sensor

A sensor has a type.

Sensor
  --type id of some sort (manufacturer?)

Sensor type A has the following information:

... 这就是它变得有趣的地方。因为,虽然Type A生成这个信息是真的,但这不是Type A状态;这是 room.

的状态

这就是其中的重要部分:数据库是状态(这里是一系列状态,假设我们有时间戳)的存储库。

还有一个额外的问题 - 如果传感器移动或房间被细分("adding" 两个或更多以前不存在的房间)会发生什么?那么让我们回溯一下:

Room
  --fk to building

Sensor
  --type id of some sort, manufacturer info?

Room_Sensor
  --pk
  --fk to room
  --fk to sensor
  --createdAt timestamp

请注意,Room_Sensor 可能具有相同 (Room, Sensor) 关系的多个副本,随着时间的推移而变化(也许传感器在走廊上移动了一个星期左右)。

现在,测量数据呢?你这里其实有几个不同的"things":

Environment
  --fk to Room_Sensor
  --occurredAt timestamp
  --temperatureInCelsius
  --humidityInBar (or whatever other unit)
  --PIR (particulate?  please label your units)

(我假设 Type B 的索引项表示不同 事物 的相同 测量值 ,它们是应该是多行,这意味着额外的 table 用于外键。如果它们是同一事物的不同测量值 - 流入和流出温度,比如说 - 它更简单)

Pipe

Pipe_Temperature
  --fk to pipe
  --fk to Room_Sensor
  --occurredAt timestamp
  --temperatureInCelsius

Electrical_Drop

Electrical_Drop_Draw
  --fk to Electrical_Drop
  --fk to Room_Sensor
  --occurredAt timestamp
  --consumptionInWatts

...是的,这可能就是我要开始的。对于这种结构,传感器的实际物理类型无关紧要——我们只关心它提供给我们的信息类型。也许将来 Type B 会增加测量室温的新功能;如果是这样,数据库可能会保持不变,并且行可能会添加到现有的 tables.

请注意,这样做需要您有一个 API 或某种加载程序,但无论如何您很可能需要其中之一。