# デスペ H29 午後1

# 03/23

# H29 午後1-1

# 候補キーの決め方

  • タプルを一意に識別できるもの
    • 一意に識別できないとダメ
  • 極小であること

# 表1から関数従属性を抽出

  • 電子会議番号: 電子会議を一意に識別する文字列
    • 電子会議番号 \rightarrow 議題
  • 分野番号: 分野を一意に識別する番号
    • 分野番号 \rightarrow 分野
  • 表示順: 電子会議を一覧表示する際の順序を表す数値。一つの分野内で表示順が重複することはない。表示順の見直しによって値が変更されることもある。
    • 分野内で表示順が重複することはない
    • すなわち, 分野番号と表示順で電子会議番号を一意に識別できる
      • {分野番号, 表示順} \rightarrow 電子会議番号
    • 電子会議番号は一意なので, その逆もまた然り
      • 電子会議番号 \rightarrow {分野番号, 表示順}
  • 作成者ユーザID: 電子会議を作成したユーザのユーザID
    • 電子会議番号 \rightarrow 作成者ユーザID
  • 投稿番号: 電子会議番号との組合わせで投稿を一意に識別する番号
    • {電子会議番号, 投稿番号} \rightarrow {投稿本文, 投稿者ユーザID}
  • 電子会議は, いずれか1つの分野に属し, 分野毎に定められた表示順に従って一覧表示される
    • 電子会議番号 \rightarrow 分野番号

# 導き出した関数従属性から候補キーを選定

# 手順1. 全ての\rightarrowの始点をピックアップする

  • 電子会議番号
  • 分野番号
  • {分野番号, 表示順}
  • {電子会議番号, 投稿番号}

# 手順2. それぞれの属性が全てを決定できるかを確認する

  • 全ての属性はつぎの通り
    • 電子会議番号
    • 議題
    • 分野番号
    • 分野名
    • 表示順
    • 作成者ユーザID
    • 投稿番号
    • 投稿本文
    • 投稿者ユーザID
  • 電子会議番号
    • 電子会議番号(self)
    • 議題(電子会議番号 \rightarrow 議題)
    • 分野番号(電子会議番号 \rightarrow {分野番号, 表示順})
    • 分野名(電子会議番号 \rightarrow {分野番号, 表示順} \rightarrow 分野名)
    • 表示順(電子会議番号 \rightarrow {分野番号, 表示順})
    • 作成者ユーザID(電子会議番号 \rightarrow 作成者ユーザID)
    • 投稿番号(NG)
    • 電子会議番号はNG
  • 分野番号
    • 電子会議番号(NG)
    • 分野番号はNG
  • {分野番号, 表示順}
    • 電子会議番号({分野番号, 表示順} \rightarrow 電子会議番号)
    • 議題({分野番号, 表示順} \rightarrow 電子会議番号 \rightarrow 議題)
    • 分野番号(self)
    • 分野名(分野番号 \rightarrow 分野名)
    • 表示順(self)
    • 作成者ユーザID({分野番号, 表示順} \rightarrow 電子会議番号 \rightarrow 作成者ユーザID)
    • 投稿番号(NG)
    • {分野番号, 表示順}はNG
  • {電子会議番号, 投稿番号}
    • 電子会議番号(self)
    • 議題(電子会議番号 \rightarrow 議題)
    • 分野番号(電子会議番号 \rightarrow {分野番号, 表示順})
    • 分野名(電子会議番号 \rightarrow {分野番号, 表示順} \rightarrow 分野名)
    • 表示順(電子会議番号 \rightarrow {分野番号, 表示順})
    • 作成者ユーザID(電子会議番号 \rightarrow 作成者ユーザID)
    • 投稿番号(self)
    • 投稿本文, 投稿者ユーザID({電子会議番号, 投稿番号} \rightarrow {投稿本文, 投稿者ユーザID})
    • {電子会議番号, 投稿番号}でok

# 手順3. 入れ替えが必要かチェックする

  • {電子会議番号, 投稿番号}を被決定項とする関数従属性はない
  • 電子会議番号を被決定項とする関数従属性はある
    • {分野番号, 表示順} \rightarrow 電子会議番号
    • 従って, {分野番号, 表示順, 投稿番号}も候補キー
  • 投稿番号を被決定項とする関数従属性はない

したがって, 候補キーは

  • {電子会議番号, 投稿番号}
  • {分野番号, 表示順, 投稿番号}
    になる

# 第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 カーソル名
Last Updated: 9ヶ月前