sql—在组织XDB数据库时,这两种方法中哪一种最受欢迎?

nwlls2ji  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(382)

我试图决定如何在数据库中组织度量(我相信他们称之为模式设计和数据布局),但我认为这可能是一个更一般的数据库类型问题。
举个简单的例子,我在测量两个量子位,温度和湿度(我知道,这很有想象力!),在两个地方,客厅和外面。
influxdb具有插入数据点的语法:
测量,标记\键=标记\值字段\键=字段\值
所以有两个明显的(至少对我来说)选择。简而言之,第一个选项将插入如下数据点:

INSERT temperature,location=outside value=15
INSERT humidity,location=outside value=50

而第二种选择是这样的:

INSERT sensor_measurements,location=outside temperature=15,humidity=50

我的问题更高层次:
有没有更好的/公认的方法?
如果我尝试将其扩展到更多数量/位置/数据类型,是否会遇到这些问题?
例如,如果我稍后尝试在grafana中绘制这些东西,或者如果我稍后尝试实现许多influxql函数中的某些函数,那么这两种方法是否都有优势?
有人对此有什么建议吗?
我自己的想法:
在我看来,选项1更像XDB描述“度量”所暗示的内容。温度和湿度是分开的量。但仅仅称之为“价值”似乎有点笨拙。
选项2的优点是湿度和温度共享完全相同的时间戳。例如,如果我想将数据导入其他软件,并在两个量子位之间进行关联,这将非常有用,这意味着我不必做任何插值或装箱来匹配它们。
我不确定这是否是一个坏主意与选项2只是有一个一般的测量称为传感器测量,并将很难维持以后。
具体内容:

方案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

我还可以使用groupby函数执行以下操作:

SELECT value FROM temperature GROUP BY "location"

方案2

有一个组合的“测量”称为传感器测量,例如,使用“标签”作为位置,然后为每个温度和湿度设置单独的“字段”:
在时间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函数执行以下操作:

SELECT temperature FROM sensor_measurements GROUP BY "location"
cczfrluj

cczfrluj1#

我将使用提供的选项中的选项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

这让我有机会创建一个通用的grafana Jmeter 板,用户可以选择通过 Jmeter 板变量(直接从influxdb生成,例如。 SHOW TAG VALUES WITH KEY = "metric" ). 任何新插入的指标(例如`照度,压力,风速,风向,…)或位置都可以立即在此通用 Jmeter 板中可视化。最终,一些度量也可能有额外的标记。这很好,我将能够使用ad-hoc-grafana变量,因此用户可以动态指定任意数量的键/值过滤器。格拉法纳医生。

相关问题