正規化について
正規化とは
データの冗長性(同じもの)をなくす手法。
正規化には段階があり、
第一正規化~第五正規化まで存在する。
しかし、実際は第三正規化まで行えば十分な場合が多い。
なので、今回教える正規化は第三正規化のところまで。
例題等も第三正規化まで行った状態を使って説明する。
それぞれ正規化した状態のテーブルを「正規形」という。
第一正規化が終われば、その時点の状態は第一正規形、
第二正規化が終われば、第二正規形と続いていく。
では、もし冗長性が残った状態だとデータにどのような影響が出てくるか?
次のデータを使って見ていく。
- 非正規形(正規化していない状態)
- 貸出履歴テーブル
- 貸出履歴テーブル
- 第三正規形(第三正規化まで済んだ状態)
- 貸出履歴テーブル
- 貸出履歴明細テーブル
- 書籍テーブル
- ユーザテーブル
- 貸出履歴テーブル
登録
新しい書籍を登録してみる。第三正規形
単純に図書CD、ISBN、タイトルを書籍テーブルに登録すればOK!- 書籍テーブル
- SQL
INSERT INTO 書籍テーブル (図書CD, ISBN, タイトル)
VALUES ('103001', '4567890123', '童話全集');
- SQL
- 書籍テーブル
非正規形
新しい商品を登録しようとしても、図書CD、ISBN、タイトル以外の項目も- 貸出履歴テーブル
- SQL
INSERT INTO 貸出履歴テーブル (貸出番号, 貸出日, 返却日,
図書CD, ISBN, タイトル,
ユーザCD, ユーザ名, 住所, 電話番号)
VALUES ('047004', '1900/01/01', '1900/01/01',
'103001', '4567890123', '童話全集'
'99999', 'ダミー', 'なし', '999-9999-9999');
- SQL
- 貸出履歴テーブル
更新
ユーザ情報(ユーザ名、住所)を更新してみる。第三正規形
ユーザCDで絞って、ユーザ名、住所を変更すればOK!- ユーザテーブル
- SQL
UPDATE ユーザテーブル
SET ユーザ名 = '高橋', 住所 = '京都'
WHERE ユーザCD = '00002';
- SQL
- ユーザテーブル
非正規形
実はこちらも、ユーザCDで絞って、ユーザ名、住所を変更すればOK!
ただし、第三正規形と同じく一人のユーザ情報の更新なのに、
貸出履歴テーブルにある更新対象のユーザ情報をすべて更新することになる。- 貸出履歴テーブル
- SQL 第三正規形のSQLと見比べると、テーブル以外は見た目上変わらないが、
UPDATE 貸出履歴テーブル
SET ユーザ名 = '高橋', 住所 = '京都'
WHERE ユーザCD = '00002';
もし対象のユーザCDが貸出履歴テーブルに100万もあったら、処理上では100万個分のデータが更新される。
- SQL
- 貸出履歴テーブル
削除
書籍を削除してみる。第三正規形
図書CDを指定すればOK!- 書籍テーブル
- SQL
DELETE FROM 書籍テーブル
WHERE 図書CD = '100002';
- SQL
- 書籍テーブル
非正規形
こちらも図書CDを指定すればOK!
ただし、指定した図書CDが存在する他の貸出履歴まで削除される。
また、過去に1度しか貸し出されたことのない書籍を含む貸出履歴データが削除されると、
書籍情報が失われてしまう。- 貸出履歴テーブル
- SQL 更新と同じく、第三正規形のSQLと見比べると、テーブル以外は見た目上変わらないが、
DELETE FROM 貸出履歴テーブル
WHERE 図書CD = '100002';
もし対象の書籍CDが貸出履歴テーブルに100万もあったら、処理上では100万個分のデータが更新される。
- SQL
- 貸出履歴テーブル
まとめ
実際に正規化をしている状態と、していない状態を見比べると、
データの登録、更新、削除の単純さが見えてくる。
- 正規形
- 一つのデータの登録、更新、削除で済む。
- 同じデータがないので管理もしやすい。
- 非正規形
- 登録時は他のデータの値まで用意する 。
- 更新・削除時は思わぬデータまで更新・削除してしまう可能性が高い上、
同じデータに対しての更新・削除処理が多く走ってしまう場合がある。 - 同じデータがいくつも存在するので管理しづらい。
まとめると、
正規形・・・冗長性がない状態で、データ操作が単純で管理しやすい。
非正規形・・・冗長性がある状態で、データ操作がすごくやりづらい、管理しづらい。
今回は単純なテーブルを使用したが、項目数(列)が多くなると不便さがさらに増えるため、 正規化はデータ操作や管理をしやすくする為にも必要な手法となる。