正規化
DBをマスターしたい
前回に引き続き、DBの基本知識を学習している
今回は正規化についてまとめる
参考文献
目次
- 基礎用語
- 正規化とは
- ストレージの冗長構成
- バックアップ設計
1.基礎用語
テーブルの構成要素
参考サイト:株式会社システムインテグレーター
- テーブル
 共通点を持ったレコードの集合体
 「テーブル名は複数形または複数名詞で書ける」
 →そうでなければテーブルにはどこか間違いがある
- カラム
 「列」のこと、属性ともいう
- レコード
 「行」のこと
- フィールド
 「セル」のこと
キー
- 主キー
 別名は「プライマリキー」と呼ぶ
 テーブルに必ず1つ存在しなければならず、かつ1つしか存在しない
 一意に識別する=値を指定すれば必ず1行のレコードを特定できる
- 外部キー
 テーブルに対して一種の「制約」を課すこと(参照整合性制約)
制約
- NOT NULL制約
 データを入力せず空欄の状態をNULLという
 しかし、SQL上では問題を引き起こす厄介者
 =可能な限りデータはNULLにしない(データベース設計における大方針)
- 一意制約
 列の組について一意性を求める制約
- CHECK制約
 列の取りうる値の範囲を制限するための制約
命名規則
- 名前に使える文字集合
 半角のアルファベット、半角数字、アンダーバー
 日本語は原則、使わない
- 最初はアルファベット
 先頭は必ずアルファベットを使う
- 名前は重複してはならない
2.正規化とは
正規化の定義
 正規化されたデータ形式を正規形という
 正規形はデータの冗長性を排除し、一貫性と効率性を保持するための形を指す
- 冗長性
 一つの情報が複数テーブルに存在して無駄な領域と面倒な更新処理が発生する状態
- 非一貫性
 データの不整合が発生したり、そもそもデータを登録することのできない状態
3.第一正規形
一つのセルの中には一つの値しか含まない
(Before)
| 社員ID | 社員名 | 子 | 
|---|---|---|
| 000A | 加藤 | 達夫 信二 | 
| 000B | 藤本 | |
| 001F | 三島 | 敦 飛鳥 洋子 | 
(After)
| 社員ID | 社員名 | 子 | 
|---|---|---|
| 000A | 加藤 | 達夫 | 
| 000A | 加藤 | 信二 | 
| 000B | 藤本 | |
| 001F | 三島 | 敦 | 
| 001F | 三島 | 飛鳥 | 
| 001F | 三島 | 洋子 | 
これだとまだ問題がある
1つ目は主キーが決められないこと
 →決めるなら「社員ID+社員名+子」だが子にはNULLがある
2つ目は2つのエンティティ情報を持っていること
 →社員と子供の情報があり、テーブルの意味やレコードの単位をすぐに理解できない
(After ver2.0)テーブルを分割する
 →社員テーブルと子供テーブルに分ける
| 社員ID | 社員名 | 
|---|---|
| 000A | 加藤 | 
| 000B | 藤本 | 
| 001F | 三島 | 
| 社員ID | 子 | 
|---|---|
| 000A | 達夫 | 
| 000A | 信二 | 
| 001F | 敦 | 
| 001F | 飛鳥 | 
| 001F | 洋子 | 
4.第二正規形
部分関数従属とは
主キーの一部の列に対して従属する列がある場合=部分関数従属
ex)「会社コード」から「会社名」がわかる
主キーを構成する全ての列に従属性がある場合=完全関数従属
→第2正規形はテーブル内の部分関数従属を解消し、完全関数従属のみのテーブルを作ること
(Before)
| 会社コード | 会社名 | 社員ID | 社員名 | 年齢 | 部署コード | 部署名 | 
|---|---|---|---|---|---|---|
| C0001 | A商事 | 000A | 山下 | 40 | D01 | 開発 | 
| C0001 | A商事 | 000B | 高橋 | 32 | D02 | 人事 | 
| C0001 | A商事 | 001F | 小山 | 50 | D03 | 営業 | 
| C0002 | B工業 | 000A | 斎藤 | 21 | D03 | 営業 | 
| C0002 | B工業 | 009F | 田崎 | 33 | D01 | 開発 | 
| C0002 | B工業 | 010A | 柳田 | 46 | D04 | 総務 | 
(After)
| 会社コード | 社員ID | 社員名 | 年齢 | 部署コード | 部署名 | 
|---|---|---|---|---|---|
| C0001 | 000A | 山下 | 40 | D01 | 開発 | 
| C0001 | 000B | 高橋 | 32 | D02 | 人事 | 
| C0001 | 001F | 小山 | 50 | D03 | 営業 | 
| C0002 | 000A | 斎藤 | 21 | D03 | 営業 | 
| C0002 | 009F | 田崎 | 33 | D01 | 開発 | 
| C0002 | 010A | 柳田 | 46 | D04 | 総務 | 
| 会社コード | 会社名 | 
|---|---|
| C0001 | A商事 | 
| C0002 | B工業 | 
異なるレベルの実体(エンティティ)をきちんと分離させるイメージ
4.第三正規形
推移的関数従属
テーブル内部に存在する段階的な従属関係のこと
ex)「会社コード、社員ID」→「部署コード」→「部署名」
 会社コードがあって初めて部署名のリストができる
 →まだ所属している人がいない部署の登録ができない
(After)
| 会社コード | 社員ID | 社員名 | 年齢 | 部署コード | 
|---|---|---|---|---|
| C0001 | 000A | 山下 | 40 | D01 | 
| C0001 | 000B | 高橋 | 32 | D02 | 
| C0001 | 001F | 小山 | 50 | D03 | 
| C0002 | 000A | 斎藤 | 21 | D03 | 
| C0002 | 009F | 田崎 | 33 | D01 | 
| C0002 | 010A | 柳田 | 46 | D04 | 
| 会社コード | 会社名 | 
|---|---|
| C0001 | A商事 | 
| C0002 | B工業 | 
| C0003 | C建設 | 
| 部署コード | 部署名 | 
|---|---|
| D0001 | 開発 | 
| D0002 | 人事 | 
| D0003 | 営業 | 
| D0004 | 総務 | 
