こう 聞かれます
- 「正規化とは
何ですか。 なぜするのですか」 - 「第 1 正規形から
第 3 正規形を、 簡単に 説明してください」 - 「正規化を
崩すのは、 どんな ときですか」
面接官が 見ている点
- 用語の
暗記より、 「同じ 事実を 何か所にも 書くと 食い 違う」という 困り ごとで話せるか - 第 1〜第 3 正規形を、
自分の 言葉で 素朴に言えるか - 崩すときは、
理由と 引き換えに する物を言えるか
短い答え
- 正規化は、
同じ 事実を 1 か所にだけ置くように 表を 分ける ことです。 - 同じ値を
何行にも 書くと、 直すときに 一部だけ 古いまま 残り、 データが 食い 違うので、 それを 防ぐ ためにします。 - 読む速さの
ために、 あえて 重複を 持たせる こともありますが、 その ときは 食い 違いを 防ぐ 手当てとセットにします。
少し 詳しい答え
重複が 生む食い違い
注文の
SQL クエリ
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer VARCHAR(20),
city VARCHAR(20),
item VARCHAR(20)
);
INSERT INTO orders VALUES
(1, '佐藤', '東京', 'ペン'),
(2, '佐藤', '東京', 'ノート');
UPDATE orders SET city = '大阪'
WHERE id = 2;
SELECT customer, city
FROM orders
ORDER BY id;佐藤|東京
佐藤|大阪どちらが
第 1〜第 3 正規形を素朴に
- 第 1 正規形 1 つの
マスに 値は 1 つ。 「ペン, ノート」のように 1 マスに 並べず、 行を分けます - 第 2 正規形 2 つの
列を 組に した キーの 表で、 片方の 列だけで 決まる 値を 別の 表に 出します。 注文の 明細で、 商品の 名前は 商品の 番号だけで 決まるので、 商品の 表に移します - 第 3 正規形キーではない列で
決まる 値を 別の 表に 出します。 町は 注文ではなく 顧客で 決まるので、 顧客の 表に移します
崩す判断
正規化すると
一方、
作った
よく ある間違い
- 「正規化は
表を 細かく 分ける こと」とだけ言う 目的は、 同じ 事実を 1 か所に 置いて 食い 違いを 防ぐ ことです。 分けるのは その手段です - 「正規化すれば速くなる」と言う
書き込みは 素直に なりますが、 読むときの 結合は 増えます。 速さの ために 崩すこともあります - 履歴として
残すべき値まで 消してしまう 注文の ときの 値段や 送り先は、 今の 値とは 別の 事実なので、 注文の 側に残します
深掘りの問い
- 「注文の
値段は、 商品の 表から 毎回引けば よいですか」 商品の 値段が 変わると 過去の 注文の 金額まで 変わってしまうので、 注文の ときの 値段は 注文の 側に 残す、と答えます - 「多対多の
つながりは、 どう 表にしますか」 2 つの 表の 主キーを 組で 持つ、 間の 表 (中間テーブル) を 作る、と答えます - 「集計の
値を 持たせたら、 どう 食い 違いを 防ぎますか」 書き込みと 集計の 更新を 同じ トランザクションで 行う、 または 決まった 時に 作り直す、と答えます