学習ログです。
正規形
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設計徹底指南書