我是influxDB的初学者,在阅读了图式设计文档之后,还有一个问题。
如何决定是使用多个字段的一个度量还是多个字段的多个测量?
我有多个物联网设备,每分钟发送数据(温度、湿度、压力)。所有这些数据都有完全相同的时间戳。
所以我想知道我是否更愿意像这样创建一个度量:
timestamp,iotid,temperature,humidity,pressure
-------------------------------------------------
1501230195,iot1,70, 45, 850还是三个测量值(每个值一个),标记相同,但其中只有一个字段?
timestamp,iotid,temperature
----------------------------
1501230195,iot1,70
timestamp,iotid,humidity
-------------------------
1501230195,iot1,45
timestamp,iotid,pressure
-------------------------
1501230195,iot1,850就查询而言,我只能检索一个值,但同时也可以检索3个值。
发布于 2018-08-22 12:58:59
这是一个老问题,但这可能与任何从事TSDB工作的人有关。
当我第一次开始的时候,我的观点是,每一个数据点都会进入一个单一的测量范围。假设我会在稍后的日期将所需的数据合并到SQL语句中。但是,任何使用过TSDB的人都知道,由于在实现TSDB时所使用的设计选择,在检索数据方面有一些严重的限制。
随着我在项目中的进展,下面是我开发的经验法则:
一个度量应该包含它所需要的所有维度,以使其有意义,但没有更多。
例如:想象一个气体流量计,它发出3个信号:
在这种情况下,体积流量和温度应该是一个单一测量的两个领域,总流量应该是它自己的测量。
(如果读者不喜欢这个例子,可以考虑一种家用电表,它输出安培、伏特、千瓦和功率因数)。
为什么在不同的系列中存储体积和温度会很糟糕呢?
constant * temp * volume才能得到一个正确的值。使用两个独立的度量来实现这一点就成了一场噩梦,因为例如,influxdb甚至不支持操作。但是,即使是这样,您也必须确保其中一个字段的缺失值不会被错误地处理,分组和聚合操作也是正确的。为什么把这三者都存储在一个度量中会有什么不好呢?
您很可能有一个用例,在这个用例中,您希望随时审计所有三个值,但是情况可能不是这样,而且您不关心以与您想要测量流量本身相同的频率来测量总体积。
将所有字段放在一个度量中将迫使您在特定字段中放置空值,或者始终记录几乎不发生变化的变量。不管是哪种方式,都是没有效率的。
重要的洞见是,多维实体需要在同一时间内的所有维度,才有意义。
发布于 2017-08-07 11:05:12
没有正确或错误的模式设计,但是使用一个度量,一个字段值是更合适的方法。
为什么?
将多个字段值存储到measurement中是一个非常关系的数据库问题。也就是说,measurement不应该被看作是一个database table,因为它是一个非常不同的东西。
应该为描述一种数据类型(如温度或CPU使用情况)显式保留度量。
如果我们用one field value和measurement来设计我们的模式,那么我们就可以用真实的英语来描述数据;
在一定的point时间内,温度为measured为data value=30。注意到这里使用的术语point,data和measurement。
然而,如果将多个field values放入特定的measurement中,则很难用真实的英语表示data。
influxdb是一个时间序列数据库,因此显然我们应该以time-series的方式来实现它。
此外,一些时间序列数据实际上被测量到微秒的精度水平。在如此精细的粒度定时中,即使对于milliseconds,一组数据也不太可能共享相同的时间。因此,将其设计为一个包含数据点序列的度量总是更好的选择。
发布于 2017-08-02 03:28:54
这可能取决于您的数据,尝试两者并查看存储需求。例如,如果湿度变化不大,那么分离它是有意义的。但是,如果某些变量在相同的时间间隔内发生变化,那么将它们组合起来是有意义的。它还可能取决于您的查询模式。
https://stackoverflow.com/questions/45368535
复制相似问题