会員登録すると
学習することができます。
会員登録する(無料)
学習することができます。
登録済みの方はこちら
ログイン
学ぶ目的
1枚の表に全部入れると、何が起きるか
応募を1枚の表で管理しているとします。応募のたびに、求職者の名前とメールアドレスも書き込んでいます。
| 応募 | 名前 | メールアドレス | 求人 |
|---|---|---|---|
| 1 | 佐藤 | sato@example.com | Rubyエンジニア |
| 2 | 佐藤 | sato@example.com | フロントエンド |
| 3 | 鈴木 | suzuki@example.com | Rubyエンジニア |
佐藤さんがメールアドレスを変えたので、応募1の行だけ書き換えました(sqlite3 で確認)。
UPDATE applications_flat SET user_email = 'sato2@example.com' WHERE id = 1;
SELECT DISTINCT user_name, user_email FROM applications_flat WHERE user_name = '佐藤';
佐藤|sato2@example.com
佐藤|sato@example.com
佐藤さんのメールアドレスが2つになりました。 どちらが正しいかは、データからは分かりません。これが「更新の事故」です。
1つの事実を1か所に置く
「佐藤さんのメールアドレスは何か」は、1つの事実です。それを応募の数だけ書いていたのが原因です。
求職者を別の表に分け、応募には「どの求職者か」だけを持たせます。すると、メールアドレスは1か所にしかありません。1か所を書き換えると、佐藤さんの応募2件どちらから見ても新しいアドレスになりました。
この「1つの事実を1か所に置く」ように表を分けることを正規化と呼びます。第1正規形・第2正規形…という細かい段階がありますが、最初はこの1行を覚えておけば十分です。
あえて2か所に持つこともある
ただし、実務ではわざと同じ情報を2か所に持つことがあります。naminori でも次のようにしています。
- 講座ごとのレクチャー数を、講座の側にも数字として持っている。講座一覧を出すたびに数え直さないため
- 記事の本文を、書いたままの形(Markdown)と、表示用に変換した形(HTML)の両方で持っている。表示のたびに変換しないため
どちらも、元の事実(レクチャーの件数・Markdown の本文)から計算で作れる値です。崩すときは「どちらが元か」を決め、元が変わったら写しも必ず直す仕組みを1つだけ用意します。人が手で合わせる運用にすると、いつか必ずずれます。
このレクチャーで学ぶこと
- 1枚の表に全部入れたときの更新の事故
- 1つの事実を1か所に置く(正規化)
- あえて2か所に持つ場合と、その条件
質問
まだ質問は投稿されていません。
質問投稿
ログイン後に質問の投稿ができます。