私はたくさんのセンサー(約1000)を持っており、それらの値を保存したいです。センサーは主に10Hzのサンプリングレートを回避します。
通常のクエリはライブビューアプリケーションに使用されます。プロットするセンサ(一度に1~10個のセンサー)と時間範囲(15分、30分、...)を選択できます。プロットは10秒のような間隔で更新され、おそらく複数のユーザーからアクセスされます。
さらに、将来のために、センサー値は一日、週、月のように照会されます。しかし、これらのクエリはあまり一般的ではなく、超高速である必要はありません。
センサーは1時間あたり約36,000,000の測定値を生成します。アイデアは、「ホットストレージ」で1週間の測定値を約1週間の測定値に保つことでした。古い読み取り値はアーカイブされ圧縮されます。
環境はTimeScaledB統合を備えたPostgreSQLです。
私は今互いに膨大な異なる2つの概念を持っています。
各センサーの単一テーブルまたは異なるテーブル。
単一のテーブル:これらの1000個のセンサは、タイムスタンプ、値、および2の外部キーを識別して単一のテーブルに保存されます。タイムスケールは時間範囲を取得することに大きくなりますが、必要なエントリ(Sensor-ID)のデータセットをフィルタリングする必要があります。
マルチテーブル:各センサーのテーブルを作成します。そのため、外部キー(タイムスタンプと値だけ)を必要とせず、センサーのサブセットだけを問い合わせる場合は、専用のテーブルにセンサーごとに必要な範囲を見つける必要があります。
私は2つのアイデアの間にいくつかのパフォーマンステストをしました、そして結果は何かを結論づけるために互いに離れていませんでした。ただし、たとえばマルチテイプタイプのアプローチでは挿入が速いですが、値を選択しながら決定的な答えは見つかりませんでした。
ただし、2つのデザインのどれが長期的に保持しているかを決めるのに十分なデータベース経験がありません。
ご協力ありがとうございました。
zabbixがこれをどのように処理するかを調べたいかもしれません。 Zabbixは、あなたが望むものを正確に行い、TimesCaledbと組み合わせたPostgresでうまく機能する監視アプリです。それはあなたの質問に対する答えではありませんが、それ以上の答えです。
Zabbixはデータ型ごとに単一のテーブルと保存期間を使用します。履歴*テーブルはすべての測定値を保ち、TRENDS *表は、測定値をセンサーごとに1時間あたりの最小/最大/平均に集計しておくことを保ちます。
そのため、history_uint、history_strなど、固体データモデルを持つ非常に単純だが効果的なアプリケーション. Zabbix-Time-Series-Data-And-TimeCaledb
私の心に飛び出した他のものは次のとおりです。また、ここでZabbixは、重複した値をハートビートでフィルタリングするのに役立ちます。 heartbeatが1時間かかりますが、少なくとも1時間が1時間かかりますが、値が変わるとすぐに保存されます。 Zabbixプロキシはこれを行うことができ、中央の作業をデータベースに保存してレポート作成するようなサーバーからの負荷を取ります。
しかし、それはいつもより良い色の車輪を発明することが自由です。