情報無損失分解
Information
version | date | memo |
---|---|---|
0.1 | 2013/04/13 | first creation |
1.0 | 2013/04/14 | 更新異常関連 |
TODO
正規化とか。。。
概要
情報無損失分解について、手元の本だと分りづらかったので、調べた結果をまとめる。
良い資料があったので、それ準拠で正規化関連もまとめる
正規化
そもそも
RS(リレーションスキーマの)設計が良くないと、DBの更新時に異常が起きる。
じゃあ、異常が起きないようにRS分割しましょうね^^
という事らしい。
重複 != 冗長
RSにおいて、重複と冗長は違うよ!
名前
性 | 名 |
---|---|
入速出 | やる夫 |
入速出 | やる実 |
美筆 | やらない夫 |
美筆 | やらない夫 |
名前テーブルにおいて、性の「入速出」が重複しているが、冗長ではない。
なぜなら、重複しているからと言って、2行目を消すと名の「やる実」の情報が欠落する事になる。
また、性と名について、「美筆 やらない夫」は冗長である。4行目を消しても、情報が欠落するということにはならない。
(*) 但し、「性」属性について(「性」属性の射影として)見ると、「入速出」は冗長である。
更新異常
更新異常には、次の3つがあるよ。
- タプル挿入
- タプル削除
- タプル修正
アイテムリスト
顧客名 | 商品名 | 数量 | 単価 | 金額 |
---|---|---|---|---|
虫取り少年 | モンスターボール | 5 | 200 | 1,000 |
ジョーイ | モンスターボール | 5 | 200 | 1,000 |
レッド | すごいキズぐすり | 10 | 1,200 | 12,000 |
ロケット団のしたっぱ | キズぐすり | 5 | 300 | 1,500 |
タプル挿入異常
「スーパーボール」を600で売ることにした。。。
しかし、テーブルの制約上、顧客を決めないとDBに登録できない。。。
よって、挿入できない。
タプル削除異常
「レッド」から「すごいキズぐすり」の注文が取り消された。
すると、「すごいキズぐすり」を扱っている事実と単価データが消失。。。
復元できなくなるので、削除できない。
分解
更新時の異常が起きないように適切に分解する。
「適切に分解される」 = 「自然結合により元に戻る」
この事を情報無損失分解という。
さっきのアイテムリストテーブルを情報無損失分解すると、次のようになる。
伝票
顧客名 | 商品名 | 数量 | 金額 |
---|---|---|---|
虫取り少年 | モンスターボール | 5 | 1,000 |
ジョーイ | モンスターボール | 5 | 1,000 |
レッド | すごいキズぐすり | 10 | 12,000 |
ロケット団のしたっぱ | キズぐすり | 5 | 1,500 |
アイテム
商品名 | 単価 |
---|---|
モンスターボール | 200 |
すごいキズぐすり | 1,200 |
キズぐすり | 300 |
情報無損失分解の定義
RSに関する関数従属性集合FとRSの分解が与えられたとき、Fを満足するRSのすべてのインスタンスRについて
が成立するとき、分解はRSの情報無損失分解であるという。
(注意)
結合記号は「」*1を用いることにする。
また、はの射影
上の例で言うと、
{顧客名, 商品名, 数量, 金額}
顧客名 | 商品名 | 数量 | 金額 |
---|---|---|---|
虫取り少年 | モンスターボール | 5 | 1,000 |
ジョーイ | モンスターボール | 5 | 1,000 |
レッド | すごいキズぐすり | 10 | 12,000 |
ロケット団のしたっぱ | キズぐすり | 5 | 1,500 |
{商品名, 単価}
商品名 | 単価 |
---|---|
モンスターボール | 200 |
すごいキズぐすり | 1,200 |
キズぐすり | 300 |
となる。
スキーマに関して言えば
RS | = | |
= | {顧客名, 商品名, 数量, 金額}{商品名, 単価} | |
= | {顧客名, 商品名, 数量, 単価, 金額} |
という事。