web-dev-qa-db-ja.com

InfluxDBデータベースを編成するとき、これらの2つのアプローチのどちらが最も好ましいでしょうか?

InfluxDBデータベースで測定をどのように整理するかを決定しようとしています(これは スキーマ設計とデータレイアウト と呼んでいると思います)。

単純な例として、気温湿度(想像的、私は知っています!)の2つの量を2つ測定しているとしましょう場所、リビングルームおよび屋外

InfluxDBには、データポイントを挿入するための syntax があります。

測定値tag_key = tag_value field_key = field_value

したがって、2つの明白な(少なくとも私には)オプションがあります。簡単に言うと、最初のオプションは次のようなデータポイントを挿入します。

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

一方、2番目のオプションは次のようにします。

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

私の質問はより高いレベルです:

  • これを実行するための推奨/承認された方法はありますか?
  • より多くの量/場所/データ型にスケールアップしようとすると、これらのいずれかで問題が発生しますか?
  • たとえば、後でこれらをGrafanaでグラフ化しようとする場合、または後で多くの InfluxQL関数 のいくつかを実装しようとする場合、どちらの方法にも利点がありますか?
  • これについて提供する一般的なアドバイスはありますか?

私自身の考え:

オプション1は、InfluxDBの説明「測定」によって示されるものに似ているように思えます。温度と湿度は別々の量です。しかし、単に「値」と呼ぶのは少し不格好なようです。

オプション2には、湿度と温度の両方がまったく同じタイムスタンプを共有するという利点があるようです。これは、たとえば、他のソフトウェアにデータをインポートして2つの量を相関させたい場合に役立ちます。つまり、それらを一致させるために補間やビニングを行う必要がないということです。

オプション2でsensor_measurementsと呼ばれる一般的な測定値を持つことだけが悪い考えであるかどうかはわかりませんが、後で維持するのは難しいでしょう。

詳細に:


オプション1

  • 温度湿度のそれぞれに個別の「測定」があり、場所「タグ」として、「フィールド」に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

  • 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"

6
teeeeee

レコードが少ない=リソースが少ない=クエリの応答時間が良い(理論上)ため、提供されているオプションからオプション2を使用します。一般的に、どちらのアプローチも適切に見えます。

しかし、実際には、より一般的な3番目のオプションを使用します。タグ付きの単一のジェネリック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ダッシュボードを作成する機会が得られます。ユーザーは、ダッシュボード変数(InfluxDBから直接生成された、SHOW TAG VALUES WITH KEY = "metric")。新しく挿入されたメトリック(たとえば、「照度、圧力、風速、風向など」)または場所は、この汎用ダッシュボードですぐに視覚化できます。最終的に、一部のメトリックには追加のタグが含まれる場合があります。それは良いことであり、アドホックなGrafana変数を使用できるので、ユーザーは任意の数のキー/値フィルターをその場で指定できます。 Grafana doc

5
Jan Garaj