データベースデータベース設計★★★

受注を1つの表で管理しており、1行に受注の内容と顧客の住所をまとめて記録している。 同じ顧客が何度も注文したため同じ住所が何行にも入っており、引っ越しの連絡を受けて 直したときに一部の行を直しそびれ、住所が食い違った。 このような事態を防ぐために行う正規化の目的として、最も適切なものはどれか。

正解:

  1. 同じデータを別の場所にも複製して持ち、障害が起きても復元できるようにする。

    誤り。これはバックアップの考え方です。あえて複製を持つ点で、重複をなくす 正規化とは向きが逆になります。バックアップがあっても、運用中の表に住所が 何行も入っている限り、直しそびれによる食い違いは起こります。

  2. 表記のゆれをそろえて、同じ対象を指している複数の記録を一つにまとめる。

    誤り。これは名寄せの説明です。「重複をなくす」という言葉が同じなので 混同されますが、名寄せは既に登録されたデータの汚れを後から直す作業、 正規化は同じデータが何行にも入らないようにする表の設計です。

  3. 重複するデータを持たないように表を分け、更新するときの食い違いを防ぐ。

    正解。住所を顧客の表に1か所だけ持ち、受注の表からは顧客番号で結び付ければ、 引っ越しのときに直すのは1行だけで済みます。同じ値を何か所にも持たないことが、 食い違いを生まない一番確実な方法です。

  4. 関連する項目を1つの表にまとめて、表を組み合わせて取り出す手間をなくす。

    誤り。これは性能を優先して重複をあえて許す非正規化の考え方で、正規化とは 逆向きです。読み出しは速くなりますが、同じ値が何行にも入るため、 まさに今回のような更新時の食い違いを抱え込むことになります。

同じことを2か所に書くと、いつか食い違う

住所録と年賀状リストの両方に友人の住所を書いていると、引っ越しの連絡が来たとき 片方だけ直してしまいがちです。どちらが正しいのか分からなくなる。 データベースでもまったく同じことが起こります。

問題文の表は、受注1件ごとに顧客の住所を書き写しています。10回注文した顧客なら 住所は10行に入っており、全部を直さないと古い住所が残ります。 残った行から宛名を出せば、荷物は届きません。

正規化は「同じデータを1か所だけに置く」設計

正規化は、1つの表に詰め込まれたデータを、意味のまとまりごとに表へ分け、 同じデータが何度も現れない形に整える設計作業です。

  • 顧客の表 … 顧客番号、氏名、住所(1顧客につき1行だけ)
  • 受注の表 … 受注番号、顧客番号、商品、数量

住所は顧客の表の1行にしかないので、引っ越しの修正は1か所で終わります。 必要なときは顧客番号を手がかりに両方の表を結び付けて取り出します。 記憶容量が減るのは副次的な効果で、主目的は更新時の食い違いを防ぐことです。

混同しやすいものとの違い

用語 何をするものか
正規化 設計段階で表を分け、同じデータを1か所にだけ持つようにする
名寄せ 既にあるデータの表記ゆれを吸収し、同一の対象の記録をまとめる
バックアップ 別の場所に複製を保管し、障害や誤操作から復元できるようにする
非正規化 速さを優先し、あえて重複を許して1つの表にまとめる

分ければ食い違いは減りますが、取り出すたびに表を結び付ける手間は増えます。 どこまで分けるかは、正しさと処理の速さのつり合いで決める設計判断です。

次の問題へ