InfluxDB のデータベースで測定値をどのように編成するかを決定しようとしています (スキーマ設計とデータ レイアウトと呼ばれていると思います) が、これはより一般的なデータベース タイプの質問であると思います。
簡単な例として、居間と屋外の 2 つの場所で温度と湿度(想像上のものです!) の2 つの量を測定しているとしましょう。
InfluxDB には、データ ポイントを挿入するための構文があります。
測定、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
- 温度と湿度のそれぞれに個別の「測定」を行い、場所を「タグ」として使用し、「フィールド」に値として名前を付けるだけです。
時間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 関数を使用して、次のようなこともできます。
SELECT value FROM temperature GROUP BY "location"
オプション 2
- たとえば、 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 関数を使用して、次のようなことができるようになりました。
SELECT temperature FROM sensor_measurements GROUP BY "location"