会員登録すると
学習することができます。
会員登録する(無料)
登録済みの方はこちら
ログイン

1つの事実は1か所に ― 正規化を「更新の事故」から理解する

目安学習時間 15分

課題

全問正解でレクチャー完了です。

【問題1】

応募ごとに求職者のメールアドレスを書き込む表で、1件の応募の行だけアドレスを書き換えたときに起きることはどれですか。

[選択肢]

【問題2】

あえて同じ情報を2か所に持つときの条件として、この講座が挙げているものはどれですか。

[選択肢]
会員登録すると
学習することができます。
会員登録する(無料)

学ぶ目的

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か所に持つ場合と、その条件

質問

まだ質問は投稿されていません。

質問投稿

ログイン後に質問の投稿ができます。