今回は僕がデータベーススペシャリストの勉強をして、
特に重要だと感じた主キー、候補キー、スーパーキー、外部キーについてまとめました。
データベーススペシャリストを目指している方にはもちろん、
普通のシステムエンジニアやプログラマーにも抑えておいて欲しい内容です。
この記事を書いている僕はシステムエンジニア6年目
普段はJavaでWebアプリを作ったりSQL書いたり・・・(DBAのような仕事は普段していないです)
応用情報技術者試験に合格(2回落ちましたが。。)し、データベースの分野が得意だったので、
独学でデータベーススペシャリストの勉強をして、昨年合格(これは1発合格)しました。
今回は、データベーススペシャリストの勉強を通じて、
データベーススペシャリストを目指す人はもちろん、
普通のシステムエンジニアやプログラマーの方にも抑えておいて欲しい
主キー、候補キー、スーパーキー、外部キーについてまとめてみました。
キー
関係(表)において、タプル(行)を一意に識別するための属性もしくは属性集合をキーといい、
キーには次のようなものがあります。
主キー(primary key)
主キーは関係(表)の中で一つだけ設定します。
一意制約(重複が認められない)と非ナル制約(NULLが認められない)を併せ持つもので、
候補キーの中から最もふさわしいものが選ばれます。
例えば、
商品を識別するために一意に振られるような商品番号とか、
社員を識別するために一意に振られるような社員番号などがあります。
候補キー(candidate key)
候補キーは関係(表)の中に複数存在することがあります。
主キーの候補となるキーが候補キーで、候補キーの条件は、
- タプル(行)を一意に識別できること
- 極小であること(スーパーキーの中で極小のもの)
主キーとは異なり、NULLを許可する属性を持つ(もしくは含む)ものも許可します。
スーパーキー(super key)
関係(表)の中に、候補キーの数以上に存在し、
タプル(行)を一つに特定できるという条件(極小でなくていい)さえ満たせばスーパーキーになります。
具体的には、
候補キーに、様々な組み合わせで他の属性を付け足したものになります。
(関係(表)の、全ての属性もスーパーキーの一つになります。)
主キー、候補キー、スーパーキーの違いの例
次の表のような1人の社員に対して複数のタプル(行)を管理しているテーブルがあります。
この表では、
社員番号と連番、もしくは、社員番号と電話番号と住所の組み合わせで一意になります。
ただし、
電話番号や住所にはNULLを許容しており、逆に社員番号と連番にはNULLを許容していません。
この場合、主キー、候補キー、スーパーキーはそれぞれ以下のようになります。
◆主キー:{社員番号、連番}
◆候補キー:{社員番号、連番}
{社員番号、電話番号、住所}
◆スーパーキー:{社員番号、連番}
{社員番号、連番、氏名}
{社員番号、連番、氏名、性別}
・・・
{社員番号、連番、氏名、性別、電話番号、住所}
スーパーキーの中で、タプルを一意に識別できる極小の
{社員番号、連番}、{社員番号、電話番号、住所}が候補キーとなり、
さらに、
NULLを許可しない属性のみからなる候補キーの{社員番号、連番}が主キーになります。
また、主キー、候補キー、スーパーキーの関係を絵にすると、、
外部キー(foreign key)
他の関係(表)の主キー(または候補キー)を参照する項目を外部キーといいます。
例えば、
次の例のようにエンティティA、B間の関係が1対1の場合、
片方の主キーをもう片方に入れて外部キーとすることがあります。
関連が1対多の場合、関係A(1側)の主キーを関係B(多側)に入れて外部キーとします。
関係が多対多の場合、新たに関連エンティティを設けます。
これをエンティティCとおき、関係A、Bのそれぞれの主キーを関係Cに入れて外部キーとします。
おわりに
今回はデータベースのいろいろなキーについて確認しました。
特に候補キーと外部キーの多対多の関連を排除する部分は完璧にしておきましょう。
データベーススペシャリストの午後の試験では、
候補キーを抽出する問題や、
エンティティの多対多の関連を排除したりといった問題は必ず出ます。
基本的で簡単な内容ですが、
きちんと内容を理解し、使える知識として自分のものにしておきましょう。
参考にした資料
合格、おめでとうございます。
あと、勉強になりました。
ありがとうございます。
候補キーの追加の条件について、質問があります(すでにおっしゃっていたら申し訳ありません)。
「候補キーはスーパーキーの中で最小のもの」とありました。
それをもう少し厳密にすると、「候補キーはスーパーキーの上位集合をすべて省いたもの」、となるのでしょうか?
最初の一文、「追加」ではなく、「厳密」の間違いでした。
ご質問ありがとうございます。
例のように社員番号と連番でテーブルのレコードが一意に特定できる場合、
{社員番号、連番}がテーブルのレコードを一意に特定できる最小の組み合わせ(候補キー)
で、スーパーキーと言うのはいくらでもあって。。。
{社員番号、連番、氏名}、{社員番号、連番、氏名、性別}とかとか。
つまり、本当は{社員番号、連番}の組み合わせで一意に特定できるけど、他の項目を追加で組み合わせても一意にさえなればスーパーキーです。
回答になってますでしょうか。。。
はじめまして。
TomoProgと申します。
疑問に思った点があったため、質問させていただきます。
候補キーについて質問なのですが、この記事の例の場合、
{ 電話番号 }
は候補キーにならないのでしょうか?
電話番号はすべてユニークなので、電話番号だけでもタプルを特定できるため、候補キーになるのではと思ったのですが、考え方が違うのでしょうか?
ご質問ありがとうございます。
仰る通り、考え方は合っています。
この例だと電話番号でも候補キーになります。
すみません。。。混乱させてしまいましたね。