令和5年度 ITパスポート試験 問59

関係データベースで管理された“会員管理”表を正規化して,“店舗”表,“会員種別”表及び“会員”表に分割した。“会員”表として,適切なものはどれか。ここで,表中の下線は主キーを表し,一人の会員が複数の店舗に登録した場合は,会員番号を店舗ごとに付与するものとする。

「会員管理」表
図の説明テキスト

「会員管理」表

店舗コード 店舗名 会員番号 会員名 会員種別コード 会員種別名
001 札幌 1 試験 花子 02 ゴールド
001 札幌 2 情報 太郎 02 ゴールド
002 東京 1 高度 次郎 03 一般
002 東京 2 午前 桜子 01 プラチナ
003 大阪 1 午前 桜子 03 一般
「店舗」表
図の説明テキスト

「店舗」表のスキーマ
| 店舗コード | 店舗名 |

「会員種別」表
図の説明テキスト

「会員種別」表のスキーマ
| 会員種別コード | 会員種別名 |

解答・解説

正解: エ.

関係データベースの正規化に関する問題です。
「会員管理」表に含まれる項目間の関数従属性を明らかにし、適切に表を分割(正規化)する手順を考えます。

まず、「会員管理」表の行を一意に特定するための主キーを特定します。
問題文に「一人の会員が複数の店舗に登録した場合は,会員番号を店舗ごとに付与するものとする」とあることや、「会員管理」表のデータ(札幌の会員番号1と、東京の会員番号1が存在していること)から、会員番号単独では行を一意に特定できないことがわかります。行を特定するためには、店舗コードと会員番号の両方が必要です。
したがって、「会員管理」表の主キーは {店舗コード, 会員番号} の複合キーとなります。

次に、主キーからの関数従属性(ある項目の値が決まれば、別の項目の値も一つに決まる関係)を整理します。

  1. 店舗コード →\rightarrow 店舗名
  2. 会員種別コード →\rightarrow 会員種別名
  3. {店舗コード, 会員番号} →\rightarrow 会員名, 会員種別コード

表を分割する際、元の表の情報を失わずに復元(結合)できるようにする必要があります(情報無損失分解)。

  • 1の従属性から、「店舗」表は {店舗コード, 店舗名} となります(店舗コードが主キー)。
  • 2の従属性から、「会員種別」表は {会員種別コード, 会員種別名} となります(会員種別コードが主キー)。
  • 残りの「会員」表は、主キーである {店舗コード, 会員番号} と、それに直接従属する {会員名, 会員種別コード} で構成されます。「会員」表は、店舗表や会員種別表と紐づけるための外部キーも持たなければならないため、これらの属性を欠かすことはできません。

よって、「会員」表のスキーマは {会員番号, 店舗コード, 会員名, 会員種別コード} となり、会員番号 と 店舗コード に下線(主キー)が引かれたエが適切です。

各選択肢の解説

  • ア:主キーが 会員番号 のみとなっており、これでは店舗が異なる同じ会員番号のデータを区別できません(例:札幌の1番と東京の1番など)。また、会員種別コード の列が欠落しており、「会員種別」表と結合できません。
  • イ:主キーが 会員番号 のみとなっており、店舗ごとの会員を識別することができません。
  • ウ:主キーは適切ですが、会員種別コード が欠落しているため、「会員種別」表と結合して元のデータを復元することができません。
  • エ:正解です。主キーが {会員番号, 店舗コード} であり、必要な非キー属性(会員名, 会員種別コード)をすべて含んでいます。

Spineチーム