- 更新日: 2017年02月27日
- 公開日: 2015年12月08日
ゼロから始めるPHP講座Vol.33 データベースの設計〜正規化②
ゼロから始めるPHP講座データベースの設計正規化②
第1正規化
非正規形から第1正規化への正規化では、「導出属性の削除」と「繰り返し項目の分離」を行います。
導出属性とは同じテーブルの中で、「その値が他のカラムから導くことができる」値のことを指します。非正規形のテーブルを第一正規化する際、導出属性は削除します。
今回の場合、合計金額は[単価×数量]から導くことができるので、合計金額が導出属性となります。
繰り返し項目とは、関連性のある2つのデータXとYがあった際、Xに対してYの値が複数存在することを指します。
今回の場合、Xが注文情報[注文日、名前、住所、電話番号]で、Yが商品情報[商品名、単価、数量]となっており、1つの注文情報Xに対して、商品情報Yが複数あります。
文章だけでは理解しづらいと思いますので、発注テーブルに対して、導出属性の削除と繰り返し項目の分離により、第一正規化を行ってみます。
導出属性の削除
今回の例では導出属性が1つだけですが、複数あった場合、全て削除を行います。
繰り返し項目の分離
分離の際、発注テーブルで主キーとなっていた注文番号を、発注詳細テーブルにも設定しています。これにより、注文番号は発注テーブルと発注詳細テーブルを紐付けるキーとなります。
今回の例では、注文番号が元々主キーとして存在しておりましたが、もし主キーが存在しない場合は、主キーを付け加えます。
第1正規化の手順についてまとめると、
導出項目を削除する第1正規化
これにより、整合性を保ったまま重複しているデータが減り、冗長性が低下します。
また、第1正規化を行ったテーブルを第1正規形と呼びます。
第2正規化
第1正規形から第2正規化への正規化では、主キー以外の項目(非キー)の情報に依存している情報の分離を行います。
発注詳細テーブルの[注文番号、商品名、単価、数量]のうち、単価は商品ごとに決められているものであり、注文したユーザには依存しておりません。つまり、単価は主キーである注文番号に依存しておらず、非キーである商品名に依存しています。
このような非キー依存の情報の分離を行い、全てのテーブルで非キーに依存している情報をなくして、全ての非キー属性にキーが1つある状態にすることが、第2正規化の内容となります。
文章だけでは理解しづらいと思いますので、発注詳細のテーブルに対して、主キー以外に依存している情報の分離により、第2正規化を行ってみます。
非キー依存の情報を分離
分離の際、発注詳細テーブルと商品テーブルを紐付けるキーが存在しなかったため、「商品番号」というキーを新たに付け加えています。
第3正規化
第2正規形から第3正規化への正規化では、主キーに依存しているが、情報として独立できるものを分離します。
発注テーブルの[注文番号、注文日、名前、住所、電話番号、支払方法]のうち、[名前、住所、電話番号]は注文番号に依存はしてますが、それ単独で顧客情報として独立が可能です。
第1正規化、第2正規化と同様、文章だけでは理解しづらいと思いますので、発注テーブルに対して、第3正規化を行ってみます。
主キーに依存しているが、情報として独立できるものを分離
発注テーブルから[名前、住所、電話番号]の情報を顧客情報テーブルへと分離しました。
分離の際、発注テーブルと顧客情報テーブルを紐付けるキーが存在しなかったため、「顧客番号」というキーを新たに付け加えています。
正規化まとめ
第1正規化から第3正規化まで、その手法について説明しましたので、以下にまとめます。
導出項目を削除する第1正規化第2正規化第3正規化
正規化を行うことにより、データの整合性を保ったまま、データの冗長性が軽減され、データを効率的に管理できるようになります。
実際に非正規形である発注テーブルを第3正規化まで行った結果が以下となります。
データ型は適切な設定を行ってください。phone_numberはVARCHAR、order_dateはDATETIMEを設定する必要があります。
NEXTLESSONデーターベースの結合内部結合データーベースの結合内部結合
PREVLESSONデータベースの設計正規化①データベースの設計正規化①
- この記事を書いた人
- CodeCampus編集部