Open2

「達人に学ぶDB設計」メモ

haseyuyhaseyuy

アンチパータン

非スカラ値

  • 安易に配列型を仕様するのではなく、第一正規系を確保する
  • 意味的に分割できる限り、なるべく分割して保持する(結合したものを後から分割するのは難しいから)

ダブルミーニング

  • テーブルの列は変数でない、一度決めたら変更不可

単一参照テーブル

  • ありとあらゆるマスタタイプテーブルを、一つのテーブルに放り込んだもの
  • レコード数が多くなりすぎると、検索パフォーマンスが悪化する
  • コード検索のSQLでコードタイプやコード値を間違えても、エラーにならない
  • テーブルにポリフォリズムはいらない
コードタイプ コード値 コード内容
comp_cd C001 A商事
pref_cd 01 北海道

テーブル分割

水平分割(例えば売上テーブルを年度別に分割)されたテーブル

  • 論理的に意味を持たない
  • 拡張性に乏しい、テーブルが次々に増えていく
  • パーティション機能を使うことで、パーティションキーを軸として物理的に格納領域を分離することができる

垂直分割

  • 論理的に意味を持たない

ダブルマスタ

  • 同じ役割を果たすマスターテーブルが二つあること、システムの統廃合で起きることが多い
  • このような必要な情報が複数のテーブルに分散されていると、二つマスタを結合しなけれなならない
  • SQLレベルでは完全外部結合によって行うが、コストの高い処理
haseyuyhaseyuy

マテリアライズドビュー

  • あたかもテーブルがあるかのように結果を保持する
  • 作成後はそのままにしておくとデータが古くなる
  • マテリアライズドビューの内容をテーブルの最新の状態と同じにしたいときには、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)