関係データベースの表を正規化することによって得られる効果として, 適切なものはどれか。
平成26年度 秋期 ITパスポート試験 問68
この問題の解説と、これまでの解答の記録です。
問 68
不正解ア
「使用頻度の高いデータを同じ表にまとめる」のは、正規化とは逆方向の操作である。正規化は関数従属にしたがって表を分割していく作業であり、アクセス頻度を基準にデータを1つの表へ寄せ集める設計ではない。むしろ性能を優先してあえて重複を許し表をまとめるのは非正規化 (デノーマライゼーション) と呼ばれる別の手法で、更新時の不整合リスクを引き受ける代わりに参照性能を稼ぐものである。
- イ
正解 正解はイ「データの重複を排除して, 更新時におけるデータの不整合の発生を防止することができる」。関係データベースの正規化とは、1つの表に繰返し項目や複数の事柄が混在している状態を、関数従属関係にしたがって複数の表に分割し、同じ事実がデータベース中の1か所にだけ記録されるように整理することである。例えば「受注明細」の1つの表に、受注番号・商品コードと一緒に商品名や単価まで持たせていると、同じ商品が現れるたびに商品名・単価が重複して格納される。この状態で商品名を変更すると、該当する行をすべて漏れなく更新しなければならず、1行でも更新し忘れると同じ商品コードに別の商品名が存在する、という矛盾 (更新時異状) が起きる。正規化して「商品」表を切り出し、明細側は商品コードで参照する形にすれば、商品名は商品表の1行を直すだけで済み、そもそも矛盾が発生しえなくなる。このように、重複の排除によってデータの整合性 (一貫性) を保ちやすくすることが正規化の第一の効果であり、副次的に不要な重複が減ることで記憶容量の無駄も抑えられる。
不正解ウ
正規化は「表の大きさを均等にする」ことを目的にしていない。分割の基準はあくまでデータ項目間の従属関係であり、結果として生じる各表の行数や容量は対象データ次第で大きく偏る (例: 商品表は数百行、受注明細表は数百万行)。また主記憶の使用効率は DBMS のバッファ管理やハードウェア構成の話であって、論理設計である正規化が直接ねらう効果ではない。
不正解エ
正規化を進めると表は分割されるので、表の数は減るのではなく増える。さらに、分割された表から元の情報を得るには結合 (join) が必要になるため、問合せの応答時間はむしろ長くなる傾向がある。正規化は整合性を守るための設計であり、応答時間の短縮を目的とするものではない。応答性能が問題になる場合は、索引 (インデックス) の作成や、必要に応じた非正規化で対処する。
- 正規化とは、関数従属関係にもとづいて表を分割し、同じ事実が1か所にだけ格納されるようにする論理設計の手法。ねらいはデータの重複排除による更新時異状 (更新・追加・削除に伴う矛盾) の防止、すなわちデータの整合性の確保である。
- 正規化のトレードオフを押さえる。表が増えて結合が必要になるため参照性能は落ちやすく、性能を優先してあえて重複を残す設計を非正規化という。「表をまとめる」「表の数を減らす」「応答時間を短縮する」といった記述は正規化ではなく非正規化・性能チューニング側の話であり、正規化の効果としては誤りである。