5年間の200社の株価で構成されるテーブルがあります。これは、会社名、始値、高値、安値、終値、日付で構成される 1 つの大きなテーブルです。
同じ処理を行う必要があり、ユーザー [最大 10 人] がこのデータベースにアクセスして、さまざまなパラメーターとクエリのセットに関するレポートを取得できるようにする必要があります。
データベースをそのまま使用する必要がありますか、それともより最適化するための提案はありますか。
ありがとう。
5年間の200社の株価で構成されるテーブルがあります。これは、会社名、始値、高値、安値、終値、日付で構成される 1 つの大きなテーブルです。
同じ処理を行う必要があり、ユーザー [最大 10 人] がこのデータベースにアクセスして、さまざまなパラメーターとクエリのセットに関するレポートを取得できるようにする必要があります。
データベースをそのまま使用する必要がありますか、それともより最適化するための提案はありますか。
ありがとう。
名前を取り出し、整数 ID を使用します。より高速で、名前の変更を許容します。銘柄記号も親テーブルに抽出できます。
レポートを検討する必要があると思いますが、たとえば、レポートは常に月ごとになるのでしょうか? もしそうなら、集計データのテーブルを作成できます。
そうでなければ、慎重なインデックスがパフォーマンスの唯一の選択肢だと思います
誰かの誤った引用:
質問が「... そのままにしておくか、それともそのままにしておくかmake it more optimized
」である場合は、測定によって問題があることがわかるまで、そのままにしておきます。
テーブルのクエリまたは更新に問題がある場合は、クエリ、インデックス、テーブルの更新/アクセス頻度などの詳細で質問を更新してください。その時点であらゆる種類の提案が得られます。
前述のように、正規化に関する限り、同じ会社名がテーブルに複数回表示される場合は、会社名を独自のテーブルに抽出することを検討できます。
それが本当にそのデータを持つ単なる会社名である場合、それはすでに正規化されています。住所、電話番号など、会社に関する情報がさらにある場合は、それを別のテーブルに分割する必要があります。
これは最適化ではありません (ただし、企業が名前を変更できる場合は正規化であると主張できます)。
CREATE TABLE company (
id INTEGER PRIMARY KEY, -- Well, this would be a serial, but that works different in different DBMS
name VARCHAR(256) UNIQUE
);
CREATE TABLE price (
company_id INTEGER REFERENCES company(id) NOT NULL,
date TIMESTAMP NOT NULL,
open DECIMAL, -- Just grabbed a type here, probably not right for you.
high DECIMAL,
low DECIMAL,
close DECIMAL,
PRIMARY KEY(company_id, date)
);
鍵の生成については、こちらを参照してください。
ところで、会社の社名変更はどのように処理しますか? 無視するのは簡単な答えですが、それは正しいですか?:)
とにかく、テーブルが大きくなりすぎてパフォーマンスが向上しない場合は、パーティション分割するだけです。
会社の表と、特定の日の株価の表 (始値/高値/安値/終値ビット) を用意して、どこでも会社情報を複製することを避けます。
UID フィールドと複数の日付のディメンション (年テーブル、年 + 月テーブル、年 + 四半期テーブル、会計年度テーブルなど) を追加します。
正規化と最適化は必ずしも同じではありません。
ユーザーはデータで何をするつもりですか?