tee*_*eee 6 sql influxdb grafana influxql
我试图决定如何在 InfluxDB 数据库中组织测量(我相信他们称之为架构设计和数据布局),但我认为这可能是一个更一般的数据库类型问题。
举一个简单的例子,我正在测量两个数量,温度和湿度(我知道是有想象力的!),在两个位置,客厅和室外。
InfluxDB 具有插入数据点的语法:
测量, tag_key=tag_value field_key=field_value
所以有两个明显的(至少对我而言)选择。简而言之,第一个选项将插入这样的数据点:
INSERT temperature,location=outside value=15
INSERT humidity,location=outside value=50
Run Code Online (Sandbox Code Playgroud)
而第二种选择会这样做:
INSERT sensor_measurements,location=outside temperature=15,humidity=50
Run Code Online (Sandbox Code Playgroud)
我的问题更高级:
我个人的想法:
在我看来,选项 1 更像是 InfluxDB 描述“测量”所暗示的内容。温度和湿度都是独立的量。但仅仅称其为“价值”似乎有点笨拙。
选项 2 似乎具有以下优势:湿度和温度共享完全相同的时间戳。这将很有用,例如,如果我想将数据导入其他软件并在两个数量之间进行关联,这意味着我不必进行任何插值或分箱来使它们匹配。
我不确定在选项 2 中只进行一个名为sensor_measurements的一般测量是否是一个坏主意,并且以后很难维护。
详细:
在时间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
Run Code Online (Sandbox Code Playgroud)
在时间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
Run Code Online (Sandbox Code Playgroud)
然后,我可以通过查询以下内容来访问客厅温度:
> SELECT value FROM temperature WHERE location='living_room'
name: temperature
time value
---- -----
1590416682017481091 28
1590416723963187592 29
Run Code Online (Sandbox Code Playgroud)
我也可以使用group by 函数来做这样的事情:
SELECT value FROM temperature GROUP BY "location"
Run Code Online (Sandbox Code Playgroud)
在时间t1,插入数据:
INSERT sensor_measurements,location=outside temperature=15,humidity=50
INSERT sensor_measurements,location=living_room temperature=28,humidity=65
Run Code Online (Sandbox Code Playgroud)
在时间t2,插入一些不同的数据:
INSERT sensor_measurements,location=outside temperature=14,humidity=56
INSERT sensor_measurements,location=living_room temperature=29,humidity=63
Run Code Online (Sandbox Code Playgroud)
我现在可以通过查询以下内容来获取客厅温度:
> SELECT temperature FROM sensor_measurements WHERE location='living_room'
name: sensor_measurements
time temperature
---- -----------
1590416731530452068 28
1590416757055629103 29
Run Code Online (Sandbox Code Playgroud)
我现在可以使用group by 函数来做这样的事情:
SELECT temperature FROM sensor_measurements GROUP BY "location"
Run Code Online (Sandbox Code Playgroud)
我会使用提供的选项中的选项 2,因为更少的记录 = 更少的资源 = 更好的查询响应时间(理论上)。一般来说,这两种方法看起来都不错。
但我会在现实世界中使用更通用的第三个选项。metrics带有标签metric,location和字段的单一通用测量value:
INSERT metrics,metric=temperature,location=outside value=15
INSERT metrics,metric=humidity,location=living_room value=50
INSERT metrics,metric=temperature,location=living_room value=28
INSERT metrics,metric=humidity,location=living_room value=65
Run Code Online (Sandbox Code Playgroud)
这让我有机会创建单个通用 Grafana 仪表板,用户可以选择通过仪表板变量(直接从 InfluxDB 生成,例如SHOW TAG VALUES WITH KEY = "metric")选择可视化指标/位置。任何新插入的指标(例如`照度、压力、风速、风向等)或位置都可以在这个通用仪表板中立即可视化。最终,一些指标可能还有额外的标签。这很好,我将能够使用临时 Grafana 变量,因此用户将能够即时指定任意数量的键/值过滤器。Grafana 文档。