#概要
正規化とはDBを設計する際に重要となってくるデータ管理の概念。
DB設計って何?正規化って何?
この記事はそういった方々に対して
また自分の備忘録でもあります。。。
##DB設計とは?
システム開発を行う上で最初にDBの設計を行っていくことで強固なDBを作ろうという理論。
まず、データベースを設計する際に重視される考え方として、
DOA(データ中心アプローチ)がある
DOAの考え方として、振る舞いから考えるのではなく、
システムの中で必要なデータからシステム構造を考えていく考え方である。
###なぜ、DOAを採用するべきなのか?
例えば、1000個のデータが既に商品テーブルに保存されているとします。
商品テーブルに商品番号カラムを新たに追加することになりました。
こうなると、1000個のデータを修正する必要が出てきます。
ですが、最初の時点(=DBを設計する)で修正するのなら、
どちらが少ない労力で作業を済ませられるのかは明白です。
DB設計を行うことでシステムを開発していく上で強固かつ効率的にDBを作成することができます。
##正規化とは何?
設計段階で重複してしまう冗長なデータを排除し、データの一元的な管理を目指す理論。
重複するデータが存在することでDBを変更する必要がある場合、Aは直したのにBは直していなかったなどの不具合を発生させてしまう。
###重複するデータとは何か?
重複するデータとは複数のレコードが同じデータを持っていることを指す。
商品テーブル
商品名 | 仕入先 | 仕入先コード |
---|---|---|
りんご | A商会 | A001 |
みかん | A商会 | A001 |
ぶどう | B商会 | A002 |
りんごとみかんの仕入先をA商会からB商会に変更する際、現在のデータベースだと
仕入先と仕入先コードを変更する必要が出てくる。
このような状態ではA商会をB商会に変更したが、仕入先コードの変更を忘れた。
あるいは仕入先コードを変更したが、A商会をB商会に変更することを忘れた。
こういったミスが生じ、DBに矛盾が生じてしまう。
そのため、正規化でテーブルからデータの重複をなくしていく必要がある。
##正規化の段階
正規化には段階があり、
非正規形から第5正規形までの段階が存在する。
この記事では第三正規形までを取り扱います。
非正規形とは正規化を何も行っていない段階を指す。
前述したデータの重複を起こす危険があり、DBを管理していく上では不適切。
第一正規形は一つのカラムに一つのデータが保存されている状態を指す
一つのカラムに一つのデータが保存されている状態とは、一つのカラムにカンマ区切りやスペースで区切って複数の値が入っていないことを指す。
第二正規形は完全関数従属で保存されている状態を指す
そもそも関数従属とは何か?
関数従属とはAの値が決まると、Bの値もわかる関係性を指す。
先ほど、説明に使った商品テーブルで例えると、
商品名 | 仕入先 | 仕入先コード |
---|---|---|
りんご | A商会 | A001 |
みかん | A商会 | A001 |
ぶどう | B商会 | A002 |
仕入先が決まれば、仕入先コードも決まる。
この関係性を関数従属という。
そして、完全関数従属は部分関数従属が排除された状態を指す。
部分関数従属とは、キーの一部が主キーに従属した状態を指す。
仕入伝票 | 商品名 | 注文数 | 単価 |
---|---|---|---|
1 | りんご | 20 | 100 |
2 | みかん | 100 | 100 |
3 | ぶどう | 10 | 150 |
このテーブルの主キー(レコードを特定するカラム)は仕入伝票と商品名である。
この場合、部分関数従属とは商品名カラムと単価カラムになる。
りんごとわかれば、自然と単価も決まってくるからです。
なので、第二正規形とする場合は
仕入伝票 | 商品名 | 注文数 |
---|---|---|
1 | りんご | 20 |
2 | みかん | 100 |
3 | ぶどう | 10 |
商品名 | 単価 |
---|---|
りんご | 100 |
みかん | 100 |
ぶどう | 150 |
仕入テーブルと商品テーブルを分割し、管理する形式になります。
第三正規形は推移関数従属を排除したテーブルの状態を指す
推移関数従属
主キー以外の属性同士で従属関係を持っている状態
仕入伝票 | 仕入先 | 仕入先コード | 商品名 | 注文数 |
---|---|---|---|---|
1 | A商店 | A001 | りんご | 20 |
2 | A商店 | A001 | みかん | 100 |
3 | B商店 | A002 | ぶどう | 10 |
仕入テーブルの主キーは仕入伝票にあたる
しかし、このテーブルでは仕入先と仕入先コードは従属性を持っている。
なので、この場合は
仕入伝票 | 仕入先 | 商品名 | 注文数 |
---|---|---|---|
1 | A商店 | りんご | 20 |
2 | A商店 | みかん | 100 |
3 | B商店 | ぶどう | 10 |
仕入先 | 仕入先コード |
---|---|
A商店 | A001 |
B商店 | A002 |
このように仕入テーブルと仕入先テーブルを分割することで第三正規形となる。
#要約
テーブルの各カラムが依存することでデータの重複が発生してしまう。
そのため。正規化とは主キー以外の依存を排除している。