# デスペ H29 午後1
# 03/23
# H29 午後1-1
# 候補キーの決め方
- タプルを一意に識別できるもの
- 一意に識別できないとダメ
- 極小であること
# 表1から関数従属性を抽出
- 電子会議番号: 電子会議を一意に識別する文字列
- 電子会議番号 議題
- 分野番号: 分野を一意に識別する番号
- 分野番号 分野
- 表示順: 電子会議を一覧表示する際の順序を表す数値。一つの分野内で表示順が重複することはない。表示順の見直しによって値が変更されることもある。
- 分野内で表示順が重複することはない
- すなわち, 分野番号と表示順で電子会議番号を一意に識別できる
- {分野番号, 表示順} 電子会議番号
- 電子会議番号は一意なので, その逆もまた然り
- 電子会議番号 {分野番号, 表示順}
- 作成者ユーザID: 電子会議を作成したユーザのユーザID
- 電子会議番号 作成者ユーザID
- 投稿番号: 電子会議番号との組合わせで投稿を一意に識別する番号
- {電子会議番号, 投稿番号} {投稿本文, 投稿者ユーザID}
- 電子会議は, いずれか1つの分野に属し, 分野毎に定められた表示順に従って一覧表示される
- 電子会議番号 分野番号
# 導き出した関数従属性から候補キーを選定
# 手順1. 全てのの始点をピックアップする
- 電子会議番号
- 分野番号
- {分野番号, 表示順}
- {電子会議番号, 投稿番号}
# 手順2. それぞれの属性が全てを決定できるかを確認する
- 全ての属性はつぎの通り
- 電子会議番号
- 議題
- 分野番号
- 分野名
- 表示順
- 作成者ユーザID
- 投稿番号
- 投稿本文
- 投稿者ユーザID
- 電子会議番号
- 電子会議番号(self)
- 議題(電子会議番号 議題)
- 分野番号(電子会議番号 {分野番号, 表示順})
- 分野名(電子会議番号 {分野番号, 表示順} 分野名)
- 表示順(電子会議番号 {分野番号, 表示順})
- 作成者ユーザID(電子会議番号 作成者ユーザID)
- 投稿番号(NG)
- 電子会議番号はNG
- 分野番号
- 電子会議番号(NG)
- 分野番号はNG
- {分野番号, 表示順}
- 電子会議番号({分野番号, 表示順} 電子会議番号)
- 議題({分野番号, 表示順} 電子会議番号 議題)
- 分野番号(self)
- 分野名(分野番号 分野名)
- 表示順(self)
- 作成者ユーザID({分野番号, 表示順} 電子会議番号 作成者ユーザID)
- 投稿番号(NG)
- {分野番号, 表示順}はNG
- {電子会議番号, 投稿番号}
- 電子会議番号(self)
- 議題(電子会議番号 議題)
- 分野番号(電子会議番号 {分野番号, 表示順})
- 分野名(電子会議番号 {分野番号, 表示順} 分野名)
- 表示順(電子会議番号 {分野番号, 表示順})
- 作成者ユーザID(電子会議番号 作成者ユーザID)
- 投稿番号(self)
- 投稿本文, 投稿者ユーザID({電子会議番号, 投稿番号} {投稿本文, 投稿者ユーザID})
- {電子会議番号, 投稿番号}でok
# 手順3. 入れ替えが必要かチェックする
- {電子会議番号, 投稿番号}を被決定項とする関数従属性はない
- 電子会議番号を被決定項とする関数従属性はある
- {分野番号, 表示順} 電子会議番号
- 従って, {分野番号, 表示順, 投稿番号}も候補キー
- 投稿番号を被決定項とする関数従属性はない
したがって, 候補キーは
- {電子会議番号, 投稿番号}
- {分野番号, 表示順, 投稿番号}
になる
# 第3正規形に分解
- 電子会議投稿(電子会議番号, 議題, 分野番号, 分野名, 表示順, 作成者ユーザID, 投稿番号, 投稿本文, 投稿者ユーザID)
# 手順1. 候補キーから主キーを選定する
候補キーは次の2つ
- {電子会議番号, 投稿番号}
- {分野番号, 表示順, 投稿番号}
主キーはNULLを許容しない
- 一度でもNULLが格納されそうな属性がないか確認する
- ない
生成後に変更がないことを保証する
- 設定してから変更される場合, 主キーとしては相応しくない
- 表示順は見直しによって変化することがあるらしい
- 表示順 はNG したがって, 主キーは {電子会議番号, 投稿番号}
電子会議投稿(電子会議番号, 議題, 分野番号, 分野名, 表示順, 作成者ユーザID, 投稿番号, 投稿本文, 投稿者ユーザID)
# 手順2. 部分関数従属の排除
- 先ほど挙げた関数従属性を用いる
- 電子会議という関係を作成する
- 「電子会議を〜」という表現が多々でてくるため
- 電子会議 (電子会議番号, 議題, 分野番号, 表示順, 作成者ユーザID)
- 同様に, 投稿という関係を作成する
- 「投稿を〜」という表現がでてくるため
- 投稿 (電子会議番号, 投稿番号, 投稿本文, 投稿者ユーザID)
- さらに, 分野という関係を作成する
- 「分野を〜」「分野の〜」という表現が出てくるため
- 分野 (分野番号, 分野名)
- ここで, 外部キーが存在しているので破線を追加しておく
- 電子会議 (電子会議番号, 議題, 分野番号, 表示順, 作成者ユーザID)
- 投稿 (電子会議番号, 投稿番号, 投稿本文, 投稿者ユーザID)
- 分野 (分野番号, 分野名)
# 外部キーの命名と推定
- 「意味を識別できる名称」にできれば良い
- 公式解答はこれに沿っているので, 参考になるはず
- 破線で外部キーと明示されていなくとも, 他の関係の主キーである場合は外部キーとして捉えても良い
- そうすることで関数従属性が見えてくることもある
- 主キーかつ外部キーの時は, 主キーのみの記述となる
- 「〜を定めてもよい」は「〜を定めなくてもよい」の言い換え
- この場合は, 関数従属元がNULLになることもある
- 「必要に応じて」も同様
# 午後1-2
# INNER JOINとOUTER JOIN
- INNER JOINはAND
- OUTER JOINはOR
- LEFT OUTER JOINはA全体にBをJOIN
- RIGHT OUTER JOINはB全体をAにJOIN
- BがNULLでも良い場合は, LEFT OUTER JOIN
- AがNULLでも良い場合は, RIGHT OUTER JOIN
# シーケンシャルリード
- 逐次読み込みのことだった
- 対して使われるのが, ランダムリード(ランダムアクセス)
# SQL-カーソル処理
- 更新処理は
UPDATE ~ WHERE CURRENT OF カーソル名