10
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【第4正規化】業務に必要ないとか言われてるけど簡単だから勉強しようよ【RDB】

Last updated at Posted at 2017-02-22

正規化は第3以上ではこれが一番簡単でしたのでこの際勉強してみましょう。

業務上、正規化は第3正規型までで十分である。

誰が言い出したかしらないこの一文のせいで多数のエンジニアに学習されること無く埃にかぶっている第4正規化ですが、
ついにパンドラの箱を開ける時が来ました。

(えらそうなこと言ってますが私もそんな意識の低いエンジニアの一人でした)

どんな時に第4正規化に反するレコードができるの?

一つの関連テーブルを使いまわして
複数の「N:Nのリレーション」を表現すると発生します。

関連テーブルとはN:Nのリレーションを表現するために用意されるテーブルのことです。

例えば2つのN:Nの関連があり

  • コースと参考図書
  • コースと講師

それを下記のような一つのテーブルで表現してしまったとします。

コース 参考図書 講師
AHA Silberschatz John D
AHA Nederpelt John D
AHA Silberschatz William M
AHA Nederpelt William M
AHA Silberschatz Christian G
AHA Nederpelt Christian G
OSO Silberschatz John D
OSO Silberschatz William M
  • コースAHAの関連図書は{Silberschatz,Nederpelt}の2冊です
  • コースAHAの講師は{John D,William M,Christian G}の3人です。

※講師によって参考図書が変わるということは今回は起こりません。学生時代に高額な教材を買わされたことは一旦忘れてください。

この独立した2つのN:Nのリレーションを1つのテーブルで表現してしまったために、
直積集合(AHAの場合、(参考図書2冊)✕(講師3人)=(レコード6件))が現れています。これは明らかに冗長です。
このため、データの整合性を取るためにコースに参考図書を1冊増やすたびに講師の数だけレコードを作らないといけません。

また主キーが

  • コース
  • 参考図書
  • 講師

の3つの組にしかしようが無いので(この3組を指定しないと行を一つに特定できません)
どれかがnullのレコードをつくることができません。

講師が決まっていないコースの参考図書を一旦登録したり、参考図書の無いコースを登録することができなくなります。

どうすれば第4正規型に正規化できますか?

独立しているN:Nの関連を個別のテーブルに分解する

この方法に尽きます

コースと参考図書

コース 参考図書
AHA Silberschatz
AHA Nederpelt
OSO Silberschatz

コースと講師

コース 講師
AHA John D
AHA William M
AHA Christian G
OSO John D
OSO William M

以上で第4正規化はおしまいです。

第4正規型のちゃんとした定義

恐らくWikipediaと同じ解説になってしまうと思うのでwikipediaを参照してください。

解説にwikipediaと同じテーブルを使っているので
ここまで読んだ人は0から読むより早く理解できると思います

参考

SQLアンチパターン(付録の正規化)
達人に学ぶDB設計 徹底指南書
関係の正規化 - Wikipedia

10
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?