我有一个问题,当传感器类型不同时,如何最好地存储所产生的传感器数据。
一点背景:
我有两个不同的传感器。
一个单元(比如说单元类型A)内置传感器(温度、湿度等),并按固定顺序生成长度为12的CSV字符串,其中所有12个值对我都有用。
另一个单元(单元类型B)是一个可以插入探针和能量监测夹具等的单元,在所有情况下,它都会产生一个长度为13的CSV字符串,但如果只有两个连接的对象,则只能从13个CSV值中的两个获取有用信息。我们将使用两种不同的配置。
所有传感器都有一个ID(CSV字符串中给出),我将通过一个Web UI(asp.net)将传感器按ID链接到一个已经在数据库中的房间(SQL 2016)。
我将要做的查询类型是“A房间的当前温度是多少”,我还需要查询趋势,例如“给我所有高湿度平均值的房间”。
我的问题
考虑到目前我将拥有大约250个传感器,每10秒左右通过一个web api发布一次消息,而且我目前拥有两种不同类型的csv字符串(未来可能会更多),在一种情况下,csv字符串将在csv字符串的不同部分包含有用的信息,您建议使用什么样的表结构来支持这一点?最好是在SQL Server中(也许2016年支持JSON?)由于sql server是我比较熟悉的东西,但是如果这是一个错误的选择,当然我愿意接受你的想法。
我试图避免使用“每种传感器类型”的表,因为这看起来很混乱,如果没有新的表等,将来添加不同的传感器类型也会更加困难。
我确实考虑过让我的api与我的web应用分离,将我的传感器发布到它上面,并让api将csv“原样”存储到数据库中,加上一个“sensor type”id,我想我可以用一个存储过程分批地对它进行后处理(某种服务),然后分批地插入到我的主数据库中,因为我认为这可能会在某种程度上减少api开销。
数据库结构
一栋楼有许多房间,一个房间有许多传感器。传感器有一种类型。我将在映射表中记录房间和传感器ID之间的映射。
传感器类型说明
A型传感器具有以下信息:
日期(字符串)
时间(字符串)
传感器ID(字符串)
温度(十进制)
湿度(十进制)
PIR计数(整数)
传感器B有两种不同的配置,在两种情况下,发布相同的CSV字符串,使用它的值不同,但我想存储:
配置1(管道温度)
日期时间(Unix时间戳)
传感器
管道温度1(十进制)
管道温度2(十进制)
配置2(电源监控)
日期时间(Unix时间戳)
传感器ID(字符串)
幂1(十进制)
幂2(十进制)
幂3(十进制)
幂4(十进制)
所有传感器具有相同的公共数据:
日期时间
传感器
我想一个解决方案是让一个房间有许多“A型传感器”和配置1中的许多B型传感器,配置2中的许多B型传感器,每种传感器都有自己的数据表,但是我想如果我能在一个传感器表中为所有传感器都有一个表,并从一个类型表中给它们一个类型,那就太好了这将是更灵活的,如果/当添加更多的传感器。这种方法的缺点是,我何时链接到这些不同的传感器数据类型/形状
谢谢
最佳答案
您的基本选项是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
的状态。这是其中重要的一部分:数据库是一个状态存储库(这里是一系列状态,假设我们有时间戳)。
还有一个额外的问题-如果传感器被移动,或者房间被细分(“添加”两个或更多以前不存在的房间),会发生什么?所以让我们回溯一下:
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
可能有同一关系的多个副本,随着时间的推移而改变(可能传感器在走廊上移动了一周或更长时间)。那么,测量数据呢?实际上这里有几个不同的“东西”:
Environment
--fk to Room_Sensor
--occurredAt timestamp
--temperatureInCelsius
--humidityInBar (or whatever other unit)
--PIR (particulate? please label your units)
(我假设
(Room, Sensor)
的索引项表示不同事物的相同度量,它们应该是多行的,这意味着要为外键使用一个额外的表。如果它们是同一事物的不同测量值-流入和流出温度,比如说-它更简单)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或某种类型的加载程序,但不管怎样,您很可能需要其中一个。
关于sql - 存储各种传感器类型的传感器数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46919569/