Document

データモデリング
正規化
Quiz 正規化の本質とは
•
①
•
②
•
③
•
④
主キーをできるだけ減らす
1つの事実は1箇所で管理
主キーと外部キーの一貫性を崩さない
エンティティをできるだけ減らす
その心は?
• 1箇所で管理しないと修正時にあっちこっち
を修正する必要があるので、データ不整合を
起こしやすい
[補助] 1箇所で管理しないと…
• 「会員住所」を「会員都道府県」、 「会員市町
村」、 「会員地区番地名」にわけるとする
会員住所
会員住所
会員住所
分散した箇所
すべてで修正
会員住所
会員住所
1箇所の修正
でOK
正規化
Quiz: 正規化を意味づける関係データベー
スでの重要な概念とは
• 直列化可能性
• 関数従属性
• データ独立性
正規化
• 関数従属性 に着目して正規化
• Quiz :関係Rのスキーマ内の属性の集合Xと
Yについて、YがXに関数従属するとは?
①– Y から X に依存関係があること
②– X の値により Y の値が一意に決まること
③– Yの値を決定する関数がXの値を決定する関数
より導出できること
一意に決まるなら,一元管理ができるはず
正規化の第1ステップ
繰り返し項目を取り除け
「注文内容」エンティティにおいて
– 商品購入数量、注文商品名、書籍種別、商品購
入単価は複数存在する可能性
• これらを「注文明細」エンティティにまとめる
– 「注文明細」から「注文内容」へ依存関係
– 「注文内容」内の商品コードごとに一意に決まる
• 注文番号と商品コードが主キーとなる
初期モデルをみてみますと
•1回の注文で、複数の書籍を購入
する場合、これらは複数存在する。
•注文明細として分離させる
•注文明細の主キー
•1つの注文は注文番号で
•各種類の商品は商品コードで
正規化の第1ステップ(続き)
• 「商品」エンティティにおいて、著者は複数存
在する可能性
– 「書籍著者」エンティティを作る
– 著者の識別のため、「著者連番」属性を含める
• 「書籍書評」も複数存在する可能性
– 「書籍書評」エンティティを作る
• エンティティ「商品」の特化として「書籍」
– 将来の発展系のため
正規化の第1ステップ(また続き)
• 「商品」エンティティ内の属性「商品在庫量」
– 在庫量は倉庫(配送センタ)単位でもつ
– エンティティ「配送センタ」と「商品在庫」を作る
– 「商品在庫」は「商品」と「配送センタ」に依存
• エンティティ「ショッピングカート」内の属性
– 「カート合計金額」以外は商品単位で複数存在す
る
– 「ショッピングカート明細」エンティティを作る
Quiz:エンティティ「ショッピングカート」
と「注文内容」は同じ属性に見える.
•
エンティティ「ショッピングカート」と「注文内容」は
「商品名」、「数量」、「購入単価」という同じ属性
を持っているように見える.なぜ,これらを分ける
のか?
① 本当は違う属性だから
② ユーザから見やすさを追求するため
③ 性能が良くなるから
– 実際には、購入候補と、購入すると決めたものの違い
– よって、同一にはできない。
未確定分類
以上をまとめると
図7-5
正規化の第2ステップ
複合キーの一部に関数従属する属性は
別のエンティティとせよ
• 「注文明細」エンティティにおいて
– 属性「注文商品名」、「書籍種別」は、複合キーの一部の
「商品コード」(つまり、書籍)から一意に決まる属性
– エンティティ「書籍」をつくり「注文明細」が依存すればよい
– 今回の場合、エンティティ「書籍」はすでにある。
• 複合キーの一部に従属する属性があるということは
– 複合キーの一部を主キーとし、これら従属する属性から
なるエンティティが本来なら存在するということ
– このエンティティを別に作って、1箇所で管理する。
本来は、
書籍を見れば
わかる情報
「ショッピングカート明細」の中の
属性「カート書籍名」についても同様
正規化の第3ステップ
主キー以外の項目に依存する属性は
別のエンティティとせよ
• 「注文内容」エンティティにおいて
– 属性「商品注文者」、「顧客番号」は、自らの主キー「注文
番号」でなく、注文した顧客から決まる属性
– エンティティ「顧客」に「注文内容」が依存すればよい
• エンティティにとって、主キー以外の項目に依存する
項目があるということは、これら項目は別エンティ
ティで既に定義されているということ
主キー以外の項目に依存する項目は
別エンティティで既に定義されているはず。
そのエンティティがなければ作るべき
関数従属以外の観点からの正規化
• これまでの正規化は、同じ主キーのみに依存
するデータ項目を1つのエンティティにまとめ
る作業
• 関数従属と別に、意味を考えた正規化も必要
– 導出項目
– データ発生や更新のタイミング(次章)
– 登録方法の違い
導出項目
• その値が、別項目の値から計算される項目
• 正規化の観点からは削除すべきであるが、計算が
自動化できるなら残すべき
• 特に別エンティティ内の項目値を使う場合は残した
ほうがDBの管理が容易
[例] 「注文内容」について
• 「商品請求金額」は削除
– 同一エンティティ内の「商品購入合計」+「購入消費税」
• この計算に使った「商品購入合計」は残す
– 「注文明細」エンティティの複数の「商品購入金額」の合計
[補助] 金額の計算
• 「商品請求金額」は削除
– 同一エンティティ内の「商品購
入合計」+「購入消費税」
• この計算に使った「商品購入
合計」は残す
– 「注文明細」エンティティの複
数ある「商品購入金額」の合計
データの発生や更新のタイミング
• 「注文内容」エンティティの「商品配送先」
– 「顧客」エンティティの住所がデフォルト値
– しかし、購入時に別のものに変更可能
• 別のエンティティ「商品配送先」を作る
登録方法の違い
• 書籍表紙写真は、画像データでRDBに直接
載せるには得策でない。
• 別エンティティ「書籍画像」を作成し、画像ファ
イル名をRDBに登録
以上をまとめた図7-10