我有一个问题,关于如何最好地存储传感器类型不同时产生的传感器数据。
一点背景知识:
我有两个不同的感应单元。
一个单位(比如单位类型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具有以下信息:
传感器B有两种不同的配置,在这两种情况下都会发布相同的CSV字符串,不同的将是从中使用的值,但我想存储:
配置1(管道温度)
配置2(电源监控)
所有传感器都有相同的公共数据:
我想一个解决方案是让一个房间有许多'传感器类型A'和配置1中的许多传感器类型b,并且配置2中有许多传感器类型b,每个传感器类型都有自己的数据表,但是我我认为如果我能在传感器表中为所有传感器设置一个表,并从类型表中给它们一个类型,那将是很好的,因为如果/当添加更多传感器时,这将更加灵活。这种方法的缺点是我何时链接到这些不同的传感器数据类型/形状
由于
答案 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或加载程序,但您很可能需要其中一种。