【发布时间】:2020-09-12 06:56:09
【问题描述】:
我正在尝试决定如何在 InfluxDB 数据库中组织测量(我相信他们称之为 schema design and data layout),但我认为这可能是一个更一般的数据库类型问题。
让我们举个简单的例子,我在两个位置测量两个量,温度和湿度(想象一下,我知道!),客厅 和 外面。
InfluxDB 有 syntax 用于插入数据点:
测量,tag_key=tag_value field_key=field_value
因此有两个明显的(至少对我而言)选项。简而言之,第一个选项会像这样插入一个数据点:
INSERT temperature,location=outside value=15
INSERT humidity,location=outside value=50
而第二个选项会这样做:
INSERT sensor_measurements,location=outside temperature=15,humidity=50
我的问题更高级:
- 是否有首选/接受的方法来解决这个问题?
- 如果我尝试将其扩展到更多数量/位置/数据类型,我会遇到其中任何一个问题吗?
- 如果我稍后尝试在 Grafana 中绘制这些东西,或者如果我稍后尝试实现许多 InfluxQL functions 中的一些,这两种方法是否提供优势?
- 有人对此有什么一般性建议吗?
我自己的想法:
在我看来,选项 1 更像是 InfluxDB 描述“测量”所暗示的内容。温度和湿度都是独立的量。但是仅仅将其称为“价值”似乎有点笨拙。
选项 2 似乎具有湿度和温度共享完全相同的时间戳的优点。这将很有用,例如,如果我想将数据导入其他软件并在两个数量之间进行关联,这意味着我不必进行任何插值或分箱来使它们匹配。
我不确定选项 2 是否只是一个名为 sensor_measurements 的通用测量值是否是一个坏主意,并且以后很难维护。
详细说明:
选项 1
- 对温度和湿度各有一个单独的“测量”,使用位置作为“标签”,只需命名“字段”作为值:
在时间t1,插入数据:
INSERT humidity,location=outside value=50
INSERT temperature,location=outside value=15
INSERT humidity,location=living_room value=65
INSERT temperature,location=living_room value=28
在时间t2,插入一些不同的数据:
INSERT humidity,location=outside value=50
INSERT temperature,location=outside value=15
INSERT humidity,location=living_room value=65
INSERT temperature,location=living_room value=28
然后我可以通过查询以下内容来获取客厅温度:
> SELECT value FROM temperature WHERE location='living_room'
name: temperature
time value
---- -----
1590416682017481091 28
1590416723963187592 29
我也可以使用group by function 来做这样的事情:
SELECT value FROM temperature GROUP BY "location"
选项 2
- 有一个名为 sensor_measurements 的组合“测量”,例如,为 location 使用一个“标签”,然后为每个 使用单独的“字段”温度和湿度:
在时间t1,插入数据:
INSERT sensor_measurements,location=outside temperature=15,humidity=50
INSERT sensor_measurements,location=living_room temperature=28,humidity=65
在时间t2,插入一些不同的数据:
INSERT sensor_measurements,location=outside temperature=14,humidity=56
INSERT sensor_measurements,location=living_room temperature=29,humidity=63
我现在可以通过以下查询获得客厅温度:
> SELECT temperature FROM sensor_measurements WHERE location='living_room'
name: sensor_measurements
time temperature
---- -----------
1590416731530452068 28
1590416757055629103 29
我现在可以使用group by function 执行以下操作:
SELECT temperature FROM sensor_measurements GROUP BY "location"
【问题讨论】:
标签: sql grafana influxdb influxql