ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

Hello World程度のデータベース(その8:概念スキーマ(6)第二正規形とは)

2007-02-25 14:23:33 | Weblog

 情報処理とは何から、データベースの基本的な話(情報処理試験のデータベーススペシャリスト程度の話まで)を書く、土日のシリーズ「Hello World程度のデータベース」です。

現在、正規化についてやっています。
データを1箇所にだけ現れるようにする手法が正規化で、正規化のレベルとして、第一正規形から第五正規形まであります。でも、普通DBを作るには第一~第三正規形まででよく、それは、以下のとおりです。

第一正規形:繰り返しをなくす
第二正規形:エンティティごとにまとめ、主キーを決め、
   主キーが決まると、他の属性値の値がきまるようにする
    →これを主キーに対して完全関数従属といいます
第三正規形:主キー以外で、ある値が決まると、他の値が決まってしまう

 前回までで、第一正規形は終わりました。なので、今回は第二正規形です。




■第二正規形の定義

 第二正規形は、「主キーに対して完全関数従属」にするということです。

 つまり、「主キーが決まると、他の属性値の値がきまるようにする」ように、テーブルをわけて、主キーをきめます。
 実際にはテーブルというよりは、エンティティごとにわけるわけなのですが。。

 なにいってるんだ?っていう状態だと思うので、もっと具体的に書きましょう。

たとえば、受注データがこんなふうにあったとします。

  受注日:2007年2月25日
  おきゃくさん:ウィリアムのいたずら商事
  お客さんの住所:東京都杉並区
  お客さんの電話番号:119番(うそです。かけないでね ^^;)
  受注商品:特注のすっごい機械
  納品日:2007年3月1日
  納品場所:お客さんの住所と同じ
  支払い方法:代引き(って、どんな機械だよ ^^;)
  価格:30000円(って、なおさら、どんな機械だよ ^^;)

ま、どんな機械なのかはおいておいて、このとき、

おきゃくさん:ウィリアムのいたずら商事
お客さんの住所:東京都杉並区
お客さんの電話番号:119番(うそです。かけないでね ^^;)

は、おきゃくさんが、ウィリアムのいたずら商事なら、住所と電話番号はきまってしまいます。逆に、お客さんが変われば(いたずら興業とか)、住所と電話番号はかわります。

 このとき、もし、お客さんっていうエンティティを作って(実際には、取引先っていうけど)そこに、住所、名前、電話番号をいれて、エンティティの要素を区別できるように番号を振ると、こんなかんじになります。

<<お客さん>>
  お客さん番号:1番
  おきゃくさん:ウィリアムのいたずら商事
  お客さんの住所:東京都杉並区
  お客さんの電話番号:119番(うそです。かけないでね ^^;)

そして、元のテーブルには、
<<受注>>
  受注日:2007年2月25日
  お客さん番号:1番
  受注商品:特注のすっごい機械
  納品日:2007年3月1日
  納品場所:お客さんの住所と同じ
  支払い方法:代引き(って、どんな機械だよ ^^;)
  価格:30000円(って、なおさら、どんな機械だよ ^^;)

のように、お客さん番号だけ入れておけば、いいことになります。
このように、エンティティ(お客さん)ごとに属性値をまとめて、主キー(お客さん番号)をふって、エンティティをわけ、元のテーブルには、その主キーだけを入れておく操作が第二正規形になります。

 このとき、元のテーブルにはいった、他のテーブルの主キー(上記の例だと、受注テーブルのお客さん番号)を、参照キーとか、外部キーとかいいます。




■なぜ、こんなことをするのか?

もし、さっきの例で、こんな受注データもあったとします。
  受注日:2007年2月25日
  おきゃくさん:ウィリアムのいたずら商事
  お客さんの住所:東京都杉並区
  お客さんの電話番号:119番(うそです。かけないでね ^^;)
  受注商品:特注のすっごい機械を入れる棚
  納品日:2007年3月1日
  納品場所:お客さんの住所と同じ
  支払い方法:代引き(って、どんな棚だよ ^^;)
  価格:1200円(って、なおさら、どんな棚だよ ^^;)

こうすると、機械の受注と棚の受注のどちらにも、

  おきゃくさん:ウィリアムのいたずら商事
  お客さんの住所:東京都杉並区
  お客さんの電話番号:119番(うそです。かけないでね ^^;)

っていうデータが入ってしまいます。
 まあ、このうち、名前は、しょうがないかもしれません。じゃないと、どのお客さんからの受注だかわかんないから。
 でも、住所と電話番号は、完全にダブってます。
 これは、データベースが1事実1箇所にするという話と食い違ってくるので、まずいです。そこで、受注エンティティには、お客さんが特定できるお客様番号だけを入れて、それ以外の情報は、お客さんエンティティに入れようっていう話です。




■主キーとは、一意とは?

 ここで、名前でない理由は、同じ名前の会社があると困るからです。
 そこで、主キーとして、お客様どうしでダブらないように番号を振ってしまい、その番号を名前の変わりにいれます。
 主キーとは、エンティティ内で、それぞれのレコード(構成員。。。なんか危ない表現だな ^^;)において、ダブらないように振った項目であって、この項目は、構成員がダブらないで、特定できるのであれば、複数項目をまとめて、主キーとすることがあります。
(たとえば、課テーブルなどでは、部番号+(部内の)課番号で主キーってこともあります)
 なお、レコードにダブらないように振っている状態を(1つに特定できるということで)一意になっているというように言います。




 ということで、次回から、具体的に第二正規形にする方法と、その際の注意点について書きたいと思います。


この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« データベースからWebや本... | トップ | YouTubeの動画の利用、Rimoが... »
最新の画像もっと見る

Weblog」カテゴリの最新記事