会員情報を管理する表を設計している。この表の中の1行を他の行と区別して 確実に取り出すために設定する主キーの説明として、最も適切なものはどれか。
正解:イ
ア他の表の項目を参照し、表どうしを結び付けるために置かれる項目。
誤り。これは外部キーの説明です。受注の表に顧客番号を持たせて顧客の表を 指すような使い方をします。参照先の表では同じ顧客番号が主キーになりますが、 参照する側では同じ値が何行にも現れてよく、役割が逆向きです。
イ行ごとに値が重複せず空にもならない、行を一意に特定できる項目。
正解。主キーは1行を必ず1つに絞り込むための項目なので、値が重複していては どの行か決まらず、空だと指し示せません。会員番号のように必ず値が入り、 他の会員と重ならない項目を選びます。
ウ値と格納場所の対応を別に持ち、目的の行の検索を速くする仕組み。
誤り。これはインデックス(索引)の説明です。主キーには自動で索引が作られる ことが多いため混同されますが、索引は速さのための補助であり、 値が重複しないことや空でないことを保証するものではありません。
エ入力された値が決められた範囲や形式に収まるかを確かめる決まり。
誤り。これは入力値の妥当性を検査する制約の説明です。年齢は0以上、 日付は決まった書式、といった形で値の中身を点検します。 値が正しくても他の行と同じであれば行は特定できず、主キーの役割とは別です。
「その1行」を指させる項目
主キーは、表の中の1行を必ず1つに絞り込むための項目です。 条件はたった2つで、値が他の行と重ならないこと(一意性)と、 空のままにできないこと(必ず値が入ること)です。
会員の表を例に、どの列なら主キーにできるかを考えてみます。
- 氏名 … 同姓同名の会員がいれば、どちらの行か決められない
- 生年月日 … 同じ日に生まれた会員は当然いる
- メールアドレス … 持っていない会員がいると空になり、変更もされる
- 会員番号 … 入会時に必ず発行し、誰とも重ならないので主キーに向く
このように、業務上の意味を持つ項目は重複や空欄が起きやすいため、 番号を発行して主キーにする設計がよく取られます。
設計の流れの中での位置づけ
データベースの設計では、まず管理する対象(エンティティ)として 「会員」「商品」「受注」などを洗い出し、それらの間の関連(リレーションシップ)を 決めます。そのうえで各エンティティを表にし、行を見分ける主キーを置きます。 受注の表に会員番号を持たせて会員の表と結び付けるといった具合に、 主キーは表と表をつなぐ手がかりにもなります。
似た仕組みとの違い
| 仕組み | 役割 |
|---|---|
| 主キー | 重複せず空でもない値で、表の中の1行を一意に特定する |
| 外部キー | 他の表の主キーを参照し、表どうしの関連を表す |
| インデックス | 値と格納場所の対応を別に持ち、検索を速くする |
| 入力値の制約 | 範囲や書式を決め、そこから外れた値の登録を防ぐ |
「一意に特定できるか」「空になりうるか」の2点で判断すれば、 主キーに向く項目かどうかは迷わず選べます。