6

1000 シンボル分の株式取引データを保存したいと考えています。データは実際にはテキスト ファイルから変換されるため、挿入や更新は必要ありません。読み取り専用アクセスのみが必要です。

データは基本的に次のようにグループ化されます: 各シンボルには多くのレコードがあります: {timestamp, price, quantity}、各レコードは取引を表します。

1 つのシンボルのデータのおおよその上限は 5 レコード/秒、各営業日で 8 時間、つまり 5x60x60x8 = 1 日あたり 144K です。つまり、1K シンボルは 1 日あたり 144M レコードを生成します。

データに対するほとんどの操作は次のようになります。

  • 日付 D1、時刻 T1 から日付 D2、時刻 T2 までの期間のシンボルのすべてのレコードを教えてください
  • 期間 [D1, T1...D2, T2] の価格または数量の最小/最大/平均を求める

ここで質問です。この場合、データベースの最適な設計は何でしょうか?

  • シンボルのすべての取引を 1 つのテーブルに保存できますか? ただし、この場合、テーブルはすぐに大きくなりすぎます。
  • 日/週/月ごとに別のテーブルを作成しますか? つまり、2013-10-25_ABC (ABC - シンボル名) です。この場合、1 日/1 週間/1 か月あたり 1,000 個の新しいテーブルを取得できます。
  • または、そのような場合はプレーンテキストファイルで十分でしょうか? たとえば、すべてのシンボル データを 2013-10-15 フォルダーの下のファイルとして保持すると、各フォルダーに 1K ファイルが生成されます。

データベースは、MS SQL または MySQL のいずれかです。合計期間 - 最長 5 年。ありがとうございました!

4

3 に答える 3

4

それは大量のデータです。NoSQlを見てください。

SQL を使用して、いくつかの基本的なアイデアを次に示します。

できるだけ小さなデータ型を使用して、すべての価格データをテーブルに入れます。SymbolId (int) を使用してシンボル、必要な最小の日時型、必要な最小の通貨型を参照します。

非正規化します。1 日あたりの最小値/最大値/平均値と SymbolId を含む 2 つ目のテーブルを作成します。

水平分割を調査し、インデックスを使用します。

于 2013-10-31T20:13:23.127 に答える
4

3 番目のオプションが最適です。 1. 書き込みがほとんどない高い読み取りパフォーマンスが必要です。

あなたの要件は、NoSql データベースに最適です。リレーションシップのない単一のテーブル。MySQLはやり過ぎです。詳細 --> NoSql データベース

于 2013-10-29T10:45:21.147 に答える
3

ある日時から別の日時にクエリを実行するので、テーブルをまったく分割しません。代わりに、シャーディングについて詳しく学んでください。以下は、私が使用するスキーマです。

symbols
    id          varchar(6) // MSFT, GOOG, etc.
    name        varchar(50) // Microsoft, Google, etc.
    ...

trades
    id              unsigned bigint(P)
    symbol_id       varchar(6)(F symbols.id)
    qwhen           datetime
    price           double
    quantity        double
    ...
于 2013-10-29T16:47:46.880 に答える