2017-12-27 28 views
0

私は時系列のDBを実装しようとしていますが、私はデータベースのさまざまなオプションを使いましたが、私はその知識がないので、 PostgreSQLと私はDjangoで(特にORMのために)それを使用するのに多少親しみがあります。質問が多いPostgreSQLの時系列

アイデアは、4列のデータの時系列を保存することです(すべての価格でインデックスされます)。

timestamp | id | item | price 

私はこれらを毎分追加することを検討しています。約1500個のデータポイントが毎分一括挿入されています。 1ヶ月後には、分に特化する必要がなくなり、1日に1回で十分です(00:00)。

私は、PostgreSQLがこれでうまくいくと思っていますか?これはバックエンドによって提供され、レイテンシがかなり低い必要があります(往復300ミリ秒)。

私の主な問題は、PostgreSQLがアイテムの範囲、開始と終了のタイムスタンプ、データが要求された間隔などの要件が与えられても、データを効率的に返すことができるかどうかを理解することにあります。手動でフィルタリング)。

私のテーブルには、次のデータを単一の項目が含まれている場合:

timestamp | id | item | price 
1514391000 01 foo  10 
1514391100 02 foo  20 
1514391200 03 foo  30 
.......... .. ...  .. 
1514392000 11 foo  20 
1514393000 21 foo  20 

を私はstart: 1514391000end: 1514392000step: 200を要求できるようにしたいと思い、私はその後(1000年バック6件の結果を受け取ることを期待します、 1200,1400,1600,1800及び2000)。これは効率的な方法でPostgreSQLで可能ですか?

私が考えることができるのは、自分のtimeseriesを挿入するときに、その値が最も近い分に切り上げられていることを確認してから、データベースを検索する必要なしにフィルタするタイムスタンプを正確に知っています。

また、特定のアイテム、同じシナリオで「最も近いタイムスタンプ」を検索することができるかどうかは疑問です。これらのすべては、賢明なタイムスタンプエントリによって解消されるようですが、それが実現するかどうかはわかりません。

+0

[Timescale DB](https://www.timescale.com/)を評価しましたか?これはPostgresから構築され、時系列データが主な目標です。私の会社は以前のバージョンをテストし、時系列クエリではかなり滑らかであると判断しましたが、要件が変わって[Citus](https://www.citusdata.com)に行きました。 – bma

+0

ああ、私は何とかそれを完全に逃した(InfluxDBなどを見ていた)。 Timescale DBがDjangoのORMでうまくいくかどうかは分かりませんが、私は他のタスクに追加のカスタムSQLを気にしません。私はまた、関係データベース(メトリクスの外)の少しのためにこのDBを使用するつもりです。 – sof2er

+0

Djangoでうまく動作しなかったのは驚いたでしょう。これは、PostgreSQLの中核となるもので、時系列的に最適化するために追加作業が行われているからです。私の最初の要件は非時系列レポートを含み、正常に機能しました(基本的には通常のPostgresサーバーとして動作します)。私のテストでは最大のテーブルに80億行しかないので、数十テラバイトのデータでテストしたとは言えません。 – bma

答えて

0

私は、タイムスタンプ開始とタイムスタンプ終了列を持つことをお勧めします。次に、一致する行を簡単に見つけることができます。

最近のデータ用と古いデータ用の2つのソリューションを考えています。

また、最近のテーブルを1日ごとに分割する必要があります。これにより、一度に1日(または週または月)のデータを削除することで、古いデータをより効果的に管理できます。

その後、毎日(または週または月)、古いデータをアーカイブするレコードに要約します。新しいデータからパーティションを削除することができます。

アーカイブパーティションをスワップするか、ビューを使用して結合することができます。