正規化
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 | 総務 |