ゼロから始めるPHP講座Vol.33 データベースの設計〜正規化②



ゼロから始めるPHP講座Vol.33 データベースの設計〜正規化②
目次
  1. ゼロから始めるPHP講座データベースの設計正規化②
  2. 第1正規化
  3. 第2正規化
  4. 第3正規化
  5. 正規化まとめ

ゼロから始めるPHP講座データベースの設計正規化②

第1正規化

非正規形から第1正規化への正規化では、「導出属性の削除」と「繰り返し項目の分離」を行います。

導出属性とは同じテーブルの中で、「その値が他のカラムから導くことができる」値のことを指します。非正規形のテーブルを第一正規化する際、導出属性は削除します。

今回の場合、合計金額は[単価×数量]から導くことができるので、合計金額が導出属性となります。

繰り返し項目とは、関連性のある2つのデータXとYがあった際、Xに対してYの値が複数存在することを指します。

今回の場合、Xが注文情報[注文日、名前、住所、電話番号]で、Yが商品情報[商品名、単価、数量]となっており、1つの注文情報Xに対して、商品情報Yが複数あります。

文章だけでは理解しづらいと思いますので、発注テーブルに対して、導出属性の削除と繰り返し項目の分離により、第一正規化を行ってみます。

導出属性の削除php_normalization2-1-639

今回の例では導出属性が1つだけですが、複数あった場合、全て削除を行います。

繰り返し項目の分離php_normalization2-2-639

分離の際、発注テーブルで主キーとなっていた注文番号を、発注詳細テーブルにも設定しています。これにより、注文番号は発注テーブルと発注詳細テーブルを紐付けるキーとなります。

今回の例では、注文番号が元々主キーとして存在しておりましたが、もし主キーが存在しない場合は、主キーを付け加えます。

第1正規化の手順についてまとめると、

導出項目を削除する第1正規化

これにより、整合性を保ったまま重複しているデータが減り、冗長性が低下します。

また、第1正規化を行ったテーブルを第1正規形と呼びます。

第2正規化

第1正規形から第2正規化への正規化では、主キー以外の項目(非キー)の情報に依存している情報の分離を行います。

発注詳細テーブルの[注文番号、商品名、単価、数量]のうち、単価は商品ごとに決められているものであり、注文したユーザには依存しておりません。つまり、単価は主キーである注文番号に依存しておらず、非キーである商品名に依存しています。

このような非キー依存の情報の分離を行い、全てのテーブルで非キーに依存している情報をなくして、全ての非キー属性にキーが1つある状態にすることが、第2正規化の内容となります。

文章だけでは理解しづらいと思いますので、発注詳細のテーブルに対して、主キー以外に依存している情報の分離により、第2正規化を行ってみます。

非キー依存の情報を分離php_normalization2-3-639

分離の際、発注詳細テーブルと商品テーブルを紐付けるキーが存在しなかったため、「商品番号」というキーを新たに付け加えています。

第3正規化

第2正規形から第3正規化への正規化では、主キーに依存しているが、情報として独立できるものを分離します。

発注テーブルの[注文番号、注文日、名前、住所、電話番号、支払方法]のうち、[名前、住所、電話番号]は注文番号に依存はしてますが、それ単独で顧客情報として独立が可能です。

第1正規化、第2正規化と同様、文章だけでは理解しづらいと思いますので、発注テーブルに対して、第3正規化を行ってみます。

主キーに依存しているが、情報として独立できるものを分離php_normalization2-4-639

発注テーブルから[名前、住所、電話番号]の情報を顧客情報テーブルへと分離しました。

分離の際、発注テーブルと顧客情報テーブルを紐付けるキーが存在しなかったため、「顧客番号」というキーを新たに付け加えています。

正規化まとめ

第1正規化から第3正規化まで、その手法について説明しましたので、以下にまとめます。

導出項目を削除する第1正規化第2正規化第3正規化

正規化を行うことにより、データの整合性を保ったまま、データの冗長性が軽減され、データを効率的に管理できるようになります。

実際に非正規形である発注テーブルを第3正規化まで行った結果が以下となります。php_normalization2-5-639

php_normalization2-6-639

データ型は適切な設定を行ってください。phone_numberはVARCHAR、order_dateはDATETIMEを設定する必要があります。

NEXTLESSONデーターベースの結合内部結合データーベースの結合内部結合

PREVLESSONデータベースの設計正規化①データベースの設計正規化①

CodeCampus編集部
この記事を書いた人
CodeCampus編集部
\ 無料体験開催中!/自分のペースで確実に習得!
オンライン・プログラミングレッスンNo.1のCodeCamp