主キーと外部キー

Image from Gyazo

本日のリレーション

今回は下記の 【学生リスト】【学部リスト】 を対象に解説します. 【学生リスト】は,学籍番号,氏名,学年,学部,また, 【学部リスト】は,学部,キャンパス,教員数で構成されています.

学籍番号 氏名 学年 学部
A001 岩城隼人 2 工学部
A002 岩村優 1 工学部
B003 杉江弘子 3 人文学部
C004 仙波あすか 1 国際関係学部

【学生リスト】

学部 キャンパス 教員数
工学部 春日井 30
人文学部 春日井 20
国際関係学部 名古屋 25

【学部リスト】

主キー

リレーショナルデータベースの運用において タプル(レコード)の検索や更新などの処理は必須です. 検索や更新を正しく行うには, リレーションに含まれる所定のタプルを一意に同定する必要があります.

例えば,【学生リスト】でタプルを検索することを考えてみましょう. 下記の学生証の学生をどのように検索したら良いでしょうか.

学籍番号:A002
工学部 1年

岩村 優

学年学部で検索することは問題がありそうですね. なぜなら,「1年」は岩村さんだけでなく,仙波さんも該当しています. 同様に,「工学部」は岩城さんも該当しています. これでは,一意に同定することは出来ません.

では,学籍番号氏名ではどうでしょうか. 「A002」や「岩村優」は,他のタプルと重複しておらず, 所定の学生を同定することが出来そうです. しかし,氏名に関しては,今回のケースでは, たまたま同姓同名の学生がいなかっただけで, データベースを運用している過程で, 重複が発生する可能性がありそうです.

よって,【学生リスト】においては, 学籍番号で検索するのが最も適していると言えそうです. このように,その値を指定すると特定のタプルを一意識別できる属性(属性集合も可)を 主キー(Primary Key)と呼びます (正確には候補キー(Candidate Key)であり,その中で最も適切な一つを選び主キーとします).

主キーであるためには,下記の主キー制約を満たす必要があります.

主キー制約

  • 主キーはタプルの一意識別能力を持つ(重複しない).
  • 主キーは空値(NULL)を含まない.

一つ目の条件は上述した通りです. 二つ目の条件は属性に値が設定されていない状態(空値と呼ぶ)は認められないことを意味しています. 例えば,下記のようなタプルを【学生リスト】に追加することが出来ません. もし,このようなタプルを認めてしまうと,主キーである学生番号で一意識別が出来なくなってしまいます.

学籍番号 氏名 学年 学部
内田弘 3 工学部

課題1

【納品表】における適切な主キーは何か.

商品番号 顧客番号 納品数
G1 C1 10
G1 C2 15
G2 C1 20
G3 C3 10
納品表

外部キー

一般にリレーショナルデータベースは,複数のリレーションで構成されます. 今回対象としてるリレーションも【学生リスト】と【学部リスト】に分けて管理されています. これらのリレーションは,お互いに値を参照することで,関連付けられることがあります. この関連付けを定義するのが 外部キー(Foreign Key) です.

では,【学生リスト】と【学部リスト】の参照関係を考えてみましょう. いずれのリレーションにも 学部 が存在していますね. どうやらこの 学部 が参照関係にありそうです. ここで,注目すべきは【学部リスト】の 学部 は主キーであることです. つまり,主キー制約により,重複する値は存在せず,空値となることはありません. 一方,【学生リスト】の 学部 は,主キーではないため,重複や空値が存在する可能性があります.

この場合,【学生リスト】の 学部 は【学部リスト】の 学部 を参照していると考えます. つまり,【学生リスト】の 学部 に出現する値は,【学部リスト】の 学部 に存在する値から選ぶ必要があります. このとき,【学生リスト】の 学部外部キー と呼びます.

外部キーであるためには,下記の外部キー制約を満たす必要があります.

外部キー制約

  • 外部キーの値は,参照先のリレーションの主キーの値から選ばれる.
  • 外部キーは空値(NULL)を含むことが許される.

外部キーは主キーとは異なり,空値を含むことが許される点に注意してください, このため,下記のようなタプルを【学生リスト】に追加することに問題はありません.

学籍番号 氏名 学年 学部
A003 内田弘 3

課題2

関係データベースで管理された業者表,仕入明細表及び商品表がある. 新たな業者から新たな商品を仕入れた場合, 表にデータを追加する適切な順番を理由を挙げて説明せよ. 下線は主キーを示し,破線は外部キーを示す. (平成22年度 秋期 ITパスポート)

業者コード 業者名
業者表
伝票番号 枝番 日付 商品コード 数量
仕入明細表
商品コード 商品名 業者コード 単価
商品表

情報処理技術者試験・過去問

下記リンクは ITパスポート試験ドットコム基本情報技術者試験ドットコム応用情報技術者試験ドットコムに掲載されている問題です.

参考書籍