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

时间:2017-10-24 20:36:13

标签: sql database api sensor sql-server-2016

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

一点背景知识:

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

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

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

所有传感器都有一个ID(在CSV字符串中给出),我将通过ID将传感器链接到已经在数据库中的房间(SQL 2016),通过Web UI(ASP.NET)。 / p>

我将要做的查询类型是“房间内当前的温度是多少”,我还需要查询趋势,例如“给我所有房间的湿度平均值高”。

我的问题

考虑到我现在将有大约250个传感器,每个传感器大约每10秒左右通过一个Web API发布,我目前有两种不同类型的CSV字符串(将来可能更多),在一种情况下CSV字符串将包含CSV字符串的不同部分中的有用信息,您建议作为合适的表格结构来支持此字符串吗?理想情况下在SQL服务器(可能是2016年的JSON支持?),因为SQL Server是我更熟悉的东西,但是如果这是一个糟糕的选择当然我对你的想法持开放态度。

我试图避免使用“每种传感器类型”的表格,因为这看起来很混乱,如果没有新的表格等,将来会更难添加不同的传感器类型。

我确实考虑让我的API分离到我的网络应用程序,将我的传感器发布到它并让API将CSV'按原样'存储到数据库中,以及'传感器类型'ID。我想我可以批量处理它(某种服务)使用存储过程批量插入我的主数据库,因为我认为这可能会减少API开销。

数据库结构

建筑物有很多房间,房间有很多传感器。传感器有一种类型。我将密切关注映射表中房间和传感器ID之间的映射。

传感器类型已解释

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

  1. 日期(字符串)
  2. 时间(字符串)
  3. SensorID(字符串)
  4. 临时(十进制)
  5. 湿度(十进制)
  6. PIR Count(int)
  7. 传感器B有两种不同的配置,在这两种情况下都会发布相同的CSV字符串,不同的将是从中使用的值,但我想存储:

    配置1(管道温度)

    1. DateTime(unix timestamp)
    2. SensorID
    3. 管道温度1(十进制)
    4. Pipe Temp 2(十进制)
    5. 配置2(电源监控)

      1. DateTime(unix timestamp)
      2. SensorID(字符串)
      3. 电源1(十进制)
      4. 电源2(十进制)
      5. 电源3(十进制)
      6. 电源4(十进制)
      7. 所有传感器都有相同的公共数据:

        1. DateTime
        2. SensorID
        3. 我想一个解决方案是让一个房间有许多'传感器类型A'和配置1中的许多传感器类型b,并且配置2中有许多传感器类型b,每个传感器类型都有自己的数据表,但是我我认为如果我能在传感器表中为所有传感器设置一个表,并从类型表中给它们一个类型,那将是很好的,因为如果/当添加更多传感器时,这将更加灵活。这种方法的缺点是我何时链接到这些不同的传感器数据类型/形状

          由于

1 个答案:

答案 0 :(得分:1)

您的基本选项是discussed in this question,但举例来说很有意思。

好的,让我们一点一点地去。

  

建筑物有很多房间

所以,我们知道我们有两张桌子:

Building

Room 
  --fk to Building
  一个房间有很多传感器。

Sensor
  --fk to Room

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

Sensor

Room_Sensor
  --fk to Room
  --fk to Sensor
  

传感器有一种类型。

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

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

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

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

还有一个额外的问题 - 如果传感器被移动,或房间被细分("添加"之前没有的两个或更多房间)会发生什么?所以让我们回顾一下:

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)关系的副本,随着时间的推移会发生变化(传感器可能会在走廊上移动一周或某些东西)。

现在,测量数据怎么样?你实际上有几种不同的东西"这里:

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

(我假设Type B的索引项代表不同的东西的相同度量,它们应该是多行,这意味着另外一个表用于外键。如果他们改为对同一事物的不同测量 - 流入和流出温度,比如说 - 它更简单)

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增加了测量室温的新功能;如果是这样,数据库可能保持不变,并且可以将行添加到现有表中。

请注意,这样做需要您拥有某种API或加载程序,但您很可能需要其中一种。