在组织 InfluxDB 数据库时,这两种方法中哪一种最可取?



我正在尝试决定如何在InfluxDB数据库中组织测量(我相信他们称之为模式设计和数据布局(,但我认为这可能是一个更一般的数据库类型问题。

假设一个简单的例子,我正在测量两个量,温度湿度(富有想象力,我知道!(,在客厅室外两个位置。

InfluxDB具有插入数据点的语法:

测量tag_key=tag_valuefield_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 函数中的一些,这两种方法是否具有优势?
  • 有人对此有任何一般性建议吗?

我自己的想法:

在我看来,选项 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

我还可以使用分组依据函数来做这样的事情:

SELECT value FROM temperature GROUP BY "location"
<小时 />

选项 2

  • 例如,有一个称为sensor_measurements的组合"测量",使用"标签"表示位置,然后为每个温度湿度设置单独的"字段":

在时间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

我现在可以使用分组依据函数来做这样的事情:

SELECT temperature FROM sensor_measurements GROUP BY "location"
<小时 />

我会使用提供的选项中的选项 2,因为更少的记录 = 更少的资源 = 更好的查询响应时间(理论上(。一般来说,这两种方法看起来都不错。

但我将在现实世界中使用更通用的第三个选项。带有标签metric,location和字段value的单一通用metrics测量:

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

这使我有机会创建单个通用的 Grafana 仪表板,用户可以选择通过仪表板变量(直接从 InfluxDB 生成,例如SHOW TAG VALUES WITH KEY = "metric"(。任何新插入的指标(例如"照度、压力、风速、风向等"(或位置都可以在此通用仪表板中立即可视化。最终,某些指标可能还会具有其他标签。这很好,我将能够使用临时 Grafana 变量,因此用户将能够即时指定任意数量的键/值过滤器。格拉法纳文档。

相关内容

最新更新