データベース 正規化


学習ログです。

正規形

DBで保持するデータの冗長性を排除し、一貫性と効率性を保持するためのデータ形式

情報の重複によるムダ(冗長性)、データの不整合(非一貫性)を解決するための方法が正規化

第1正規形

一つのセルの中には一つの値しか含まない状態。
その値のことをスカラ値という。

表1 第1正規形

会社コード 会社名 社員ID 社員名 年齢 部署コード 部署名
001 Aシステム 00A 阿笠 30 D1 開発
001 Aシステム 00B 伊藤 20 D2 営業
002 Bコンサル 00A 内海 40 D3 人事
002 Bコンサル 00F 江藤 50 D1 開発
002 Bコンサル 00F 江藤 50 D4 総務

第2正規形

テーブル内で部分関数従属を解消し、完全関数従属のみのテーブルである状態。
異なるレベルのエンティティをテーブルとして分離する作業ともいえる。

関数従属性とは

X列の値を決めれば、Y列の値が一つに決まる

{X} → {Y}

部分関数従属とは

主キーの一部の列に対して従属する例がある状態。
表1の例だと、このテーブルの主キーは会社コードと社員IDの二つであるが、会社名は会社コードに従属している。

完全関数従属とは

主キーを構成する全ての列に従属性がある状態。

表2 第2正規形

社員テーブル

会社コード 社員ID 社員名 年齢 部署コード 部署名
001 00A 阿笠 30 D1 開発
001 00B 伊藤 20 D2 営業
002 00A 内海 40 D3 人事
002 00F 江藤 50 D1 開発
002 00F 江藤 50 D4 総務

会社テーブル

会社コード 会社名
001 Aシステム
001 Bコンサル

第3正規形

推移的関数従属をなくした状態

推移的関数従属とは

テーブル内部に存在する階層的な従属関係

表2には下記の関数従属が残っている。

{部署コード} → {部署名}

また、社員IDと部署コードの間にも関数従属が存在している。

{会社コード, 社員ID} → {部署コード}

つまり全体としては

{会社コード, 社員ID} → {部署コード} → {部署名}

という二段階の関数従属が存在する。
これを推移的関数従属と呼ぶ。

表3 第3正規形

社員テーブル

会社コード 社員ID 社員名 年齢 部署コード
001 00A 阿笠 30 D1
001 00B 伊藤 20 D2
002 00A 内海 40 D3
002 00F 江藤 50 D1
002 00F 江藤 50 D4

会社テーブル

会社コード 会社名
001 Aシステム
001 Bコンサル

部署テーブル

部署コード 部署名
D1 開発
D2 営業
D3 人事
D4 総務

参考文献

この記事は以下の情報を参考にして執筆しました。

達人に学ぶDB設計徹底指南書