我是涌入数据库的初学者,在阅读Schema design文档后,问题仍然存在。
如何决定是使用多个字段进行一次测量还是使用单个字段进行多次测量?
我有多个iot设备可以发送每个数据分钟(温度,湿度,压力)。所有这些数据都具有完全相同的时间戳。
所以我想知道是否宁愿创建一个这样的测量:
timestamp,iotid,temperature,humidity,pressure
-------------------------------------------------
1501230195,iot1,70, 45, 850
或3次测量(每个值一次),标记相同但只有一个字段?
timestamp,iotid,temperature
----------------------------
1501230195,iot1,70
timestamp,iotid,humidity
-------------------------
1501230195,iot1,45
timestamp,iotid,pressure
-------------------------
1501230195,iot1,850
查询方面,我只能检索一个值,但同时也只检索3个值。
答案 0 :(得分:7)
使用任一模式设计都没有对错,但使用一个测量一个字段值是更合适的方法。
<强>为什么吗
将多个字段值存储到measurement
中是一个非常关系数据库的事情。也就是说,measurement
不应被视为database table
,因为它是一个非常不同的东西。
应明确保留测量值,以描述数据类型,如温度或CPU使用率。
如果我们使用one field value
每measurement
设计我们的架构,那么我们可以用真正的英语描述数据;
在某个point
时间内,温度为measured
为data value=30
。注意到此处使用的术语point
,data
和measurement
。
如果您将多个field values
放入特定的measurement
,那么您会发现很难用真正的英语呈现data
。
influxdb
是一个时间序列数据库,因此很明显我们应该以{{1}}方式执行此操作。
此外,一些时间序列数据实际上是在微秒级的精确度下测量的。在这种细粒度时序中,即使对于time-series
,一组数据也不太可能共享相同的时序。因此,将其设计为包含数据点序列的一个测量值始终是更好的选择。
答案 1 :(得分:5)
一个老问题,但这可能与从事TSDB的任何人有关。
当我第一次开始时,我的方法是每个数据点都进行一次现场测量。前提是我稍后会在SQL语句中合并所需的数据。但是,像influx这样使用过TSDB的人都知道,由于实现TSDB时使用的设计选择,在数据检索方面存在一些严重的限制。
随着我在项目中的前进,这是我制定的经验法则:
示例:假设一个气体流量计发出3个信号:
在这种情况下,体积流量和温度应为一次测量的两个字段,而总流量应为自己的测量值。
(如果读者不喜欢这个示例,可以考虑一个家用电表来输出安培和伏特,kw和pf)。
计时:如果将这两个测量以不同系列存储,则它们将具有不同的索引值(时间戳)。除非您小心确保它们已明确指定了时间戳,否则可能会导致它们的采样率略有降低。由于您可能在数据中引入了系统的测量偏差,因此最终很可能会成为坏事(tm)。即使这不是一件坏事,但是如果您以后想要重用此数据(例如将其转储到csv文件中),也将非常烦人。
实用程序:如果要推断体积流量,则必须获取constant * temp * volume
才能获得正确的值。进行两次单独的测量将成为噩梦,因为例如influxdb
甚至不支持该操作。但是,即使这样做,您也必须确保不会错误地处理其中一个字段的缺失值,并且正确进行了分组和聚合。
您可能有一个用例,您想一直审核所有三个值,但是有可能不是这种情况,并且您不在乎以与您相同的频率测量总音量想测量流量本身。
将所有字段都放在一个度量中将迫使您要么在某些字段中输入空值,要么总是记录几乎没有变化的变量。无论哪种方式,效率都不高。
重要的见解是,多维实体需要在同一时间上具有所有维才有意义。
答案 2 :(得分:3)
这可能取决于您的数据,请尝试两者并查看存储要求。 例如,如果湿度变化不大,那么分离它是有意义的。但是如果某些变量在相似的时间间隔内发生变化,那么将它们组合起来是有意义的。它可能还取决于您的查询模式。
答案 3 :(得分:1)
我想提一下,有一个有效的第三种选择:
timestamp,iotid,measure,value
----------------------------
1501230195, iot1, temperare, 70
1501230195, iot1, humidity, 45
1501230195, iot1, pressure, 850