データベースの正規形についてわかりやすくまとめてみた
データベースの正規形とはなんぞや!?
第1〜第5まであって、それぞれの違いもよくわからんし、なんだか専門用語も多く出てきて、またさらによくわからんくなるし・・・
ということで、とりあえずこんな感じの理解でいいだろうと自分を納得させられるレベルまでは学習できたので、それをアウトプット。
今回扱うのは第1〜第3までの正規形とする。
まず、データベースはそもそもとして
- データが出しやすい!
- データを入れやすい!
の二つの要件が必須になる。
当たり前だろ!と思うかもしれないが、ここから入る。
つまりどういうことかというと
- データの出しやすさ: 第1正規形
- データの入れやすさ: 第2、第3正規形
となる。
データの出しやすさとは、必要なデータが必要な形で取り出せることであり。
例えば、ある商品の価格を知りたいとする。
こんな時、300円か、500円です!
と、二つ出てきても困るし、(一意性)
わかりません!(NULL)
と、出てきても困るわけだ。
まぁ、当然なんだが、これをこうならないようにしましょうというのが第1正規形。
そして、第2・第3正規形は、この第1正規形を保ちつつ、かつ間違いを減らせるようにデータの入れやすさを工夫された形となる。
第2・第3と一応順番で考えるような流れなので、このメリットは第2のところで説明がなされていることが多いが、データの入れやすさ、ということでは共通である。
例えば取引記録のテーブルがあり、取引先コードと取引先名、商品コードと商品名とがあるといった場合に、各コードのみを入力させ、外部のテーブルから名前を呼び出すようにすれば、入力ミスを減らすとがでる。
また、取引は実際にまだ行われていないが、先に登録だけしておきたいといった場合、取引記録テーブルと分ければ、取引先を新規登録しても取引がない(NULL)という事態を避けることが可能となる。
では違いはどこにあるのかという点であるが
第2正規形:部分関数従属
第3正規形:推移的関数従属
この部分なのか推移的なのかという点のみである。
違いはあるのかといえば違いはあるのだが、全体は部分の集合であるわけなのでないといえばない。
ちなみに関数従属っていうのは先ほどのコードと名称の関係性のようなものであり、そのような理解で多分問題ない。
一応の違いは
先程の例でいけば取引先コードと取引先名だけをテーブルとして分けようという場合には部分的。
データベースとして取引先の電話番号も同時に載せようよ!ってなれば取引先コード、取引先名、電話番号と推移的に関数従属があるようなケース。
なんとなくこんな感じ。
まぁとにかく冒頭で述べたように
- データの出しやすさ: 第1正規形
- データの入れやすさ: 第2、第3正規形
ってあたりがわかってれば当面は良さそうな気がします^^;
関数従属とかその辺りの厳密な定義については集合とかその辺が絡んできて闇が深そうなので、曖昧な感じでとりあえずごまかします!
ちょっとデータベースに興味が湧いてきたので本格的に勉強したらまた更新すると思います。(イメージは掴んだけど詳細はまだ間違ってると思う汗)