データベース

本当に理解している?データベースのキーについて

データベースにおけるキーとは

こんにちは、cocomaruです。

データベースを扱う上で必ず理解しておかなければならない概念としてキーという概念があります。

キー

関係表において、タプル(行)を一意に識別するための属性または属性の組

なにやら難しい表現が出てきましたね…。
一旦、表を用いて説明したいと思います。

例えば、ある会社の社員情報を管理する社員表テーブルがあるとします。

↓こんな感じ

社員番号 氏名 電話番号 年齢
1001 山田 太郎 080-1111-1111 32
1002 佐藤 隆司 080-2222-2222 25
1003 山田 太郎 25


※社員番号 001 と 003 は同姓同名の社員が所属している

社員表テーブルでは、{社員番号}または{氏名,電話番号}が決まればタプルは1つに特定できると仮定します。

この時、{社員番号}、{氏名,電話番号}は関係表(社員)においてタプルを一意に識別するためのキーという事になります。

またキーには次の通り、いくつか種類がありますので、それを一つずつ紹介していきます。

スーパーキー(super key)

スーパーキーはタプルを一意に特定できれば組み合わせは何でもよくて、
先述のテーブルで言えば以下は全てスーパーキーです。

{社員番号}
{社員番号, 氏名}
{社員番号, 年齢}
{社員番号, 氏名, 年齢}
{氏名, 電話番号}
{氏名, 電話番号, 年齢}

{社員番号, 氏名, 電話番号, 年齢}

スーパーキーはタプルを一つに特定できるという条件させ満たせば良いという特性を持ちます。

候補キー(candidate key)

候補キーの定義は次の通りになります。

候補キー

関係表のタプルを一意に識別できる属性または属性の組のうち極小のもの

さて、ここで「極小」という単語が出てきました。

この極小というのはスーパーキーの中でどれか一つでも欠ければ、一意性を確保できなくなる組み合わせの最小のものの事です。

先の例で言えば、{社員番号}、{氏名,電話番号}が候補キーとなります。

例えば、{氏名,電話番号,年齢}の組み合わせのスーパーキーでも一意になりますが、
これは{年齢}がなくてもタプルを一意に特定できますよね?!

このようにスーパーキーの中から余分な属性情報(この例では{年齢})を取り除いたキーを候補キーと呼びます。

主キー(primary key)

主キーは候補キーの中から相応しい組み合わせを一つだけ選んだものです。

また主キーのもう一つの制約として、非NULL制約(空値が認められない)という条件があります。
※候補キーはNULL値を持つことを許可されます。
※NULL(ナル)値は、0やスペースとも異なり、未定であるという状態を表す

社員表において候補キーは{社員番号}または{氏名,電話番号}が候補キーでしたね?

これらの候補キーの中から主キーを選択するのですが、主キーの制約として非NULL値制約があります。

ここで社員表を見ると社員番号003の社員は電話番号を持っていないので「-, NULL値」となっていますので、{氏名,電話番号}の候補キーは主キーとして選ぶことができません。

つまり社員表の主キーは{社員番号}となります。

サロゲートキー(surrogate key)と代理キー(alternate key)

ここまでの説明で主キーの話が出てきましたが、関係表において本来持つ属性から選択される主キーをナチュラルキー(自然キー)と言います。

このナチュラルキーに対して、代わりに付与されるキーのことをサロゲートキーといいます。

サロゲートキーが使われる例をあげたいと思いますが、せっかくなので社員表を用いましょう!
ですが少し条件を変えたいと思います。

・社員表には{社員番号}ないものとします。
・{氏名、電話番号}の{電話番号}はNULL値を取らないものとします。

この時、社員表の主キーは{氏名、電話番号}となりますよね?

これはこれで良いのですが、社員表からタプルを取得するときに、いちいち氏名と電話番号から検索するのは煩わしい時があります。

この時の代替手段として、主キー{氏名、電話番号}の代わりに{社員番号}(サロゲートキー)のような連番を追加する、といったケースがよくあります。

サロゲートキーは連番に代表されるようにそれ自体に意味はなく、一意性を確保して主キーとして使うためだけに付与されます。

なお、主キーではない候補キーのことをalternate key(代理キー)ともいいますが、
上記の場合、もともと存在した{氏名,電話番号}のナチュラルキーは主キーではない候補キーとなるので代理キーとなります。

外部キー(foreign key)

外部キーは複数の関係を結びつけるためのキーです。

外部キーにはいくつか組み合わせがありますので、表を用いて説明したいと思います!

1 対 1

関連が1対1の場合、片方の主キーをもう一方の属性に組み入れて外部キーとします。
例えば以下のような表です。

社員表に連絡先の情報を紐づける

・社員表

社員番号 氏名
1001 山田 太郎
1002 佐藤 隆司
1003 山田 太郎

・社員連絡先表

社員連絡先管理番号 電話番号 社員番号
2001 080-1111-1111 1001
2002 080-2222-222 1002
2003 1003

ここでは社員表の主キーを社員連絡先の外部キーとして設定していますが、1対1の場合、反対に社員連絡先の主キーを社員表に設定することも可能です。

ですが、通常は先にデータが登録される方の主キーを後から作成する方へ設定する方が自然です。

また余談ですが、データベーススペシャリスト試験で用いられるデータベースの表記法として以下がありますが、
表はその記法に倣って作成します。

主キー実線の下線を付ける。
外部キー破線の下線を付ける。
主キーかつ外部キー二重線の下線を付ける。

1 対 多

関連が1対多の場合、関係(1側)の主キーを関係(多側)に外部キーとして設定します。

1つの部署に複数の社員が所属する場合

・部門表

部門番号 部門名
2001 人事部
2002 企画部

・社員表

社員番号 氏名 部門番号
1001 山田 太郎 2001
1002 佐藤 隆司 2002
1003 山田 太郎 2002

多 対 多

関連が多対多の場合は新規に連関エンティティを設けます。
※エンティティは関係表のことを指すと思ってもらっても良いです。

社員は複数の部署に所属する場合

・部門表

部門番号 部門名
2001 人事部
2002 企画部
2003 開発部

・部門所属

部門番号 社員番号
2001 1001
2001 1002
2002 1001
2002 1003
2003 1002

・社員表

社員番号 氏名
1001 山田 太郎
1002 佐藤 隆司
1003 山田 太郎

さいごに

関係(表)において、キーの種類はいくつもあって最初は覚えるのが大変かもしれませんが、ここで説明したキーの概念はデータベースを使用するにあたって基礎的な内容になりますので、しっかりと学んでいきましょう!