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