実践! DB 逆設計 ~ レシートから ER 図を起こす~
description
Transcript of 実践! DB 逆設計 ~ レシートから ER 図を起こす~
自己紹介
名前と経歴を言う出没コミュニティ
Room metro (東京・大阪)ExceptionalC++ 読書会(大阪)SQLWorld (大阪)
Microsoft MVP for Client App Dev [Jan,2010 - Dec,2013]
正規化ってどんな時に必要なの?
社員(社員コード、社員名、 資格1、資格2、資格3)
問題点2: SQLが煩雑になる
例)DB資格を持っている人を抽出SELECT 資格1 , 資格2 , 資格3 FROM 社員 WHERE 資格1 =‘DB’, 資格 2=‘DB’, 資格3=‘DB’,
正規化ってどんな時に必要なの?
社員(社員コード、社員名、 資格1、資格2、資格3)
問題点3: 領域に無駄が多い
社員コード 資格1 資格2 資格3
001 DB
002 NW DB
003 SW NW DB
004
正規化ってどんな時に必要なの?
社員(社員コード、社員名)社員資格(社員コード、資格)
汎用性UP、簡易なSQL、領域削減、更新時異常の防止など、色んなメリットがあります
社員コード 資格1
001 DB
002 NW
002 DB
正規形の考え方「第 3 正規形である」ということは…「第 1 正規形の条件も第 2 正規形の条件も満たしており、かつ第 3 正規形の条件を満たしている」ということ
第 1 正規形
第 2 正規形
第 3 正規形
非正規形とは" 繰り返しがある " 状態
普通は Excel でこんな表を作ってしまうけど1行に対して複数行存在するので、このままではDBに登録できません
受注番号 年月日顧客コード
顧客名商品コード
商品名 受注数
T01002013/7/20 A0753 山田太郎
S001 Nexus7 1
S002 iPhone5 3
S003 MediasW 1
T0101 2013/7/20 C0231 田中玲子 S001 Nexus7 2
第 1 正規形とは<定義>“繰り返しがない”こと
受注 ( 受注番号、年月日、顧客コード、 顧客名、商品コード 、商品名、受注数)
関数従属図を書こう!
受注番号 年月日 顧客コード
顧客名 商品コード
商品名 受注数
T01002013/7/20 A0753 山田太郎 S001 Nexus7 1
T0100 2013/7/20 A0753 山田太郎 S002 iPhone5 3
T01002013/7/20 A0753 山田太郎 S003 MediasW 1
T0101 2013/7/20 C0231 田中玲子 S001 Nexus7 2
第 1 正規形:関数従属図受注番号 年月日
顧客コード
顧客名商品コード
商品名 受注数
T01002013/7/20 A0753 山田太郎 S001 Nexus7 1
T0100 2013/7/20 A0753 山田太郎 S002 iPhone5 3
T01002013/7/20 A0753 山田太郎 S003 MediasW 1
T0101 2013/7/20 C0231 田中玲子 S001 Nexus7 2
受注番号
商品コード
年月日
商品名
受注明細 ( 受注番号、年月日、顧客コード、顧客名、商品コード 、商品名、受注数)
顧客コード
受注数
顧客名
第 2 正規形とは
<定義>第 1 正規形であること全ての非キー属性が候補キーに完全関数従属していること
(もしくは部分関数従属していないこと)
ここやで!受注番号
商品コード
年月日
商品名
顧客コード
受注数
顧客名
第 2 正規形のテーブル
受注明細 ( 受注番号、商品コード 、受注数)商品 ( 商品コード、商品名)受注(受注番号、年月日、顧客コード、顧客名)
受注番号
商品コード受注数
顧客名受注番号 年月日
顧客コード
商品コード
商品名
第 3 正規形のテーブル
受注明細 ( 受注番号、商品コード 、受注数)商品 ( 商品コード、商品名)受注(受注番号、年月日、顧客コード)顧客 (顧客コード、顧客名)
受注番号
商品コード受注数
受注番号 年月日
顧客コード
商品コード
商品名
顧客名
顧客コード
E-R図
正規化した後に、E-R図を作成する*外部キーが無い場合、関連が無い*主キーから外部キーへ線を引く(1対多)*外部キーの数だけ線が存在する
資格 ( 資格番号、資格名、受験価格 )生徒 ( 生徒番号、生徒名 )試験結果 ( 資格番号、生徒番号、得点 )
資格 試験結果 生徒
演習 2 外部キーはどれだっ!?受注明細 ( 受注番号、商品コード 、受注数)商品 ( 商品コード、商品名)受注 (受注番号、年月日、顧客コード)顧客 (顧客コード、顧客名)
受注番号
商品コード受注数
受注番号 年月日
顧客コード
商品コード
商品名
顧客名
顧客コード
演習2主キー (1)から外部キー (多 )へ線を引く
受注明細 ( 受注番号、商品コード 、受注数)商品 ( 商品コード、商品名)受注 (受注番号、年月日、顧客コード)顧客 (顧客コード、顧客名)
受注 受注明細
顧客 商品
スーパータイプ、サブタイプ
is-a 関係乗用車 is a 自動車バス is a 自動車
Part-of 関係ハンドル is a part of 自動車タイヤ is a part of 自動車
自動車
乗用車 バス
自動車
ハンドル タイヤ