暮らすに+

クラスタス

システム

データベースの正規化とは?正規化の段階の違いとメリット・デメリット

投稿日:

リレーショナルデータベースを設計する上で、必ず意識するのが正規化です。

正規化とは

データの重複や無駄をなくし、効率的にデータを利用できるようにすることを正規化と呼びます。正規化を行うことで、データの安全性が担保され、メンテナンス性やパフォーマンスを向上させることが可能です。なお、正規化の段階は、第1正規化から第5正規化まで存在しますが、第3正規化までが使われるのが通常です。

正規化のメリット

正規化をすることによるメリットには、以下のようなことが挙げられます。

・データの重複がなくなる

・ディスク領域の削減につながる

・ER図で、システムの全体像が理解しやすい

 

正規化のデメリット

一方、デメリットもあります。

・テーブルが細かく分かれてしまうので、必要な情報を取得する場合に、結合が多くなってしまう

・テーブルが多くなることで、コーディングも面倒になってしまう

 

非正規化の状態

正規化が行われていない状態を非正規化と呼びます。下記のようなエクセルでのデータ管理をイメージすると分かりやすいかと思います。

 

 

 

日付

顧客コード

顧客名

エリアコード

エリア名

商品コード1

商品名1

単価1

数量1

商品コード2

商品名2

単価2

数量2

商品コード3

商品名3

単価3

数量3

 

 

2017/01/01

customer001

田中一郎

Area01

1丁目

Product001

みかん

100

10

Product002

りんご

150

5

Product003

バナナ

70

20

 

 

2017/01/02

customer002

山田花子

Area02

2丁目

Product002

りんご

150

10

Product004

スイカ

1500

2

 

 

 

 

 

 

2017/01/03

customer003

小林三郎

Area01

1丁目

Product001

みかん

100

10

Product004

スイカ

1500

1

 

 

 

 

 

 

 

第1正規化

非正規化の繰り返しを排除することを第1正規化と呼びます。

先ほどの非正規化の場合、同じ顧客に対して、商品1、商品2、商品3と同じような項目が横並びに並んでいますので、これをそれぞれ別のレコードとします。

受付番号、日付、顧客名は共通なので、以下のような形になります。

 

 

 

日付

顧客コード

顧客名

エリアコード

エリア名

商品コード

商品名

単価

数量

 

 

2017/01/01

customer001

田中一郎

Area01

1丁目

Product001

みかん

100

10

 

 

2017/01/01

customer001

田中一郎

Area01

1丁目

Product002

りんご

150

5

 

 

2017/01/01

customer001

田中一郎

Area01

1丁目

Product003

バナナ

70

20

 

 

2017/01/02

customer002

山田花子

Area02

2丁目

Product002

りんご

150

10

 

 

2017/01/02

customer002

山田花子

Area02

2丁目

Product004

スイカ

1500

2

 

 

2017/01/03

customer003

小林三郎

Area01

1丁目

Product001

みかん

100

10

 

 

2017/01/03

customer003

小林三郎

Area01

1丁目

Product004

スイカ

1500

1

 

 

 

第2正規化

第2正規化を理解するために、「部分関数従属」という概念を理解しておきましょう。

主キー

まず主キーについて押さえておきましょう。データベースでレコードを1つに絞り込めるものを主キーと呼びます。上の第1正規化のテーブルの場合は、日付、顧客コード、商品コードが決まれば、どのレコードか判断がつきますので、日付・顧客コード・商品コードが主キーとなります。

部分関数従属

次に、ある属性が決まれば、その他の項目が決まることを関数従属と呼びます。第1正規化の状態では、顧客コードが決まれば顧客名が、商品コードが決まれば商品名や単価が分かります。

主キー全体に従属することを完全関数従属、主キーの一部に従属することを部分関数従属と呼び、第2正規化では部分関数従属を分離させます。

 

具体的に実施してみましょう。第1正規化の状態から、顧客名と商品名、単価を分離します。

 

購入テーブル

 

 

 

日付

顧客コード

商品コード

数量

 

 

2017/01/01

customer001

Product001

10

 

 

2017/01/01

customer001

Product002

5

 

 

2017/01/01

customer001

Product003

20

 

 

2017/01/02

customer002

Product002

10

 

 

2017/01/02

customer002

Product004

2

 

 

2017/01/03

customer003

Product001

10

 

 

2017/01/03

customer003

Product004

1

 

 

 

 

 

顧客テーブル

 

 

 

顧客コード

顧客名

エリアコード

エリア名

 

 

customer001

田中一郎

Area01

1丁目

 

 

customer002

山田花子

Area02

2丁目

 

 

customer003

小林三郎

Area01

1丁目

 

 

 

 

 

商品テーブル

 

 

 

商品コード

商品名

単価

 

 

Product001

みかん

100

 

 

Product002

りんご

150

 

 

Product003

バナナ

70

 

 

Product004

スイカ

1500

 

 

 

 

分離することで、シンプルになりました。

 

第3正規化

推移的関数従属

第2正規化で作成した顧客テーブルを見ると、エリアの部分が重複していることがわかります。このように主キー以外の項目で、項目間で依存関係を持っているものを推移的関数従属と呼びます。

 

推移的関数従属を分離したものが、第3正規化です。

主キーに関する依存関係を分離するのが第2正規化、主キー以外に関する依存関係を分離するのが第3正規化となります。

 

顧客テーブルを、分離してみると以下のようになります。

 

顧客テーブル

 

 

 

顧客コード

顧客名

エリアコード

 

 

customer001

田中一郎

Area01

 

 

customer002

山田花子

Area02

 

 

customer003

小林三郎

Area01

 

 

 

 

 

エリアテーブル

 

 

 

エリアコード

エリア名

 

 

Area01

1丁目

 

 

Area02

2丁目

 

 

 

 

第4正規化・第5正規化・ボイスコッド正規化

実際の設計上は、ほとんどが第3正規化までとなります。意図して設計をしなければ、ボイスコッド、第4、第5に進むことはないと言っていいでしょう。

 

あえて正規化を崩す場合

データの整合性が担保されるなど、正規化をすることのメリットは多いですが、場合によってはあえて第1正規化で止めておく、ということもあります。

それは、近い将来的に仕様変更などが起こると予測される場合です。

大きい設計変更があった場合、正規化がされている方が修正のコストが大きくなるため、仕様が固まっていない場合は、あえて第1正規化で止めておく方が良かったりします。

 

また、検索のパフォーマンスを上げるために、正規化を崩すという場合もあります。

例えば、上記の第3正規化の場合、顧客テーブルとエリアテーブルを結合することで、第2正規化の顧客テーブルと同じ結果となります。結合することによって、パフォーマンスが劣ることがあれば、あえて第2正規化で止めておくことを選択することもあります。

 

データベースの正規化まとめ

データベースを設計する上で、正規化の概念は必須です。

正規化を理解していなくても、論理的にデータベースを管理しようとすると、第2、第3正規化にたどり着くでしょう。しかし、正規化を正しく理解しておくことで、想定していた通りのパフォーマンスを発揮するはずです。

正規化を理解しておくことで、意図して第1正規化で止めておく

-システム

Copyright© クラスタス , 2019 AllRights Reserved Powered by AFFINGER4.