💽

正規化と写像【RDB】

に公開

データベースを勉強する中で,正規化がいまいち理解できなかったので,写像を用いて整理した際のメモである.

準備

テーブル

以下のようなテーブルを考える.

社員ID 社員氏名 部署ID 部署名
1 佐藤 101 部署A
2 鈴木 102 部署B
3 渡辺 102 部署C
4 田中 105 部署D

このテーブルにおいて, X=\{社員ID、社員氏名、部署ID、部署名\}属性と呼び, D(社員ID \in X)=\{1,2,3,4\} となる集合族を ドメイン,ある行をタプル R と呼ぶ.

また,これらの要素をまとめたものをテーブル <X,D,R>と呼ぶ.

スーパーキーと候補キー

スーパーキーとは,タプルを一意に決定できる属性の集合を指す.このスーパーキーは複数存在し,属性 X もスーパーキーである.このスーパーキーの極小元を候補キーという.これは主キーの候補のため,こう呼ばれる.

写像

ある入力に対して出力が一意に決まるものを写像という.このうち,入力と出力が一対一で対応する場合には全単射という.このことから,RDBはスーパーキーを入力,タプルを出力とする全単射の写像であると考えられる.

RDBにおける正規化

データベースにおける正規化とは,テーブル(リレーション)を写像として考えた際に,その部分関数従属性を解消していく作業になる.

第1正規化

第1正規化は単純に重複する行を削除することを指す.これは候補キーに対してタプルが全単射とするためである.

第2正規化

複数の候補キーが存在し,かつ一部の候補キーにのみ従属する非キー属性が存在する状況を部分関数従属という.第2正規化はこの部分関数従属を解消することを指す.ここでは,一部の候補キーにのみ従属する非キー属性を取り出し新たなテーブルを作成することで,すべての候補キー要素の属性に対して全単射とする.

第3正規化

第3正規化はある非キー属性から別の非キー属性に対して部分関数従属性を解消することを指す.ここでは,非キー属性の中から部分関数従属する属性間の写像を取り出し新たなテーブルを作成する.

演習

ここまでの内容をまとめて,具体例を用いてテーブルを正規化していく.

筆者は音楽ゲームが趣味なのだが,これらの中にはデバイス・楽曲・難易度単位で様々な設定を変更可能なものが存在する.これらを管理するテーブルを想定する.

まず愚直にこれらを列挙すると,以下のようになる.

今回の描画にはPlantUMLを用いた.

上記の例では,ユーザ名とユーザIDの間に部分関数従属性があるため,これを解消した第2正規形は以下のようになる.

ここで,●は外部キーを表す.

また,楽曲IDと \{ゲーム名,デバイス名,楽曲名,難易度名\},およびオプション情報間には推移関数従属性があるため,これらを解消すると以下のようになる.

参考

https://zenn.dev/paruma184/articles/4b3d95f760fc58

https://zenn.dev/shimiyu/articles/57dcd5576a0fcc

Discussion