⛳
正規化について
正規化とは
-
データベースで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式
のこと - 第5正規化まで存在する(業務レベルでは第3正規化までが多い)
冗長性
- 一つの情報が複数のテーブルに存在していること
非一貫性
- 冗長なデータの保持により、データの更新ができないテーブルが発生したり、更新処理のタイムラグにより、データの不整合が発生する、などのこと
第一正規化
- 第一正規化の定義は、
テーブルの一マス(セル)には一つの値しか含まない
- つまり、リレーショナルデータベースのテーブルは、常に第一正規化を満たす形になっている
- 一つのセルに一つだけ値が含まれているとき、その値のことをスカラ値と呼ぶ
第二正規化
-
テーブル内で部分関数従属を解消し、完全関数従属のみのテーブルを作ること
-
部分関数従属
- 主キーの一部の列に対して、従属する列がある場合
- 「会社コード」と「社員ID」の主キーを持ち、「会社名」は「会社コード」に従属している
-
完全関数従属
- 主キーのすべての列に従属性がある場合
-
-
つまり、異なるレベルの実体を、きちんとテーブルとしても分離すること
-
第二正規化を行うことで防げること(第二正規化が行えていない社員テーブル参照)
- 同じ会社コードを持つ会社名が異なる可能性
- 社員情報が不明な会社を登録できない可能性
第二正規化が行えていないテーブル例(社員テーブル)
会社コード | 会社名 | 社員ID | 社員名 | 年齢 |
---|---|---|---|---|
C0001 | 〇〇会社 | 0000 | 鈴木 | 30 |
C0002 | △株式会社 | 0001 | 山田 | 35 |
第二正規化を行う
- 第二正規化の方法はテーブルの分割
社員テーブル
社員ID | 社員名 | 年齢 |
---|---|---|
0000 | 鈴木 | 30 |
0001 | 山田 | 35 |
会社テーブル
会社コード | 会社名 |
---|---|
C0001 | 〇〇会社 |
C0002 | △株式会社 |
第三正規化
-
テーブル内の推移的関数従属を解消すること
- 推移的関数従属
- テーブル内部に存在する段階的な従属関係
- 「部署コード」に従属する「部署名」を「社員ID」から見たときの従属関係。
- 「社員ID」→「部署コード」→「部署名」
- 同一テーブルで推移的関係従属が存在していると、データ登録の不都合がある
- 例えば、上記例の場合、社員の存在しない部署は、データ上も存在しないことになる。
- 推移的関数従属
第三正規化が行えていないテーブル例(社員テーブル)
社員ID | 社員名 | 年齢 | 部署コード | 部署名 |
---|---|---|---|---|
0000 | 鈴木 | 30 | D01 | 経理部 |
0001 | 山田 | 35 | D02 | 営業部 |
第三正規化を行う
- 第二正規化と同様にテーブルの分割を行う
社員テーブル
社員ID | 社員名 | 年齢 |
---|---|---|
0000 | 鈴木 | 30 |
0001 | 山田 | 35 |
部署テーブル
部署コード | 部署名 |
---|---|
D01 | 経理部 |
D02 | 営業部 |
D03 | 企画部 |
正規化のポイントは3つ
- 更新時の不都合・不整合を排除するために行う
- 正規化は従属性を見抜くことで可能になる
- 正規形はいつでも非正規系に戻せる
Discussion