Open2
「達人に学ぶDB設計」メモ
アンチパータン
非スカラ値
- 安易に配列型を仕様するのではなく、第一正規系を確保する
- 意味的に分割できる限り、なるべく分割して保持する(結合したものを後から分割するのは難しいから)
ダブルミーニング
- テーブルの列は変数でない、一度決めたら変更不可
単一参照テーブル
- ありとあらゆるマスタタイプテーブルを、一つのテーブルに放り込んだもの
- レコード数が多くなりすぎると、検索パフォーマンスが悪化する
- コード検索のSQLでコードタイプやコード値を間違えても、エラーにならない
- テーブルにポリフォリズムはいらない
コードタイプ | コード値 | コード内容 |
---|---|---|
comp_cd | C001 | A商事 |
pref_cd | 01 | 北海道 |
テーブル分割
水平分割(例えば売上テーブルを年度別に分割)されたテーブル
- 論理的に意味を持たない
- 拡張性に乏しい、テーブルが次々に増えていく
- パーティション機能を使うことで、パーティションキーを軸として物理的に格納領域を分離することができる
垂直分割
- 論理的に意味を持たない
ダブルマスタ
- 同じ役割を果たすマスターテーブルが二つあること、システムの統廃合で起きることが多い
- このような必要な情報が複数のテーブルに分散されていると、二つマスタを結合しなけれなならない
- SQLレベルでは完全外部結合によって行うが、コストの高い処理
マテリアライズドビュー
- あたかもテーブルがあるかのように結果を保持する
- 作成後はそのままにしておくとデータが古くなる
- マテリアライズドビューの内容をテーブルの最新の状態と同じにしたいときには、REFRESH MATERIALIZED VIEWを実行します。
postgres=# select * from have_money_table;
id | name | money
----+------+-------
1 | aoi | 2000
2 | sato | 4000
3 | kato | 5000
(3 rows)
## マテリアライズドビューの作成
postgres=# create materialized view mat_money_view as select id, money from have_money_table;
SELECT 3
## マテリアライズドビューの確認
postgres=# select * from mat_money_view ;
id | money
----+-------
1 | 2000
2 | 4000
3 | 5000
(3 rows)