主キーと外部キー

Image from Gyazo

本日のリレーション

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

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

【学生リスト】

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

【学部リスト】

主キー

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

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

Image from Gyazo

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

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

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

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

主キー制約

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

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

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

例題1

【学部リスト】における適切な主キーは何か.

例題2

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

社員番号保険証番号入社年度部署
E0127392016営業
E0292812018人事
E0336102019人事
E0472322020営業
社員表

例題3

【納品表】における適切な主キーは何か.納品表は特定の顧客に特定の商品を納品した数を記録するために用いる.

商品番号顧客番号納品数
G1C110
G1C215
G2C120
G3C310
納品表

外部キー

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

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

Image from Gyazo

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

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

外部キー制約

  • 外部キーの値は,参照先の属性に出現する値から選ばれる.
  • 外部キーは空値(NULL)を含むことが許される.

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

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

例題4

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

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

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

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