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
私の質問はより高いレベルです:
私自身の考え:
オプション1は、InfluxDBの説明「測定」によって示されるものに似ているように思えます。温度と湿度は別々の量です。しかし、単に「値」と呼ぶのは少し不格好なようです。
オプション2には、湿度と温度の両方がまったく同じタイムスタンプを共有するという利点があるようです。これは、たとえば、他のソフトウェアにデータをインポートして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
時間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"
時間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を使用します。一般的に、どちらのアプローチも適切に見えます。
しかし、実際には、より一般的な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 。