
正規化:データベース設計の基本:その3
REV4
ブログ投稿しています。複数画像付き等最終版は此方から、ご覧ください。
基本に立ち返る意味で、正規化の手順を先ず記して、幾つかの正規化手順について纏めて複数回の分けて、ご説明したいと思います。
先ずは正規化の手順ですが、以下の通りと言われています。
第一正規化手順
第二正規化手順
第三正規化手順
ボイスコッド正規化手順
第四正規化手順
第五正規化手順
第六正規化手順
第六正規化手順は正確に存在するかは?です。(説明は無しにするかもしれません)
この内、通常利用されているのは第一手順から第三手順までが多い様です。従って、今回は第一正規化手順から第三正規化手順までを説明したいと思います。
以下、具体的な正規化手順の説明です。(前回からの続き第二正規化手順から説明します)
第二正規化手順
第二正規化手順は、主キーの項目内で分割できる項目が無い状態を作成します。
主キーとは重複の無いデータの事を言い、主キーとなり得るかデータかは、データそのものの属性にもよります。
例えば、氏名は同姓同名が存在する可能性が有ります。従って、人の名前は主キーにはなり得ません。
ここで第一正規化を行ったテーブルを見てみましょう。
仕入ID仕入年月日仕入先仕入先ID商品名商品ID商品数単価A00012023/1/5X商店Z0001リンゴF000110250A00012023/1/5X商店Z0001柿F000225150A00022023/1/6Y商店Z0002みかんF00035080A00032023/1/9Z商店Z0003イチゴF000410045
第一正規化後
主キーとはその情報だけで該当行を特定できるデータを指します。
上記テーブルのデータを見ると唯一商品名か商品IDが現在のデータでは一行を指定できるデータとなっていますが、今後更にデータが蓄積され、同じ商品を仕入れると、両データでは該当行(特定の1行)を指定できなくなる事が有ると考えられます。
結果、このテーブルデータでは特定のフィールド情報単独では特定行を確定できないと判断するのが正しいはずです。
このような場合は、特定フィールド値だけでは無く、複数のフィールド値の組あわせを考えます。
そうすると、仕入ID+商品名、仕入ID+商品IDの二つの組み合わせが、特定の1行を指定可能と判断できます。
尚、この場合どちらの組み合わせを選択するかというと、仕入ID+商品IDを選択します。何故かというと、最初にコメントした気がしますが、正規化のメリットはSQL文を実行する時に、文字列の代わりにIDを使用して、文字数を少なくして送信するバイト数を最小限化します。従って商品IDと商品名は一対一で何方が主でも従でも同じなのですが、文字数を少なくするにはIDを選択した方が目的に合致します。
また、正規化を段階的に実施していく過程で、品名と品名IDの様な一対一のデータは分離していくのがセオリーな為、品名では無く品名IDを選択した方がテーブル構成がすっきりできます。
これが、このテーブルにおける主キーです。
主キーが確定したら主キーでテーブルを分割します。
最初のテーブルは仕入れの情報です。(名前は仕入テーブル?)
仕入ID商品ID商品数A0001F000110A0001F000225A0002F000350A0003F0004100
第二正規化後テーブル1
次のテーブルは仕入れ先の詳細情報です。(名前は仕入先詳細テーブル?)
仕入ID仕入年月日仕入先仕入先IDA00012023/1/5X商店Z0001A00022023/1/6Y商店Z0002A00032023/1/9Z商店Z0003
第二正規化後テーブル2
次のテーブルは商品一覧のテーブルです。(名前は商品マスタ?)
商品ID商品名単価F0001リンゴ250F0002柿150F0003みかん80F0004イチゴ45
第二正規化後テーブル3
第三正規化手順
第三正規化手順は、主キー以外の項目でも分割できる項目が無い状態を作成します。
以下が第二正規化後のテーブルで再分割が可能なテーブルです。(仕入先と仕入先IDが主と従の関係が成立しています)
仕入ID仕入年月日仕入先仕入先IDA00012023/1/5X商店Z0001A00022023/1/6Y商店Z0002A00032023/1/9Z商店Z0003
第二正規化後テーブル2
仕入先と仕入先IDを除くので、残りと仕入先IDとを一つのテーブルにします。
仕入ID仕入年月日仕入先IDA00012023/1/5Z0001A00022023/1/6Z0002A00032023/1/9Z0003
第三正規化後テーブル1
除いた仕入先と仕入先IDでテーブルを作成します。(テーブル名は仕入先マスタ?)
仕入先ID仕入先Z0001X商店Z0002Y商店Z0003Z商店
第三正規化後テーブル2
第一正規化から第三正規化を経て、仕入れ情報に関する、全4テーブルのデータベースが作成できました。
重要なのは第一正規化後のテーブル情報と第三正規化後のテーブル情報群は等価という事です。
また、正規化された後のテーブルでは***マスタの様なデーブルがあり、将来、仕入先の会社名が変わった場合、マスタテーブルの変更だけで済みます。第一正規化後のテーブルの場合は、埋め込まれている同じ会社名のフィールドを全行UPDATEする必要があります。
この点が正規化する事で得られるメリットの一つと思います。
正規化の前半の手順を説明してみました。(次回以降、残りの正規化を説明してみたいと思いますが、その前に何故、正規化の功罪というタイトルの有料コンテンツを作成する事にしたのかの理由の一端を次回公開したいと思います)
皆さんは、WEBシステムを使われていると思いますが、背後でこの様に設計されたデータが動いているという事になりますが、大変さを少しは感じて頂けましたでしょうか?
講師の経験が、皆様のお役に立てれば幸いです。