問題 11★★☆

販売管理のデータベースで正規化を進め、顧客・商品・受注・受注明細といった 表に細かく分けた。この設計について注意すべき点として、最も適切なものはどれか。

正解:ウ

各選択肢の解説

  1. ア同じ値が何行にも入るため、更新時に一部だけ直して食い違いやすくなる。

    誤り。これは正規化していない表で起こる問題です。正規化は同じ値を1か所にだけ 持つように表を分ける設計なので、この食い違いはむしろ防がれます。 正規化で「解消するもの」と「新たに生じるもの」を取り違えないようにします。

  2. イ表を分けたことで、どの受注がどの顧客のものかという対応が失われる。

    誤り。表を分けるとつながりが切れると思われがちですが、受注の表に顧客番号を 残しておくので対応は失われません。必要なときは顧客番号の値が一致する行どうしを 結合すれば、受注と顧客の情報を並べて取り出せます。

  3. ウ表をまたいで取り出すたびに結合が必要になり、検索に時間がかかることがある。

    正解。一覧を表示するだけでも顧客名は顧客の表、商品名は商品の表にあるため、 表を結び付ける処理が毎回発生します。分けるほど、この処理の負担は増えます。

  4. エ検索が速くなる代わりに、データを更新する処理に時間がかかるようになる。

    誤り。向きが逆で、これは非正規化(あえて表をまとめる設計)の特徴に近いものです。 1つの表にまとめれば読み出しは速くなりますが、同じ値を何か所も書き換える 手間を抱えます。正規化した表は更新が1か所で済み、検索で結合の負担を負います。

理解を深めるために

分ければ正しくなるが、集めるのに手間がかかる

書類を用途ごとのファイルに分けて整理すると、同じことを何枚にも書かずに済み、 直すときも1か所で終わります。その代わり、報告書を作るたびに何冊ものファイルを 開いて突き合わせる手間が生まれます。データベースの正規化も同じ性質を持っています。

なぜ検索に時間がかかるのか

正規化した販売管理のデータベースでは、情報が次のように分かれています。

  • 顧客の表 … 顧客番号、顧客名、住所
  • 商品の表 … 商品コード、商品名、単価
  • 受注の表 … 受注番号、顧客番号、受注日
  • 受注明細の表 … 受注番号、商品コード、数量

「誰が何をいくつ注文したか」という一覧を出すには、この4つの表を共通の項目で 結合しなければなりません。データ量が多い表どうしを何度も結合すると、 検索や集計に時間がかかることがあります。

そこで、表示の速さがとくに求められる箇所では、あえて一部の表をまとめて重複を 許す非正規化を選ぶことがあります。正しさ(更新時の食い違いを防ぐ)と 速さ(結合の負担を減らす)のどちらを優先するかを決めるのが、 パフォーマンスを意識した設計です。

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

設計 更新 検索
正規化(表を分ける) 1か所を直せば済み、食い違いが起きにくい 結合が増え、時間がかかることがある
非正規化(表をまとめる) 同じ値を何か所も直す必要があり、食い違いやすい 結合が少なく、速くしやすい

試験では「正規化で防げるもの」と「正規化で増えるもの」を入れ替えた選択肢が よく並びます。防げるのは更新時の食い違い、増えるのは結合の負担、と対で覚えます。

前の問題へ次の問題へ