目的
「達人に学ぶ DB 設計 徹底指南書」を読んで学んだことをアウトプットするために記事を投稿する。
今回は第 3 章についての内容をまとめる。
テーブルとは
- テーブル
- 共通点を持ったレコードの集合体
- テーブル≠表ではない
テーブルの構成要素
- 行と列
- 行:レコード
- 列:カラム、もしくは属性
- キー(key)
- ある特定のデータを引き出すための鍵
- 主キー(primary key)
- 一意にレコードを識別するための属性
- 外部キー(foreign key)
- 二つのテーブルの間の列同士で設定するための属性
- テーブルに対して一種の「制約(constraint)」を課す役割も持つ=参照整合制制約
制約の種類
- NOT NULL制約
- NULL(空欄)を禁止すること
- テーブル定義において、列は可能な限りNOT NULL制約を付加することが望ましい
- 一意制約
- ある列の組について一意性を求める
- CHECK制約
- ある列の取りうる値の範囲を制限する
- ex.)年齢の場合、20 ~ 65までの整数のみ許容など
テーブルの列と名前
ルール 1:名前に使える文字集合
- 半角アルファベット
- 半角数字
- アンダーバー(_)
テーブルや列の名前に日本語は絶対ダメ
ルール 2:最初はアルファベット
- 良い例
- champions_2024、nine9
- 悪い例
- 2024_champions、9nine
ルール 3:名前は重複してはならない
同じ名前を持つテーブル、同じ名前を持つ列は存在してはいけない(もし作ろうとしても、エラーになる)。
正規化とは
冗長性や非一貫性の問題を解決するために考案された方法論
※冗長性:一つの情報が複数のテーブルに存在して無駄なデータ領域と面倒な更新処理を発生させてしまう、などの状態
※非一貫性:冗長性により、更新処理のタイムラグによってデータの不整合が発生したり、そもそもデータを登録することができないようなテーブルを作ってしまう、などの状態
正規化は大きく 5〜6 段階に分類される
第1正規形
一つのセルの中には一つの値しか含まない=スカラ値の原則
なぜの 1 つのセルに複数の値を入れてはダメなのか?
セルに複数の値を許せば、主キーが各列の値を一意に決定できないから
→ 主キーの定義に反する
正規化とは、テーブルのすべての列が、関数従属性を満たすように整理していくこと
第 2 正規形
部分関数従属(主キーの一部に従属した状態)を解消し、完全関数従属(主キーすべてに従属した状態)のみのテーブルを作ること
第 3 正規形
テーブル内部に存在する推移的関数従属(段階的な従属関係)を解消し、それぞれの関数従属の関係を独立させる
ボイスーコッド正規形
非キーからキーへの関数従属をなくした状態
第 4 正規形
独立な多値従属性が複数存在するテーブルを分割する
第 5 正規形
第4正規形の発展版
正規化のポイント
1. 正規化とは更新時の不都合/不整合を排除するために行なう
2. 正規化は従属性を見抜くことで可能になる
3. 正規形はいつでも非正規形に戻せる
感想
- 従属制の排除=正規化の第一歩
- 正規化を行うことで冗長性や非一貫性を排除できるが、その分テーブルが増えることになるためパフォーマンスの低下につながるのが悩ましい...