はじめに
第7章;論理設計のバッドノウハウ
を要約しました
1. 非スカラ値
スカラ値・・・1つのセルには1つの値のみが含まれること
スカラ値でない場合、第一正規系を満たしていないことになる。
- 配列型
- 安易に配列型を採用するのではなく、第一正規化を確保することを優先すべき
- 配列型は柔軟なデータ型ではあるが、細心の注意が必要
- スカラ値の基準
- 意味的に分割できる限りは、なるべく分割した方が良い(後で、分割は大変だが結合は楽なため)
- 例)名前や、メールアドレスなど分割して保持
- 高橋健二 ・・・ 「高橋」「健二」
-
test@gmail.com
・・・「test」「gmail.com」
2.単一参照テーブル
同じ構造のテーブル同士を1つのテーブルにまとめても良いのか?
1つのレコードがある時は、会社名、あるときは、都道府県を著しています。
利点よりも欠点の方が多いのが実際の所。
利点
- マスタテーブルの数が減るので、ER図やスキーマがシンプルになる
- コード検索のSQLを共通化できる
欠点
- 必要とされる列長はコード体系によって異なるため、大きめの可変長文字列型を取る必要がある
- 種類が多いため、レコード数が増えるのでパフォーマンスに影響を与える
- 上の例で言うと、コードタイプを間違えて検索しても、エラーが出ずにバグに気づきにくい
- ER図としての可読性が下がる
テーブル分割
- 水平分割・・・レコード単位のテーブル分割
- 垂直分割・・・列単位のテーブル分割
水平分割
SQLのパフォーマンス低下が起きる原因は、ストレージに対するI/Oの増大です。
そのためアクセス量を減らすことでパフォーマンスが改善さえます。
例えば、年度毎に水平にテーブルを分割することで、データ量を減らすことが出来る
しかし
欠点もあるので、分割はする事は原則禁止です。
- 欠点: 分割する意味的な理由が無い
- 拡張性に乏しい
- 分割するなら、分割した全てのデータをまとめて検索しないことが前提になる
- パフォーマンス改善をしたいなら代替え手段がある
- パーティション機能を利用すれば良い。データ量を1/nに減らすことが出来る
パーティションの種類
- レンジパーティション
- キー項目の範囲で指定する
- 例)日付毎に分ける
- リストパーティション
- 任意の値リストを指定することで分割する
- 例)都道府県ごと
- ハッシュパーティション
- ハッシュ関数を利用することで分割が可能
- 不連続なデータを均一に分割する際に使用する
垂直分割
集約で代替えが可能
集約
- 列の絞り込み
- サマリテーブル
列の絞り込み
-
データマート
オリジナルのテーブルから、分割するのではなく
参照した列だけで構成した、小規模なテーブルを作成する。
DWHなどでよく使われる手法
サマリテーブル
事前に必要な情報だけ集約したテーブルを作成しておく。
例)全社員の平均年齢だけをもったテーブル
不適切なキー
- 主キー、外部キーなどデータベース機能で設定されるもの
- テーブルの結合条件で使用される列
この2つのキーには、可変長文字列を使ってはいけない。
なぜなら、
- キーは不変性であること
- コロコロと変わる値をキーにはしない
- 固定長との混合
- キーには固定長が望ましい
同じ役割のテーブルが2つ存在する
なぜ、このようなことが起こるのか?
それは、元々別システムで扱っていたが、システム統合によって同じドメインを扱うようになった場合です。
どのような悪影響があるか?
例えば、同じデータ構造の2つのテーブルで一部異なるデータが入っている場合。
全てのデータから情報を得るためにはテーブルを結合する必要があります。
そして、結合はコストが高い処理です