👌

達人に学ぶDB設計7章 要約

2024/05/04に公開

達人に学ぶDB設計7章を要約してみました

論理設計のバッドノウハウ

  • 論理設計にアンチパターンが存在する。戦略の失敗を戦術で取り返すことはできないと言うが、世の中には正しい正規化を無視した論理設計に溢れている。このようにならないように気をつける必要がある
  • リレーショナルデータベースでは非スカラ値を持つ配列を扱うことができるが、リレーショナルデータベースは厳格な正規化によって整合性を保ってきたため、純粋なスカラ値を使うことに準拠するべきである
  • スカラ値の基準とは?スカラ値とは分解不可能な値を持つことである。サービスの特性上、意味的に分割できる限り、なるべく分割して保持する
  • 1つの列に対して2つの意味があるデータが格納することは、アンチパターンである。列は変数ではないので、一度決めたら変更するべきではない
  • 単一参照テーブルはマスタテーブルの数が減るため、ER図やスキーマが簡単になる。検索が容易である。一方、可変長文字列方で宣言する必要がある、レコード数が多くなる、バグに気づきにくい、ERモデルの正確さを欠くなどが挙げられる。テーブルにポリモフィズムは求められない
  • I/Oコストの増大のためテーブルを水平分割するのは良くない。拡張性に乏しく、正規化の理論に沿っていない。そのため、パーティション機能を用いることで、テーブルを分割することなく、物理的に格納領域を分離するべきである(アクセスするデータ量を1/nまで減らすことができる。nはパーティションの数。例えば、年度とかで分けれる)
  • パーティションとインデックスはどう使い分ければ良いのか?パーティションはインデックスが小さく、値の変更があまり起きない列をキーにして利用する
  • 垂直分割は無損失分解ではあるものの、分割することが論理的な意味を成さないこともある。そのため、集約で代替する。
  • データマートを作ることでオリジナルのテーブルを意味的な破壊することなくパフォーマンスの向上を目指せる。マートはオリジナルデータと非同期的に更新し整合性を保つ必要があるが、負荷のかかる作業なので、バッチ更新で主に対応される
  • もう一つの代替手段としてサマリデータがある。これは事前にSELECT文でデータを抽出し作業する時は、抽出したサマリデータを使う。デメリットとしていつ更新をするのかの問題がある
  • 可変長文字列はキーとして不適切である。不変性を兼ね備え居ていないため、データ更新時に更新処理が多く発生しシステムの安定的な運用とパフォーマンスに影響を及ぼす可能性がある。また、可変長文字列と固定長文字列は物理的には同じ値にならないため、やはり可変長文字列は使うべきではない
  • システムの統合で同じテーブルが重複して存在することが往々にしてある

Discussion