こう 聞かれます
- 「主キーと
外部 キーは 何の ために ありますか」 - 「利用者と
注文の 表を 作るなら、 どんな キーを 置きますか」 - 「メールアドレスを
主キーに しても よいですか」 (一意制約との 違いを 確かめる形)
面接官が 見ている点
- 主キーは
「行を見分ける」、 外部 キーは 「ほかの 表の 行を 正しく 指す」と、 役目で話せるか - 外部
キーが あると、 存在しない 相手を 指す行を DB が 断る、 と分かっているか - 主キーと
一意制約の 違いを言えるか
短い答え
- 主キーは
表の 1 行を 見分ける ための 列で、 重複も NULL (空の 値) も 許されません。 - 外部
キーは、 ほかの 表の 主キーなどを 指す列で、 存在しない 相手を 指す行を DB が 断ります。 - 主キーで
行を 見分け、 外部 キーで 表どうしの つながりが 壊れないように 守ります。
少し 詳しい答え
利用者と注文の例
1 人のuser_id が、id を
SQL クエリ
CREATE TABLE users (
id INTEGER PRIMARY KEY,
email VARCHAR(255)
NOT NULL UNIQUE
);
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
FOREIGN KEY (user_id)
REFERENCES users(id)
);この
- いない
利用者 (た とえば idが 99) を指す注文を入れる - 注文が
残っている 利用者を 消す (何もしないと、 消された 人を 指す注文が 残るため) - 同じ
idや同じ メールアドレスの 利用者を もう 1 人入れる
同じ
主キーと一意制約
一意制約 (UNIQUE) も
作った
よく ある間違い
- 「外部
キーは 表を つなげて 検索する ために 要る」と言う 結合は 外部 キーが 無くても 書けます。 外部 キーの 役目は、 つながりが 壊れないように 守ることです - 「主キーと
一意制約は 同じ」と言う 主キーは 表に 1 つで NULL を 許しません。 一意制約は いくつも 置け、 NULL の 扱いも違います - 重複の
チェックを 画面の 側だけで済ませる 2 人が 同時に 登録すると、 どちらも 「まだ無い」と 判断して 通る ことがあります。 DB の 制約でも守ります
深掘りの問い
- 「利用者を
消すとき、 注文は どうしますか」消すのを 断る、 注文も いっしょに 消す、 注文の 利用者を NULL に する、を 外部 キーの 設定で 選べます。 売上の 記録を 残したいなら 消さない、のように 業務で 決める、と答えます - 「メールアドレスを
主キーに すると、 何が 困りますか」 メールを 変えると、 それを 指している 表の 値も 全部直す必要が 出ます。 変わらない 番号を 主キーに する、と答えます - 「主キーは
連番と ランダムな ID の どちらが よいですか」 連番は 短く 並びも 素直ですが、 URL に 出すと 件数を 推測されます。 外に 出すか どうかで 選ぶ、 と答えます