« Redmineの初心者向け資料 | トップページ | アジャイル開発が重視する品質特性~保守性と移植性 »

2012/07/15

モデリング再復習DOA編part1~情報無損失分解と結合の罠

DOAに関する技法で理解できた内容をまとめるために今後いくつか書き留める。
1回目は、情報無損失分解についてラフなメモ書き。

【1】DOAの基本はテーブルの正規化だ。
第1~5正規化まであるが、どのDOA本も無味乾燥で、本質的なことを書いていないように思う。
第3正規化で十分とか、関数従属性からどのように正規化していけばいいのかという手法まできちんと説明した本はあまりない。
また、正規化しすぎると良くないので、あえて正規化を崩す技法を勧める時もあり、正直分かりにくい。

特に思うのは、ほとんどのDOAの本の内容が20年前の時代のまま変わっていない気がすること。
そもそもDBサーバーの性能や価格も大幅に変わったし、DBMSも高機能化してオープンソースDBMSも業務系システムに十分に使える時代になったのだから、DOAの技法もどんどん進化していいはずだ。
OOAですら、UMLと絡めたモデリング手法からドメイン駆動設計へ内容も着実に進化しているのに。

【2】正規化する理由は「1 Fact 1 Place」を保持するため。
一つの事実というデータを一つのテーブルに保持するために、関数従属性の観点でテーブルを正規化する。

だが、正規化には落とし穴がある。
本来のデータを正規化して分割した後、分割したテーブルのデータを結合させると元のデータを復元できるようにしなければならないのに、実は関数従属性の保持の観点が漏れている場合がある。

この時、情報無損失分解とは、あるリレーションにおいてその分解成分の自然結合をとると元のデータを復元できることを指す。
つまり、正規化したテーブル設計の正当性は、情報無損失分解であるかどうかという観点で評価できる。

第1正規系 初心者用データベース入門

実際の具体例を考えるには、下記の例が分かりやすい。

平成22年 春期 データベーススペシャリスト 午前II 問6

発注伝票 ( 注文番号(PK), 商品番号(PK), 商品名, 商品単価, 注文数量 )

を情報無損失分解になるように正規化する場合、下記になる。

 発注 ( 注文番号(PK), 商品番号(PK), 注文数量 )
 商品 ( 商品番号(PK), 商品名, 商品単価 )

商品 ( 商品番号(PK), 商品名, 商品単価, 注文数量 ) とか、発注 ( 注文番号(PK), 注文数量 ) に分解すると、分割した2個のテーブルを自然結合しても本来のデータが復元されない。
その理由は関数従属性を見落としているからだ。

このように、正規化したテーブルを自然結合しても復元されず、怪しげなリレーションが現れる現象を「結合の罠」と呼ぶらしい。

【3】実は、データベース情報処理試験の過去問題を解いてみると、テーブルの正規化が情報無損失分解になっていない解答が幾つか見られる。
正規化したテーブル設計が正しいことを説明するために、情報無損失分解であることを証明するのは、机上では結構難しいと思う。

例えば、DB試験のH22年度午後問題1、H21年度午後問題1で、正規化が情報無損失分解になっていないのではないか、という指摘をiTECの解説から見つけた。

情報処理推進機構:情報処理技術者試験:問題冊子・配点割合・解答例・採点講評(2010、平成22年)

情報処理推進機構:情報処理技術者試験:問題冊子・配点割合・解答例・採点講評(2009、平成21年)

例えば、H22年度午後問題1設問2(1)では、正規化した解答は下記になっている。

(1)
中問(中問ID(PK)、中問作成日時、コースID、制限時間)
中問小問(中問ID(PK)、小問番号(PK)、小問ID)
大問中問(大問ID(PK)、中問番号(PK)、中問ID)
出題(大問ID(PK)、大問作成日時)

しかし、情報無損失分解を考慮すると下記の正規化になるのでは、という指摘がある。

(2)
大問(大問ID(PK)、大問作成日時) ← 上記の出題テーブルと同じ
中問(中問ID(PK)、中問作成日時、コースID、制限時間)
中問小問(中問ID(PK)、小問番号(PK)、小問ID)
大問中問(大問ID(PK)、中問番(PK)号、中問ID)
出題(大問ID(PK)、中問番号(PK)、小問番号(PK)) ← 漏れているテーブル。上記の出題テーブルとは中身が違う。

漏れているテーブルは、(2)の出題テーブルという全てのキーが候補キーとなっているテーブル。
机上で普通に正規化していくと、(1)のような結果になるだろう。
しかし、(1)のテーブルで結合させると、本来は存在しないタプル(データ)が出現してしまう。
つまり、(2)の出題テーブルというリレーションがないため、おかしなデータが復元されてしまうわけだ。

テーブルの正規化で第4正規化や第5正規化と言う概念が出てくるけれど、その理由の一つは、情報無損失分解になるように正規化すると、上記のような候補キーだけのテーブルが現れて、そのテーブルを更に正規化するために必要になるからだと思う。

【3】ネットで検索しても、DOAの本を見ても、情報無損失分解という概念はあまり見当たらない。
第1~5正規化まで無味乾燥な説明が多い割には、その正規化が正しいという正当性を説明している部分が少ない。

情報無損失分解は当たり前の概念だが、結合の罠という概念が示すように、正規化を誤ると本来のデータが復元されない。
そして結合の罠はとても陥りやすい。

正規化の他の注意点については、ボイスコッド正規化には2次識別子を使うという渡辺幸三さんの指摘もある。

2次識別子を使ったデータモデリング: プログラマの思索

候補キーと2次識別子に関する概念: プログラマの思索

正規化の話をするなら、DOA本はこのような実業務に役立つテクニックを解説して欲しい。
正直、DOAはOOAに比べると、進化が止まっている部分があるのではないかと思ったりする。
色々調べてみる。

|

« Redmineの初心者向け資料 | トップページ | アジャイル開発が重視する品質特性~保守性と移植性 »

モデリング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« Redmineの初心者向け資料 | トップページ | アジャイル開発が重視する品質特性~保守性と移植性 »