この記事では、データベースの正規化について解説していきます。
VBA関連解説
正規化について
正規化とは、データの一貫性を維持し、データの不整合や冗長性を排して、データベースを設計する手法です。
データを保管する、テーブルの構造を設計する手法と考えて下さい。
手順は、正規化前の不整合な状態から、第1正規形〜第2正規形〜第3正規形〜ボイスコッド正規形〜第4正規形〜第5正規形と進めながら、データの不整合を排除していきます。
理論上は第5正規形まで進めますが、一般的に、運用上は第3正規形までで充分と言われていますので、今回は第3正規形までを解説していきます。
テーブル構造
データを保管するリスト構造をテーブルと呼びます。
テーブルの行方向のデータはレコード(タプル)、列方向のデータはフィールド(属性)と呼びます。
データの蓄積はレコード毎におこない、各フィールドにデータを格納していきます。
正規化手順
サンプルデータ
データ取得用サンプルとして、注文書を3つ用意しました。
注文書は、ヘッダー部分に受注情報、明細欄に商品情報があります。また、各注文書は明細数が異なっています。
この注文書の内容を取り込むテーブルを作成していきます。
正規化前
各注文書を、テーブルに一行づつデータとして取り込むと、次のようなリスト構造となります。
第1正規形
正規化前の不整合なテーブルを、正規化していきます。
第1正規化の実行内容は、下記の項目となります。
正規化
まずは、非正規形のテーブルのレコード内の繰り返し項目を排除します。繰り返し項目である、明細部分を新規のレコードとして取り込みます。
次に、複数項目が内在するフィールドを分割します。注文者フィールドには、IDと名称が入っているので、これを分割します。
最後に、導出項目フィールドを排除します。金額フィールドは 単価×数量 で計算できるので、削除します。
これで、テーブルは第1正規形となりました。
用語解説
第2正規化に入る前に、用語の解説をしていきます。語彙だけでは難解なので、実例も参考にイメージを捉えていきましょう。
候補キー
候補キーとは、レコードを一意に特定するためのフィールド(属性)のことです。候補キーは複数の場合があります。(レコードを特定する主キーを決定する際に候補となるものが候補キーです。)
フィールドの値が決まると、レコードが一つ特定されるという特性を持ったフィールドを、候補キーと呼びます。下のテーブルでは、ユーザーIDが候補キーとなります。
また、レコードの特定に、フィールド1の値とフィールド5の値の特定が必要な場合などは、フィールド1・5が候補キーとなり、候補キーが複数になります。下のテーブルでは、注文番号と商品コードが候補キーとなります。
関数従属
関数従属とは、フィールド(属性) Xの値が決まるとフィールド(属性) Yの値が決まる関係のこと(X→Y)
例えばY=2X の場合 、Xの値が4に決まれば Yの値は8に決まるというように関数的に表現され、YはXに関数従属していると言います。
部分関数従属
部分関数従属とは、1つの候補キーに関数従属するフィールド(属性)のことです。関数従属するフィールド(属性)は、複数の場合があります。
第2正規形
第1正規形のテーブルを、正規化していきます。
第2正規化の実行内容は、下記の項目となります。
正規化
注文番号と商品コードが候補キーとなるので、部分関数従属しているフィールドを抜き取り、3つのテーブルにに分割します。
これで、テーブルは3つに分割され、第2正規形となりました。
第3正規形
第2正規形の分割されたテーブルを、正規化していきます。
第3正規化の実行内容は、下記の項目となります。
正規化
注文者名は注文者IDに関数従属しているので、テーブルを分割します。
これで、テーブルは4つに分割され、第3正規形となりました。
データモデリング
第3正規形までの正規化の手順を解説してきましたが、サンプルとしてできあがったテーブル構造は、設計の悪さがあります。
本格的にテーブル設計をするには、ER図などを駆使したデータモデリングの手法を用いて、実際の業務の流れに沿ったテーブル設計を行います。
このサイトでは、小規模なデータを扱っていますので、正規化の実行時(特にテーブルを分割する時)に、データの登録や更新による変化が、実際の業務の流れに適合しているかを確認しながら進めていくといいでしょう。
構造修正
第2正規化で商品マスタに分割した、単価フィールドに注目してみましょう。
注文書データを表示すると、単価フィールドの価格が適用される構造となっています。
仮に値上げが発生した場合に、商品マスタの単価を変更すると、過去の注文書データも変更された単価が表示されてしまいます。これでは、過去履歴が参照できませんね。
そこで、単価を販売単価と最新単価に分けて考え、次のように修正しました。
これで、実際の業務の流れに沿ったテーブル構造となりました。
データベースの正規化は理解できたでしょうか。難解な語句も含まれるので、実際にテーブルを正規化しながら、繰り返し解説を読んでいくと理解が進んでいきます。
また、この記事だけでなく、他のサイトや解説書なども参考にして下さい。様々な解説に触れると、自分に合ったものに出会えると思います。
概要解説に戻る
www.minizaiko.com