在组织 InfluxDB 数据库时,最喜欢这两种方法中的哪一种?
When organising an InfluxDB database, which of these two approaches would be most preferred?
我正在尝试决定如何在 InfluxDB 数据库中组织测量(我相信他们称之为 schema design and data layout),但我认为这可能是一个更一般的数据库类型问题。
让我们举个简单的例子,我正在测量两个量,温度和湿度(我知道这是想象力!),两个地点,客厅和室外。
InfluxDB 有 syntax 用于插入数据点:
测量,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
我的问题比较高级:
- 是否有 preferred/accepted 方法来解决这个问题?
- 如果我尝试将其扩展到更多 quantities/locations/data 类型,我 运行 会遇到这些问题吗?
- 例如,如果我稍后尝试在 Grafana 中绘制这些内容,或者如果我稍后尝试实施许多 InfluxQL functions 中的一些内容,这两种方法是否有优势?
- 有人对此有任何一般性建议吗?
我自己的想法:
选项 1 在我看来更像是 InfluxDB 描述 "measurement" 所暗示的。温度和湿度都是独立的量。但是只称它为 "value".
似乎有点笨拙
选项 2 似乎具有湿度和温度共享完全相同的时间戳的优点。这会很有用,例如,如果我想将数据导入其他软件并在两个量之间进行关联,这意味着我不必进行任何插值或分箱来使它们匹配。
我不确定选项 2 只使用一个名为 sensor_measurements 的一般测量是否是个坏主意,以后将很难维护。
详细:
选项 1
- 温度和湿度各有一个单独的"measurement",使用位置 作为 "tag",并将 "field" 命名为 value:
时间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
- 组合 "measurement" 称为 sensor_measurements,例如,对 location[=101 使用 "tag" =],然后为每个 温度 和 湿度:
分别设置 "fields"
时间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"
我会使用提供的选项中的选项 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"
)select 可视化 metric/location .任何新插入的指标(例如“照度”、“压力”、“风速”、“风向”……)或位置都可以立即在此通用仪表板中可视化。最终,一些指标可能还有额外的标签。这很好,我将能够使用临时的 Grafana 变量,因此用户将能够即时指定任意数量的 key/value 过滤器。 Grafana doc.
我正在尝试决定如何在 InfluxDB 数据库中组织测量(我相信他们称之为 schema design and data layout),但我认为这可能是一个更一般的数据库类型问题。
让我们举个简单的例子,我正在测量两个量,温度和湿度(我知道这是想象力!),两个地点,客厅和室外。
InfluxDB 有 syntax 用于插入数据点:
测量,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
我的问题比较高级:
- 是否有 preferred/accepted 方法来解决这个问题?
- 如果我尝试将其扩展到更多 quantities/locations/data 类型,我 运行 会遇到这些问题吗?
- 例如,如果我稍后尝试在 Grafana 中绘制这些内容,或者如果我稍后尝试实施许多 InfluxQL functions 中的一些内容,这两种方法是否有优势?
- 有人对此有任何一般性建议吗?
我自己的想法:
选项 1 在我看来更像是 InfluxDB 描述 "measurement" 所暗示的。温度和湿度都是独立的量。但是只称它为 "value".
似乎有点笨拙选项 2 似乎具有湿度和温度共享完全相同的时间戳的优点。这会很有用,例如,如果我想将数据导入其他软件并在两个量之间进行关联,这意味着我不必进行任何插值或分箱来使它们匹配。
我不确定选项 2 只使用一个名为 sensor_measurements 的一般测量是否是个坏主意,以后将很难维护。
详细:
选项 1
- 温度和湿度各有一个单独的"measurement",使用位置 作为 "tag",并将 "field" 命名为 value:
时间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
- 组合 "measurement" 称为 sensor_measurements,例如,对 location[=101 使用 "tag" =],然后为每个 温度 和 湿度: 分别设置 "fields"
时间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"
我会使用提供的选项中的选项 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"
)select 可视化 metric/location .任何新插入的指标(例如“照度”、“压力”、“风速”、“风向”……)或位置都可以立即在此通用仪表板中可视化。最终,一些指标可能还有额外的标签。这很好,我将能够使用临时的 Grafana 变量,因此用户将能够即时指定任意数量的 key/value 过滤器。 Grafana doc.