実践!DB逆設計 ~レシートからER図を起こす~ 2013/7/20 SAT SQLWrold 遥佐保
自己紹介 名前と経歴を言う 出没コミュニティ Room metro(東京・大阪) ExceptionalC++読書会(大阪) SQLWorld (大阪) Microsoft MVP for Client App Dev [Jan,2010 - Dec,2013]
本日の目的 DB設計の基本を理解する 第3正規化まで出来るようになる ER図が書けるようになる
Topics 正規化は必要? 正規化の種類 正規化の考え方 関数従属 第1正規形 第2正規形 第3正規形 E-R図 演習1 演習2 スーパータイプ、サブタイプ 演習3 演習4(レシート) まとめ
正規化ってどんな時に必要なの? 資格管理のテーブルがあるとします 社員(社員コード、社員名、 資格1、資格2、資格3) 問題点1: 資格1、資格2、資格3) 問題点1: 3つしか資格管理ができない
正規化ってどんな時に必要なの? 社員(社員コード、社員名、 資格1、資格2、資格3) 問題点2: SQLが煩雑になる 資格1、資格2、資格3) 問題点2: SQLが煩雑になる 例)DB資格を持っている人を抽出 SELECT 資格1, 資格2, 資格3 FROM 社員 WHERE 資格1=‘DB’,資格2=‘DB’,資格3=‘DB’,
正規化ってどんな時に必要なの? 社員(社員コード、社員名、 資格1、資格2、資格3) 問題点3: 領域に無駄が多い 社員コード 資格1 資格1、資格2、資格3) 問題点3: 領域に無駄が多い 社員コード 資格1 資格2 資格3 001 DB 002 NW 003 SW 004
正規化ってどんな時に必要なの? 社員(社員コード、社員名) 社員資格(社員コード、資格) 汎用性UP、簡易なSQL、領域削減、 更新時異常の防止など、色んなメリットがあります 社員コード 資格1 001 DB 002 NW
正規化しよう!
正規形の種類 非正規形 第1正規形 第2正規形 第3正規形 ボイスコッド正規形 第4正規形 第5正規形 ここまでで良いのよ
正規形の考え方 「第3正規形である」ということは… 「第1正規形の条件も第2正規形の条件も満たしており、かつ第3正規形の条件を満たしている」ということ 第1正規形 第2正規形 第3正規形
正規化の手順 非正規形 繰り返しの排除 第1正規形 部分関数従属の排除 第2正規形 推移的関数従属の排除 第3正規形
非正規形とは "繰り返しがある"状態 普通はExcelでこんな表を作ってしまうけど1行に対して複数行存在するので、このままではDBに登録できません 受注番号 年月日 顧客コード 顧客名 商品コード 商品名 受注数 T0100 2013/7/20 A0753 山田太郎 S001 Nexus7 1 S002 iPhone5 3 S003 MediasW T0101 2013/7/20 C0231 田中玲子 2
第1正規形とは <定義>“繰り返しがない”こと 関数従属図を書こう! 受注 ( 受注番号、年月日、顧客コード、 顧客名 商品コード 商品名 受注数 T0100 2013/7/20 A0753 山田太郎 S001 Nexus7 1 2013/7/20 S002 iPhone5 3 S003 MediasW T0101 C0231 田中玲子 2 受注 ( 受注番号、年月日、顧客コード、 顧客名、商品コード 、商品名、受注数) 関数従属図を書こう!
関数従属 顧客コード 顧客名 「顧客コード」が決まれば、 「顧客名」が特定出来る →「顧客名は顧客コードに関数従属する」
関数従属の用語 CはAに部分関数従属する Dは{A,B}に完全関数従属する A C B D
関数従属の用語 GはEに推移的関数従属する (ただし、F→Eでないとき) E F G
関数従属の用語 候補キー 行を一意に特定できる属性または属性の組み合わせ 不要な属性は含まない
第1正規形:関数従属図 受注番号 年月日 顧客コード 顧客名 商品コード 受注数 商品名 受注明細 ( 受注番号、年月日、顧客コード、 T0100 2013/7/20 A0753 山田太郎 S001 Nexus7 1 2013/7/20 S002 iPhone5 3 S003 MediasW T0101 C0231 田中玲子 2 受注明細 ( 受注番号、年月日、顧客コード、 顧客名、商品コード 、商品名、受注数) 受注番号 年月日 商品コード 顧客コード 顧客名 受注数 商品名
正規化の手順 非正規形 繰り返しの排除 第1正規形 部分関数従属の排除 第2正規形 推移的関数従属の排除 第3正規形
第2正規形とは <定義> 第1正規形であること 全ての非キー属性が候補キーに完全関数従属していること (もしくは部分関数従属していないこと) ここやで! 受注番号 年月日 商品コード 顧客コード 顧客名 受注数 商品名
第2正規形に分解する 部分関数従属を外に出した 受注番号 商品コード 商品コード 受注数 商品名 受注番号 年月日 顧客名 顧客コード
第2正規形のテーブル 受注明細 ( 受注番号、商品コード 、受注数) 商品 ( 商品コード、商品名) 受注(受注番号、年月日、顧客コード、顧客名) 受注番号 商品コード 受注数 商品コード 商品名 受注番号 年月日 顧客名 顧客コード
正規化の手順 非正規形 繰り返しの排除 第1正規形 部分関数従属の排除 第2正規形 推移的関数従属の排除 第3正規形
第3正規形とは <定義> 第2正規形であること 推移的関数従属がないこと 受注番号 商品コード 受注数 商品コード 商品名 ここやで! 年月日 顧客名 顧客コード
第3正規形に分解する 推移的関数従属を外に出した 受注番号 商品コード 受注数 商品コード 商品名 受注番号 年月日 顧客コード 顧客コード 顧客名
第3正規形のテーブル 受注明細 ( 受注番号、商品コード 、受注数) 商品 ( 商品コード、商品名) 受注(受注番号、年月日、顧客コード) 顧客 (顧客コード、顧客名) 受注番号 商品コード 受注数 商品コード 商品名 受注番号 年月日 顧客コード 顧客コード 顧客名
E-R図 正規化した後に、E-R図を作成する *外部キーが無い場合、関連が無い *主キーから外部キーへ線を引く(1対多) *外部キーの数だけ線が存在する 資格 ( 資格番号、資格名、受験価格 ) 生徒 ( 生徒番号、生徒名 ) 試験結果 ( 資格番号、生徒番号、得点 ) 資格 試験結果 生徒
演習1 E-R図を作成する 商品(商品番号、商品名、価格) 納品(商品番号、顧客番号、納品数) ※手順1:主キー、外部キーはどれ?
演習1 商品(商品番号、商品名、価格) 納品(商品番号、顧客番号、納品数) 主キー:実線 外部キー:破線 ※手順2: 2つのテーブルから、3つめのテーブルが考察できるよ!
演習1 商品(商品番号、商品名、価格) 納品(商品番号、顧客番号、納品数) 顧客(顧客番号、顧客名、……) ※手順3: あとは主キーから外部キーへ 線を引くだけ!
演習1 商品(商品番号、商品名、価格) 納品(商品番号、顧客番号、納品数) 顧客(顧客番号、顧客名、……) 商品 納品 顧客
演習2 外部キーはどれだっ!? 受注明細 ( 受注番号、商品コード 、受注数) 商品 ( 商品コード、商品名) 受注 (受注番号、年月日、顧客コード) 顧客 (顧客コード、顧客名) 受注番号 商品コード 受注数 商品コード 商品名 受注番号 年月日 顧客コード 顧客コード 顧客名
演習2 主キー(1)から外部キー(多)へ線を引く 受注明細 ( 受注番号、商品コード 、受注数) 商品 ( 商品コード、商品名) 受注 (受注番号、年月日、顧客コード) 顧客 (顧客コード、顧客名) 受注 受注明細 顧客 商品
正規化アプローチ 関数従属から考えるのはボトムアップ ER図から考えるのはトップダウン どちらで考えるかは、好み
スーパータイプ、サブタイプ is-a関係 自動車 Part-of関係 乗用車 バス 自動車 ハンドル タイヤ 乗用車 is a 自動車
スーパータイプ、サブタイプ is-a関係、part-of関係を保ちつつ排他的であること 自動車 乗用車 バス
スーパータイプなどの例 受注 受注明細 顧客 商品 顧客種別 お得意様 一般
これが第3正規化までの全てです!
演習3候補キーを上げましょう ポイント:まず第何正規形かを考える いきなり第3正規化手順である「推移的関数従属を排除」などしてはいけない A → その後、現在の関数スキーマを考える いきなり第3正規化手順である「推移的関数従属を排除」などしてはいけない A C B D
実際に、レシートを見て 正規化&E-R図を作成しましょう! 演習4 レシートからER図を作成する 実際に、レシートを見て 正規化&E-R図を作成しましょう!
まとめ 第3正規化までは出来るようになろう! ER図の書き方は、主キーから外部キーを引くだけ! 第1、第2、第3正規化の定義 ER図の書き方は、主キーから外部キーを引くだけ! レシートからのDB起こしは、トップダウン or ボトムアップで!