データベーススペシャリスト 2012年 午後1 問02
データベースの設計に関する次の記述を読んで、設問1〜3に答えよ。
D社は、教育、生活など、様々な分野にわたる書籍の出版及びメディアを提供する会社である。幾つかの部門では会員制のWebサイトを立ち上げ、販売促進に利用している。しかし、Webサイトごとに会員登録が必要であり、利用者から改善の要望が寄せられていた。また、D社にとっても複数のWebサイトにまたがる共通のサービスを提供できないなどの問題があった。
D社は、各Webサイトがもつ会員情報を統合管理するための会員管理システムを構築することとなり、そのための新データベースの設計を情報システム部のJ君が担当することになった。
〔新データベース上で扱う情報〕
(1) 会員とは、Webサイトを利用するために必要な情報を登録した利用者である。 会員には、一般会員と期限付き会員の会員区分がある。
① 一般会員とは、個人情報、認証情報などをD社に提示して会員登録し、Webサイトの全てのコンテンツを閲覧できる会員である。
② 期限付き会員とは、簡便な会員登録だけを行い、特定のコンテンツだけが閲覧できる会員である。 一般会員と異なり、定められた有効期限を過ぎるとWebサイトを利用できなくなる。
(2) 会員は、Webサイトごとに利用登録を行うことで、そのWebサイトを利用することができる。会員が利用するWebサイトごとに利用開始年月日を管理する。
(3) サービスとは、“ニュース”、“ブログ”など、Webサイトで提供される会員向けの機能である。サービスは、Webサイトごとに複数提供され、WebサイトIDとサービスIDの組合せによって識別される。
(4) コンテンツとは、ブログサービスの“記事一覧”、“コメント投稿”など、サービスを構成する個々の要素である。 コンテンツはコンテンツIDによって識別され、コンテンツごとにWebサイトのトップページのURLからの相対パス(ディレクトリ)が特定される。 また、会員はログイン後に任意のコンテンツをお気に入りとして登録することができる。お気に入りは、登録した日時の順に表示される。
(5) 権限区分とは、コンテンツに対して利用が可能な権限の種類である。権限区分には“参照可”、“参照不可”、“参照及び投稿可” の3種類があり、コンテンツIDと会員区分の組合せでいずれかに定められる。
(6) 掲示板とは、メッセージを投稿し、会員同士でコミュニケーションを行うための機能である。会員は、タイトルと説明文を入力して掲示板を開設することができる。掲示板は、WebサイトIDと掲示板IDの組合せによって一意に識別される。
(7) メッセージとは、掲示板に投稿された文章である。会員は、掲示板にメッセージを新規投稿できるだけでなく、第三者からの投稿メッセージに対して返信することができる。 メッセージの返信が行われると、返信対象の投稿メッセージ (親メッセージ)との関係はツリー構造で表示される。 メッセージは、掲示板単位に連番のメッセージ番号によって、一意に識別される。
〔Webサイト、掲示板の例〕
D社で運営しているWebサイトの例を図1に、掲示板の例を図2に示す。


〔新データベースのテーブル構造の設計〕
J君は、新データベースのテーブル構造を図3のように設計した。
なお、“掲示板” はサービスと同様にWebサイトの一機能であるが、サービスとは異なるテーブルとして設計した。
J君の上司であるK部長は、J君が設計したテーブル構造をレビューし、次の①〜③を指摘した。
〔K部長の指摘事項〕
① 図3中のテーブルの一部に、列名、主キー、外部キーが記入されていない。
② “掲示板” テーブルは、第3正規形に正規化されていない。
③ 掲示板に投稿されたメッセージに対する返信が、どのメッセージに対する返信であるかを管理できない。
〔事業部門からの要望〕
設計の途中で、事業部門から次の要望が寄せられ、対応することになった。
(ア) 有償サービスの提供:D社で作成した付加価値の高いコンテンツは、有償で提供したい(例:月額課金制で電子書籍などの特定コンテンツの閲覧・ダウンロードができるサービス)。
J君はこの要望に対応するために、次の内容について概念データモデル上で検討した。
・会員の区分として、一般会員、期限付き会員の他に、“有償会員”を新規に追加する。
・サービスの区分として、“有償サービス”を新設する。 〔新データベースのテーブル構造の設計〕 で定義したサービスは“無償サービス”とする。
・有償会員が購入したサービスを管理するために、“購入サービス”を新たに定義する。
(イ) メールマガジンの配信: Webサイトに関連する情報を提供するために、会員向けのメールマガジン (以下、メルマガという)を配信したい。
この要望に対する業務要件は次のとおりである。
・Webサイトは、複数種類のメルマガを配信できる。 メルマガはWebサイトIDとメルマガIDの組合せによって一意に識別し、メルマガ名を管理する。
・配信したメルマガは、バックナンバとしてメルマガ本文を配信日時ごとに管理する。
・会員は、利用しているWebサイトについて、複数のメルマガを購読できる。 会員が購読しているメルマガごとに、購読開始日を管理する。
・メルマガを購読している会員は、当該メルマガのバックナンバを閲覧できる。
〔データの移行〕
J君は、各Webサイトの重複した会員データを統合することを視野に入れ、データの移行作業の検討を行った。まず、J君は複数の既存Webサイトのデータベースから、“一般会員” テーブルに相当する登録済の会員データを入手し、整理した。 WebサイトA〜Cから抽出した会員データの一部を、それぞれ表1〜3に示す。
なお、表1,2のテーブルの主キーは会員番号であり、それぞれ異なるルールで番号が割り振られている。 また、表3のテーブルの主キーはメールアドレスである。


次にJ君は整理した結果を踏まえて、データを移行するための作業内容及び作業方法を検討し、次の表4の手順で移行データの作成を行うことにした。 また、表4の作業は、各Webサイトから抽出した会員データが保存された作業用ファイル上で行うことにした。
解答に当たっては、巻頭の表記ルールに従うこと。
なお、テーブル構造の表記は、"関係データベースのテーブル (表) 構造の表記ルール” を用いること。 さらに、主キー及び外部キーを明記せよ。
(1)
図3中の(a)〜(c)に適切な字句を入れ、主キーを示して、“お気に入り”テーブルを完成させよ。また、“サービス”、“コンテンツ”及び“利用権限”テーブルの主キー、外部キーを示せ。(a, b, cは順不同)
模範解答
a:会員番号
b:コンテンツID
c:登録日時
サービス(WebサイトID 、サービスID、サービス名)
コンテンツ(コンテンツID、WebサイトID、サービスID、コンテンツ名、ディレクトリ)
利用権限(コンテンツID、会員区分、権限区分)
解説
解答の導き方
まず図3の「お気に入り(a、b、c)」に何を入れるかを決めます。問題文の該当記述から順に読み取ります。
- どの項目が必要か
- 問題文に「会員はログイン後に任意のコンテンツをお気に入りとして登録することができる。」とあります。従って「どの会員が」「どのコンテンツを」登録したかを記録する必要があり、会員側の識別子として「会員番号」、コンテンツ側の識別子として「コンテンツID」が必要です。
- また「お気に入りは、登録した日時の順に表示される。」とあるので、表示順を決めるために「登録日時」列が必要です。
したがって (a)=会員番号、(b)=コンテンツID、(c)=登録日時 と決まります。
- お気に入りの主キーをどうするか(重複防止・表現意図の検討)
- 「お気に入り」は会員とコンテンツの関係を表す結びつき(多対多の関係を解消する中間関係)です。関係を一意に識別するには通常その両端の識別子の組合せを主キーとします。問題文に「同一会員が同一コンテンツを複数回登録できる」といった記述はないため、同じ会員・同じコンテンツの重複登録は想定せず、主キーは (会員番号, コンテンツID) とします。登録日時は表示順を決める属性であり、主キーには含めません。
- 「サービス」「コンテンツ」「利用権限」の主キー・外部キー
- 「サービスは、Webサイトごとに複数提供され、WebサイトIDとサービスIDの組合せによって識別される。」とあるので、サービスの主キーは (WebサイトID, サービスID) です。WebサイトIDはWebサイトテーブルの主キーを参照する外部キーになります。
- 「コンテンツはコンテンツIDによって識別され、...」とあるので、コンテンツの主キーは コンテンツIDです。コンテンツはどのサービス・どのWebサイトの下にあるかが図3に示されているため、コンテンツ側にWebサイトIDとサービスIDを持たせ、サービスを特定するために (WebサイトID, サービスID) を参照する外部キーを張ります(参照先はサービスの主キー (WebサイトID, サービスID))。なお問題文は「コンテンツはコンテンツIDによって識別され」ると明示しているので、主キーにコンポジットを用いる必要はありません。
- 「権限区分には“参照可”、“参照不可”、“参照及び投稿可” の3種類があり、コンテンツIDと会員区分の組合せでいずれかに定められる。」とあるので、利用権限テーブルの主キーは (コンテンツID, 会員区分) で、コンテンツIDはコンテンツ表のコンテンツIDを参照する外部キーになります。会員区分は会員の属性であり値集合(列挙)として扱うのが自然で、問題文の設計意図に従えば会員区分自体を参照整合性で別テーブルにするかは任意ですが、主キーには含めます。
以上の検討により、図3の (a)〜(c) と各テーブルの主キー・外部キーは次のようになります。
(a) 会員番号
(b) コンテンツID
(c) 登録日時
(b) コンテンツID
(c) 登録日時
テーブル定義(主キーと外部キーを明記)
-
お気に入り(会員番号, コンテンツID, 登録日時)
主キー:会員番号、コンテンツID
外部キー:会員番号 → 会員(会員番号)
:コンテンツID → コンテンツ(コンテンツID)
解説:登録日時は表示順のための属性で、同一会員が同一コンテンツを重複登録することを許さない設計なら主キーに含めません。 -
サービス(WebサイトID, サービスID, サービス名)
主キー:WebサイトID、サービスID
外部キー:WebサイトID → Webサイト(WebサイトID) -
コンテンツ(コンテンツID, WebサイトID, サービスID, コンテンツ名, ディレクトリ)
主キー:コンテンツID
外部キー:(WebサイトID, サービスID) → サービス(WebサイトID, サービスID)
補足:コンテンツIDが一意であると明示されているため主キーは単一キーで良く、WebサイトID/サービスIDは所属関係を示す参照です。 -
利用権限(コンテンツID, 会員区分, 権限区分)
主キー:コンテンツID、会員区分
外部キー:コンテンツID → コンテンツ(コンテンツID)
補足:会員区分は値集合(一般会員・期限付き会員・有償会員等)として扱い、権限区分は「参照可/参照不可/参照及び投稿可」を格納します。
誤りやすいポイント
- お気に入りの主キーに登録日時を含めると、同一会員が同一コンテンツを複数回登録できる設計になり、通常想定される「お気に入りは一件だけ登録される」振る舞いと齟齬が生じます。登録日時は順序付けのための属性であり、主キーには含めないのが適切です。
- サービスの主キーをサービスID単独にしてしまう誤り。問題文は「WebサイトIDとサービスIDの組合せによって識別される。」と明示しているため、サービスIDはウェブサイト内での識別子であり、WebサイトIDと合わせた複合主キーが正解です。
- コンテンツの主キーを (WebサイトID, サービスID, コンテンツID) のように冗長にする誤り。問題文で「コンテンツはコンテンツIDによって識別され」るとあるので、コンテンツID単独を主キーとすべきです。
- コンテンツがサービスを参照する際に、サービスの複合主キー (WebサイトID, サービスID) の両方を外部キーとして張らずに片方だけにする誤り。参照整合性を保つには複合キー全体と対応させる必要があります。
- 利用権限の主キーを権限区分だけにする誤り。仕様は「コンテンツIDと会員区分の組合せで定める」と明示しているため、(コンテンツID, 会員区分) が主キーです。
FAQ
Q: お気に入りテーブルに単独の「お気に入りID(連番)」を主キーとして付けるべきですか?
A: 実務上はサロゲートキー(お気に入りID)を付けることもありますが、設問の意図・図3の表記に従うと自然キーである (会員番号, コンテンツID) を主キーとするのが簡潔です。サロゲートキーを採る場合でも、会員番号とコンテンツIDに一意制約を張って重複を防ぐ必要があります。
A: 実務上はサロゲートキー(お気に入りID)を付けることもありますが、設問の意図・図3の表記に従うと自然キーである (会員番号, コンテンツID) を主キーとするのが簡潔です。サロゲートキーを採る場合でも、会員番号とコンテンツIDに一意制約を張って重複を防ぐ必要があります。
Q: コンテンツIDがWebサイトごとにしか一意でない場合はどうしますか?
A: 問題文は「コンテンツはコンテンツIDによって識別され」と明示しているため、この設問ではコンテンツIDは全体で一意と解釈します。もし実際にはサイト内一意であれば、(WebサイトID, コンテンツID) の複合主キーが必要になります。設問文の明示を優先して判断してください。
A: 問題文は「コンテンツはコンテンツIDによって識別され」と明示しているため、この設問ではコンテンツIDは全体で一意と解釈します。もし実際にはサイト内一意であれば、(WebサイトID, コンテンツID) の複合主キーが必要になります。設問文の明示を優先して判断してください。
Q: 会員区分は外部キーにすべきでしょうか?
A: 会員区分は固定された分類(一般会員、期限付き会員、(有償会員)など)なので、参照整合性を厳密にしたければ会員区分マスタを作って外部キーにできます。設問上は値集合として扱いつつ、利用権限テーブルの主キーに含めることが求められます。
A: 会員区分は固定された分類(一般会員、期限付き会員、(有償会員)など)なので、参照整合性を厳密にしたければ会員区分マスタを作って外部キーにできます。設問上は値集合として扱いつつ、利用権限テーブルの主キーに含めることが求められます。
関連キーワード: 正規化、主キー、外部キー、参照整合性、関係スキーマ
(2)
“掲示板”テーブルは、第1正規形、第2正規形、第3正規形のうち、どこまで正規化されているかを答えよ。 また、その判別根拠を75字以内で具体的に述べよ。
模範解答
正規形:第1正規形
判別根拠:属性が全て単一値をとり、タイトル、説明文などの属性が、候補キーの一部であるWebサイトID、掲示板IDに対して部分関数従属している。
解説
解答の導き方
結論:第1正規形です。
-
主キーの特定
図3の「掲示板」には「WebサイトID、掲示板ID、メッセージ番号、タイトル、掲示板開設日時、説明文、掲示板開設者会員番号、メッセージ本文、メッセージ投稿者会員番号、メッセージ投稿日時」が列挙されています。問題文にも「メッセージは、掲示板単位に連番のメッセージ番号によって、一意に識別される。」とあるため、各行は個々のメッセージを表し、主キーは (WebサイトID, 掲示板ID, メッセージ番号) で確定します。 -
関数従属性の整理
主キーに対する従属性を整理すると、(WebサイトID, 掲示板ID, メッセージ番号) → メッセージ本文、メッセージ投稿者会員番号、メッセージ投稿日時 が成り立ちます。一方、タイトル、掲示板開設日時、説明文、掲示板開設者会員番号は掲示板固有の属性であり、これらは (WebサイトID, 掲示板ID) により決まる(=主キーの一部にのみ従属する)ため、非キー属性の部分関数従属が存在します。 -
正規形の判定手順に当てはめる
- 第1正規形(1NF):各属性は単一値で格納されており満たします。
- 第2正規形(2NF):複合主キーの一部への非キー属性の依存(部分関数従属)を許さないため、ここでは満たしません。
- 第3正規形(3NF):3NFは2NF成立を前提とするため満たしません。
以上より「第1正規形」にとどまる、が正しい判定です。
誤りやすいポイント
- 主キー誤認:行の粒度(この表が「掲示板」単位か「メッセージ」単位か)を確認せずに主キーを (WebサイトID, 掲示板ID) とすると誤判定します。図中に「メッセージ番号」があるかどうかを必ず確認してください。
- 1NFと繰り返し行の混同:掲示板に複数メッセージがあることは行が複数あるだけで、列が多値になっているとは限りません。1NFは列の値が原子的かどうかを見ます。
- 「掲示板IDだけで一意」と決めつける誤り:問題文に掲示板の一意性が「WebサイトIDと 掲示板IDの組合せ」とある場合、単独の掲示板IDでは不十分です。
- 部分従属と推移的従属の混同:部分従属は「主キーの一部に依存」、推移的従属は「非キー属性が別の非キー属性に依存」です。判定時に区別してください。
- 正規化判定前に候補キーを明示しない:必ずキーを明示してから従属性を検討してください。
FAQ
Q: 掲示板表を第3正規形にするにはどう分割すればよいですか?
A: 一例として次の2表に分割します。
A: 一例として次の2表に分割します。
- 掲示板表(主キー (WebサイトID, 掲示板ID)):タイトル、掲示板開設日時、説明文、掲示板開設者会員番号
- メッセージ表(主キー (WebサイトID, 掲示板ID, メッセージ番号)):メッセージ本文、メッセージ投稿者会員番号、メッセージ投稿日時、(必要なら)親メッセージ番号(返信用)
この分割で非キー属性は各表の主キーに完全従属し、2NF/3NFの要件を満たせます。
Q: 返信(親メッセージ)関係はどう実装すればよいですか?
A: メッセージ表に「親メッセージ番号」列を追加し、外部キーとして (WebサイトID, 掲示板ID, 親メッセージ番号) が同じメッセージ表の主キーを参照する自己参照外部キーを定義します。親がない投稿はNULLを許容します。
A: メッセージ表に「親メッセージ番号」列を追加し、外部キーとして (WebサイトID, 掲示板ID, 親メッセージ番号) が同じメッセージ表の主キーを参照する自己参照外部キーを定義します。親がない投稿はNULLを許容します。
Q: なぜ第1正規形は満たしていると言えるのですか?
A: 図3の各列(タイトル、説明文、メッセージ本文など)は文字列や日時といった単一値を取る属性であり、同一行の列に複数値を入れる多値属性や繰り返しグループが見られないため、1NFの条件を満たします。
A: 図3の各列(タイトル、説明文、メッセージ本文など)は文字列や日時といった単一値を取る属性であり、同一行の列に複数値を入れる多値属性や繰り返しグループが見られないため、1NFの条件を満たします。
関連キーワード: 正規化、第1正規形、部分関数従属、複合主キー、関数従属
(3)
〔K部長の指摘事項〕 ②、③の問題を解消し、第3正規形に分解した“掲示板” テーブルの構造を示せ。
模範解答
掲示板(WebサイトID、掲示板ID、タイトル、掲示板開設日時、説明文、掲示板開設者会員番号)
メッセージ(WebサイトID、掲示板ID、メッセージ番号、メッセージ本文、メッセージ投稿者会員番号、メッセージ投稿日時、親メッセージ番号)
解説
解答の導き方
-
図3の元設計の問題点を特定する
図3の掲示板表を見ると、掲示板に関する属性(タイトル、掲示板開設日時、説明文、掲示板開設者会員番号)とメッセージに関する属性(メッセージ番号、メッセージ本文、メッセージ投稿者会員番号、メッセージ投稿日時)が同じ表に混在しています。問題文には「掲示板は、WebサイトIDと掲示板IDの組合せによって一意に識別される」とあり、また「メッセージは、掲示板単位に連番のメッセージ番号によって、一意に識別される」とあります。したがって元表の実際の行は各メッセージを表し、行の一意キーは (WebサイトID, 掲示板ID, メッセージ番号) になります。 -
関数従属を明示する(第2正規形の観点)
上記から次の関数従属が成り立ちます。
・(WebサイトID, 掲示板ID) → タイトル, 掲示板開設日時, 説明文, 掲示板開設者会員番号
・(WebサイトID, 掲示板ID, メッセージ番号) → メッセージ本文, メッセージ投稿者会員番号, メッセージ投稿日時
ここでタイトル等は主キーの真部分集合である (WebサイトID, 掲示板ID) に依存しているため、部分関数従属があり第2正規形を満たしません。第2正規形を満たしていないなら第3正規形でもないため分解が必要です。
-
分解方針(第3正規形にする)
関数従属ごとに属性を適切な関係へ分離します。すなわち掲示板固有の属性は掲示板を表す関係へ、メッセージ固有の属性はメッセージを表す関係へ移します。さらに問題文に「返信が行われると、返信対象の投稿メッセージ (親メッセージ)との関係はツリー構造で表示される」とあるため、メッセージ間の親子関係を保持する属性を用意する必要があります。 -
第3正規形であることの確認
分解後、各関係について非キー属性が主キーに対して完全関数従属していること、かつ非キー属性同士の従属(推移的従属)がないことを確認します。掲示板関係では非キー属性はすべて (WebサイトID, 掲示板ID) に完全に従属します。メッセージ関係でも非キー属性(メッセージ本文等)は (WebサイトID, 掲示板ID, メッセージ番号) に完全に従属し、親メッセージ番号は参照キーであって他の非キー属性を決定しないため、第3正規形を満たします。 -
親メッセージの参照の扱い(重要)
「メッセージ番号は掲示板単位に連番」であるため、親メッセージを示すには単に親のメッセージ番号だけを格納して参照するのは不十分です。参照整合性を保証するには行自身にあるWebサイトID, 掲示板IDと組み合わせて (WebサイトID, 掲示板ID, 親メッセージ番号) が親メッセージの主キー (WebサイトID, 掲示板ID, メッセージ番号) を参照するように定義します。親がいない(ルート)投稿は親メッセージ番号をNULL許容とします。
以上より、第3正規形に分解した表構造は次のとおりです。
掲示板(WebサイトID、掲示板ID、タイトル、掲示板開設日時、説明文、掲示板開設者会員番号)
主キー: (WebサイトID, 掲示板ID)
外部キー: 掲示板開設者会員番号 → 会員(会員番号)
主キー: (WebサイトID, 掲示板ID)
外部キー: 掲示板開設者会員番号 → 会員(会員番号)
メッセージ(WebサイトID、掲示板ID、メッセージ番号、メッセージ本文、メッセージ投稿者会員番号、メッセージ投稿日時、親メッセージ番号)
主キー: (WebサイトID, 掲示板ID, メッセージ番号)
外部キー:
・(WebサイトID, 掲示板ID) → 掲示板(WebサイトID, 掲示板ID) (メッセージはどの掲示板の投稿かを示す)
・メッセージ投稿者会員番号 → 会員(会員番号)
・(WebサイトID, 掲示板ID, 親メッセージ番号) → メッセージ(WebサイトID, 掲示板ID, メッセージ番号) (親メッセージ参照、親がない場合はNULLを許容)
主キー: (WebサイトID, 掲示板ID, メッセージ番号)
外部キー:
・(WebサイトID, 掲示板ID) → 掲示板(WebサイトID, 掲示板ID) (メッセージはどの掲示板の投稿かを示す)
・メッセージ投稿者会員番号 → 会員(会員番号)
・(WebサイトID, 掲示板ID, 親メッセージ番号) → メッセージ(WebサイトID, 掲示板ID, メッセージ番号) (親メッセージ参照、親がない場合はNULLを許容)
この分解で、K部長の指摘②(第3正規形でない)と③(返信の管理不可)は解消できます。
誤りやすいポイント
- 親メッセージ参照を「親メッセージ番号」だけで定義してしまう(誤り)。メッセージ番号は掲示板単位での連番なので、必ず同じ行のWebサイトIDと 掲示板IDと組にして参照する必要がある。
- メッセージ表の主キーを単にメッセージ番号だけにしてしまう(誤り)。グローバルに一意でないため衝突する。
- 掲示板表に掲示板開設者の氏名などを入れてしまう(誤り)。会員情報は会員(会員番号)にまとめ、掲示板表には会員番号だけを外部キーとして持たせるべき。これをしないと更新時に推移的従属や更新異常が発生する。
- 親メッセージ番号を NOT NULLにしてしまう(誤り)。ルート投稿は親がないためNULLを許容する。
- 返信関係を別に独立したテーブルで管理すると説明する受験生がいるが、親子の木構造はメッセージ表の自己参照で十分表現でき、冗長な別表は不要であることが多い(業務要件により別構造が必要な場合は検討)。
- メッセージの順序(連番をどう付与するか)をスキーマだけで解決しようとして実装方法を示さない(試験では「掲示板単位の連番で識別される」との記述を根拠にキー設計を説明すること)。
FAQ
Q: 親メッセージの外部キー定義はどう書けばよいですか?
A: 子行の (WebサイトID, 掲示板ID, 親メッセージ番号) を親の主キー (WebサイトID, 掲示板ID, メッセージ番号) に外部キー制約で結びます。親がいない場合は親メッセージ番号をNULLにします。
A: 子行の (WebサイトID, 掲示板ID, 親メッセージ番号) を親の主キー (WebサイトID, 掲示板ID, メッセージ番号) に外部キー制約で結びます。親がいない場合は親メッセージ番号をNULLにします。
Q: 「メッセージ番号」を自動で付与する方法はスキーマでどう表現しますか?
A: スキーマ設計上は「掲示板単位に連番である」として主キーに含めます。実装ではトランザクション内で該当掲示板の現在の最大値+1を確実に取得するか、掲示板毎のシーケンス管理テーブルを用いるなど運用側で制御します(設問では設計レベルで「掲示板単位連番」を主張するのが評価点です)。
A: スキーマ設計上は「掲示板単位に連番である」として主キーに含めます。実装ではトランザクション内で該当掲示板の現在の最大値+1を確実に取得するか、掲示板毎のシーケンス管理テーブルを用いるなど運用側で制御します(設問では設計レベルで「掲示板単位連番」を主張するのが評価点です)。
Q: 掲示板開設者や投稿者の氏名を掲示板/メッセージ表に持たせてもよいですか?
A: 推奨しません。氏名など会員に関する属性は会員表に保持し、掲示板/メッセージ表では会員番号のみを外部キーとして参照します。氏名を複製すると更新の整合性(推移的従属や更新異常)の問題が生じます。
A: 推奨しません。氏名など会員に関する属性は会員表に保持し、掲示板/メッセージ表では会員番号のみを外部キーとして参照します。氏名を複製すると更新の整合性(推移的従属や更新異常)の問題が生じます。
関連キーワード: 関数従属、部分関数従属、第3正規形、再帰参照、外部キー
設問2:〔事業部門からの要望〕 について、(1)、(2)に答えよ。
問題文を見る(1)
要望(ア)の有償サービスの提供に対応するために、概念データモデル上で検討したときの図を次に示す。 エンティティタイプ名及びリレーションシップを記入し、要望(ア)を満たす概念データモデルを完成させよ。
なお、エンティティタイプ間の対応関係にゼロを含むか否かの表記は不要である。


模範解答

解説
解答の論理構成
-
要件分析
問題文の要望(ア)に、
・「会員の区分として、一般会員、期限付き会員の他に、“有償会員”を新規に追加する。」
・「サービスの区分として、“有償サービス”を新設する。 〔新データベースのテーブル構造の設計〕 で定義したサービスは“無償サービス”とする。」
・「有償会員が購入したサービスを管理するために、“購入サービス”を新たに定義する。」
と明示されています。ここから「会員」「サービス」を親とした汎化‐特化(スーパタイプ‐サブタイプ)の構造と、購買履歴を表すリレーションシップ(エンティティタイプ「購入サービス」)が必要であることが分かります。 -
会員側の汎化‐特化
既存の「一般会員」「期限付き会員」に加え、「“有償会員”」を同列に配置し、親の「会員」から三方向に分岐させます。これにより区分追加時でも親エンティティ「会員」の定義を変更せず拡張可能になります。 -
サービス側の汎化‐特化
問題文で「“無償サービス”とする。」とあるため、親「サービス」から「無償サービス」「有償サービス」の2サブタイプをぶら下げます。こちらも区分追加時の保守性を担保します。 -
購入履歴のリレーションシップ
「“購入サービス”を新たに定義する。」という記述は、エンティティタイプ「購入サービス」が「有償会員」と「有償サービス」を関連付ける多対多関係を表すことを示唆しています。したがって
・「有償会員」→「購入サービス」
・「有償サービス」→「購入サービス」
という二本のリレーションシップを書き込みます。 -
図の完成
以上を反映すると、模範解答図のように
・左ブロック:親「会員」+サブタイプ「一般会員」「期限付き会員」「有償会員」+「購入サービス」への連結
・右ブロック:親「サービス」+サブタイプ「無償サービス」「有償サービス」+「購入サービス」への連結
という形で要望(ア)を完全に満たす概念データモデルになります。
誤りやすいポイント
- 「有償会員」ではなく「会員」と「購入サービス」を直接結んでしまい、ビジネスルール(無償会員は購入しない)を表せなくなる。
- 「購入サービス」をリレーションシップではなく単なる属性として扱い、購入日や支払方法など複数レコードが想定されるデータを格納できなくなる。
- 「無償サービス」を描かず「サービス」→「有償サービス」だけを特化と誤認し、排他関係が破綻する。
- 汎化‐特化を表すときにスーパタイプとサブタイプの記号(三角形や線分)を省略し、読み手に関係が伝わらない。
FAQ
Q: 「購入サービス」は実体(エンティティ)なのですか、リレーションシップなのですか?
A: 概念ERでは「購入サービス」は多対多関係を解消する橋渡しエンティティとして扱います。履歴管理を行うため属性(購入日、支払金額など)を持たせやすくなります。
A: 概念ERでは「購入サービス」は多対多関係を解消する橋渡しエンティティとして扱います。履歴管理を行うため属性(購入日、支払金額など)を持たせやすくなります。
Q: 「有償サービス」は「サービス」に依存しているので弱エンティティにすべきでしょうか。
A: 今回は汎化‐特化モデルなので弱エンティティの考え方は不要です。「サービス」をスーパタイプとし、「有償サービス」はサブタイプとして識別されます。
A: 今回は汎化‐特化モデルなので弱エンティティの考え方は不要です。「サービス」をスーパタイプとし、「有償サービス」はサブタイプとして識別されます。
Q: 「無償サービス」と「有償サービス」のどちらも今後さらに区分が増える場合、モデルを作り直す必要がありますか。
A: いいえ。汎化‐特化では新しいサブタイプを追加するだけで済み、既存構造や親「サービス」には手を入れずに拡張できます。
A: いいえ。汎化‐特化では新しいサブタイプを追加するだけで済み、既存構造や親「サービス」には手を入れずに拡張できます。
関連キーワード: 汎化特化, 多対多解消, 概念ERモデル, 階層型エンティティ, 購入履歴
設問2:〔事業部門からの要望〕 について、(1)、(2)に答えよ。
問題文を見る(2)
要望(イ)のメルマガの配信に対応するためのテーブルの構造を示せ。なお、列名は本文中の用語を用いること。
模範解答
メルマガ(WebサイトID、メルマガID、メルマガ名)
購読メルマガ(WebサイトID、メルマガID、会員番号、購読開始日)
バックナンバ(WebサイトID、メルマガID、配信日時、メルマガ本文)
解説
解答の論理構成
- まずメルマガ自体を定義
- 【問題文】「“メルマガはWebサイトIDとメルマガIDの組合せによって一意に識別し、メルマガ名を管理する。」
⇒ 実体:メルマガ
⇒ 主キー: WebサイトID 、メルマガID
⇒ 属性:メルマガ名
- 【問題文】「“メルマガはWebサイトIDとメルマガIDの組合せによって一意に識別し、メルマガ名を管理する。」
- 会員とメルマガの多対多関係を解消
- 【問題文】「会員は、利用しているWebサイトについて、複数のメルマガを購読できる。」
⇒ N対Nを1対N × N対1に分割する中間表が必要
⇒ 実体:購読メルマガ
⇒ 主キー: WebサイトID 、メルマガID 、会員番号
⇒ 属性:購読開始日
- 【問題文】「会員は、利用しているWebサイトについて、複数のメルマガを購読できる。」
- 配信履歴(バックナンバ)を管理
- 【問題文】「配信したメルマガは、バックナンバとしてメルマガ本文を配信日時ごとに管理する。」
⇒ 実体:バックナンバ
⇒ 主キー: WebサイトID 、メルマガID 、配信日時
⇒ 属性:メルマガ本文
- 【問題文】「配信したメルマガは、バックナンバとしてメルマガ本文を配信日時ごとに管理する。」
- 参照整合性
- 購読メルマガ と バックナンバ の外部キーは( WebサイトID 、メルマガID )で メルマガ を参照。
- 購読メルマガ の外部キー( 会員番号 )は 会員 を参照。
これで全文要件をカバーし、第3正規形も満たします。
誤りやすいポイント
- メルマガIDを単独主キーにして「 WebサイトIDを列追加」しただけにする → 複数サイトでIDが重複したとき一意性が崩れる。
- 購読メルマガ の主キーを( 会員番号 、メルマガID )としWebサイトIDを含め忘れる → 異なるWebサイトのメルマガを区別できなくなる。
- バックナンバ で 配信日時 をPKに入れず、最新だけ保持する想定にしてしまう → 履歴閲覧要件を満たせない。
FAQ
Q: 配信日時は日付列だけでも良いですか?
A: メールマガジンは一日に複数配信される可能性があるため、日時(タイムスタンプ)で管理する方が安全です。
A: メールマガジンは一日に複数配信される可能性があるため、日時(タイムスタンプ)で管理する方が安全です。
Q: 購読メルマガ の主キーに 購読開始日 を入れる必要は?
A: 「購読開始日」は履歴ではなく状態属性なので主キーに含めません。購読を解除・再登録する場合は別途履歴テーブルを追加します。
A: 「購読開始日」は履歴ではなく状態属性なので主キーに含めません。購読を解除・再登録する場合は別途履歴テーブルを追加します。
Q: バックナンバ に 会員番号 を入れてもいいですか?
A: Backナンバは配信実体であり、閲覧権限は「メルマガを購読している会員」が判定します。従って会員番号は不要です。
A: Backナンバは配信実体であり、閲覧権限は「メルマガを購読している会員」が判定します。従って会員番号は不要です。
関連キーワード: 正規化、複合主キー、外部キー制約、多対多関係、履歴管理
(1)
WebサイトBとWebサイトCで実施する手順1のデータの編集内容を一つずつ挙げ、それぞれ20字以内で述べよ。
模範解答
B:氏名を姓と名に分離する。
C:住所に含まれる都道府県を分離する。
解説
解答の論理構成
- 手順1の目的を確認
- 【問題文】“旧データベースと項目の構成方法が異なるデータを編集する。”
- 具体作業:“分割・統合” によって新DBと同じ項目構成に合わせる。
- WebサイトB(表2)の列構成を確認
- 列 “氏名漢字” に “斎藤△太郎” の形式で姓と名が同一セルに格納。
- 新DBでは【問題文】表1と同様に “姓(漢字)”“名(漢字)” が別列。
- よって “姓名分離” が必須。
- WebサイトC(表3)の列構成を確認
- “住所” 列には “東京都文京区◯◯2-28-8-102” のように都道府県+市区町村以下が混在。
- 新DBでは表1・表2と同様に “都道府県” 列が独立している。
- よって “都道府県抽出” が必要。
- 以上より編集内容をまとめる
- B:氏名列を 姓 と 名 に切り出す。
- C:住所列から 都道府県 を切り出す。
誤りやすいポイント
- “フリガナを統一” など手順3で求められる標準化と混同する。
- Cの編集対象を “メールアドレス” と誤認し、重複チェックを挙げてしまう。
- “分離” と “統合” の両方を羅列し、20字以内を超過する。
FAQ
Q: WebサイトBで “ふりがな” 列も編集対象に含めるべきですか?
A: 手順1は項目構成の差異解消が目的なので、姓名が一つの列になっている “氏名” が優先です。ふりがな列は別列ですが構造は同様なので、同時に分離しても差し支えありません。
A: 手順1は項目構成の差異解消が目的なので、姓名が一つの列になっている “氏名” が優先です。ふりがな列は別列ですが構造は同様なので、同時に分離しても差し支えありません。
Q: 都道府県の抽出は正規化(第3正規形)と同じ考え方ですか?
A: 目的は似ていますが、ここでは移行前データを新DBの列構成に合わせるための加工であり、テーブル設計そのものの正規化とは段階が異なります。
A: 目的は似ていますが、ここでは移行前データを新DBの列構成に合わせるための加工であり、テーブル設計そのものの正規化とは段階が異なります。
Q: 20字以内に収めるポイントは?
A: 動詞+対象+操作内容で簡潔にまとめるのがコツです(例:「氏名を姓名に分離」)。
A: 動詞+対象+操作内容で簡潔にまとめるのがコツです(例:「氏名を姓名に分離」)。
関連キーワード: データ移行、項目分割、正規化、キー統一、データクレンジング
(2)
手順2の作業方法だけでは、問題が発生する可能性がある。その問題について、原因を含めて60字以内で述べよ。
模範解答
WebサイトAとWebサイトBで採番されている番号の範囲が重複するので、データの投入時に一意制約違反が発生する。
解説
解答の導き方
手順2の作業方法には「WebサイトA及びBの会員番号は流用し、会員番号列のないWebサイトCのデータは、キーの条件を満たすように、WebサイトA及びBに存在しない会員番号を新規に付与する。」とあるので、A・B両方の番号をそのまま単一の会員番号空間に取り込むことになります。
表1の注には「連番7桁+入会年の西暦下2桁が割り振られている。」とあり、WebサイトAの会員番号は9桁形式で取りうることが分かります。表2の注には「“000000000”〜“999999999”の連番が割り振られている。」とあり、WebサイトBも9桁の連番であることが分かります。
A・Bとも9桁の番号で採番されているので、両者の番号の範囲は重なります。結果として、AとBの異なる会員が同じ会員番号値を持つ可能性があり、単一の主キー領域に流用するとデータ投入時に一意制約違反が発生します。
最終的な記述(60字以内の回答例):
WebサイトAとWebサイトBで採番されている番号の範囲が重複するため、データの投入時に一意制約違反が発生する。
表1の注には「連番7桁+入会年の西暦下2桁が割り振られている。」とあり、WebサイトAの会員番号は9桁形式で取りうることが分かります。表2の注には「“000000000”〜“999999999”の連番が割り振られている。」とあり、WebサイトBも9桁の連番であることが分かります。
A・Bとも9桁の番号で採番されているので、両者の番号の範囲は重なります。結果として、AとBの異なる会員が同じ会員番号値を持つ可能性があり、単一の主キー領域に流用するとデータ投入時に一意制約違反が発生します。
最終的な記述(60字以内の回答例):
WebサイトAとWebサイトBで採番されている番号の範囲が重複するため、データの投入時に一意制約違反が発生する。
誤りやすいポイント
- 採番規則が違うことだけを見て「重複しない」と誤判断する。どちらも9桁の番号なので、同じ値が生じ得る。
- 表中の例示(見た目)と注釈(採番規則)を混同し、注釈を無視する。注釈の採番規則に従って考える必要がある。
- 手順2をそのまま実行しても、既存参照(利用Webサイトテーブル等)との整合性や外部キー制約の影響を考慮しない。
- 回避策として単に「桁数を長くする」だけで済ませ、既存データとのマッピングを怠るとリンク切れが発生する。
FAQ
Q: 手順2のままでも衝突を防ぐ簡単な方法はありますか?
A: 既存番号を流用するなら、会員番号にWebサイト識別子を付与するか、新しいサロゲートキーを採用して既存番号は別テーブルで参照キーにする方法が確実です。
A: 既存番号を流用するなら、会員番号にWebサイト識別子を付与するか、新しいサロゲートキーを採用して既存番号は別テーブルで参照キーにする方法が確実です。
Q: 表2の注と表の例示で桁数表示が異なるように見えますが、どれを信じれば良いですか?
A: 採番のルールを明示する注(注2「“000000000”〜“999999999”」)が正規の規則なので、その規則に基づいて検討します。表示上のゼロ埋めやフォーマット差は移行前に正規化が必要です。
A: 採番のルールを明示する注(注2「“000000000”〜“999999999”」)が正規の規則なので、その規則に基づいて検討します。表示上のゼロ埋めやフォーマット差は移行前に正規化が必要です。
Q: 既に重複が見つかった場合の実務対処は?
A: 既存の会員のどちらかに新しい一意キーを付与し、旧番号は外部キー参照用のマッピング表で管理します。影響範囲を洗い出して段階的に切替えることが重要です。
A: 既存の会員のどちらかに新しい一意キーを付与し、旧番号は外部キー参照用のマッピング表で管理します。影響範囲を洗い出して段階的に切替えることが重要です。
関連キーワード: 主キー、サロゲートキー、一意制約、採番設計、データ移行、データ正規化
(3)
手順3の作業方法に示した例以外に標準化すべきことを二つ挙げ、それぞれ30字以内で述べよ。
模範解答
①・姓と名に含まれる旧字体の漢字を新字体に変更する。
②・住所の丁目以降の表記を、算用数字とハイフンに変換する。
・市町村合併などで変更された住所を現在のものに修正する。
解説
解答の導き方
結論(30字以内で求められている解答)
① 姓と名に含まれる旧字体の漢字を新字体に変更する。
② 住所の丁目以降の表記を、算用数字とハイフンに変換する。
② 住所の丁目以降の表記を、算用数字とハイフンに変換する。
導出過程(受験者が同じ結論に至るための段階的説明)
- 手順3の目的と例を確認する。問題文は「データの表記のばらつきを解消するために、標準データに変換する」と定め、例として「姓と名のフリガナは、ひらがなに変換する」と示している。これは表記揺れの解消が手順3の主要目的であることを意味する。
- 表1〜3で表記揺れの箇所を洗い出す。具体例を直接確認すると次のように異なっている。
- 姓の異字体の混在:表1に「沢田」、表2に「澤田」、表2に「髙橋△次郎」、表1に「高橋」がある。これらは旧字体/異体字の混在である。
- フリガナの表記差:表1に「さいとう(ひらがな)」、表3に「サイトウ(カタカナ)」といった異なる表記がある(手順3の例はこれに対応する)。
- 住所表記のばらつき:表1に「文京区◯◯◯2-28-8-102」、表2に「文京区〇〇2-28-8-102」、表3に「東京都文京区◯◯2-28-8-102」など、数字の全角・半角、ハイフンの種類、丁目以降の書式が異なる。
- メールアドレスの存在:表3にメールアドレス列(例: 「saito@aa.jitec.jp」)があり、事業要件で「メルマガを配信」することが明記されているため、メールの正規化も検討対象となる。
- 表2に「△は空白を表す」と注記があるため、「斎藤△太郎」等は空白の表現であることに注意する。
- なぜ上の結論が導かれるかを論理的に説明する。
- 旧字体/異体字は文字列比較に影響して重複検出や突合作業(手順2でキーを統一する作業)で誤判定を招く。したがって「旧字体→新字体」の変換で同一人の文字列を一致させやすくする必要がある。
- 住所は位置情報照合や郵便照合、重複判定に使うため、丁目以降(番地以下)の表記様式(算用数字/ハイフン等)を統一すると検索・比較が安定する。手順3は「WebサイトAのデータを基準として標準化を行う」としているので、基準に合わせて明確な変換ルールを定めるべきである。
- 最終的に手順3で要求される「表記揺れの解消」に対して優先度が高く、表1〜3の実データに直接現れているものを選んで上記の2項目を解答とする。メールアドレス正規化も重要な候補であるが、設問の要求(2項目)に合わせて上記2点を選んだ。
誤りやすいポイント
- 表2の「△」を見て「△自体が別の文字」と誤認する。注記に「△は空白を表す」とある点を必ず確認すること。
- 「斎藤」を旧字体の例と誤って扱う(表中の例は「澤田/沢田」「髙橋/高橋」が旧字体・異体字の実例)。
- 住所の違いを「単なる見た目の違い」と軽視し、丁目以降の数値・ハイフン・全角半角の差を標準化対象から漏らす。
- メルマガ配信の要件があるのにメールアドレスの正規化を見落とすと、配信や重複判定で問題が発生する。
- 標準化の基準を定めずに無作為に文字を変換すると、法的・契約上の表記(本人確認書類と整合が必要な項目)で問題となる可能性がある。
FAQ
Q: 旧字体はすべて新字体に直してよいですか?
A: 手順3の指示「過去のデータを最新データに変換する方法が明確な場合は、最新データに更新する」に沿って、照合基準(例:WebサイトAを基準)に従って新字体へ統一するのが実用的です。ただし、本人確認や法的文書の写しが必要な場合は原本を保持するルールを別途定義します。
A: 手順3の指示「過去のデータを最新データに変換する方法が明確な場合は、最新データに更新する」に沿って、照合基準(例:WebサイトAを基準)に従って新字体へ統一するのが実用的です。ただし、本人確認や法的文書の写しが必要な場合は原本を保持するルールを別途定義します。
Q: 住所の正規化はどこまで行えばよいですか?
A: 最低限、丁目以降の数値表記(全角→半角)、ハイフンの統一(全角→半角または仕様で決定)、不要な空白の除去を行い、可能なら市町村合併等で変更された地名を最新表記へ更新します。基準は「WebサイトAのデータを基準として標準化を行う」で決めます。
A: 最低限、丁目以降の数値表記(全角→半角)、ハイフンの統一(全角→半角または仕様で決定)、不要な空白の除去を行い、可能なら市町村合併等で変更された地名を最新表記へ更新します。基準は「WebサイトAのデータを基準として標準化を行う」で決めます。
Q: メールアドレスの正規化は必須ですか?
A: はい。表3にメールアドレス(例: 「saito@aa.jitec.jp」)があり、業務要件に「メルマガを配信」があるため、空白削除・大文字→小文字化(少なくともドメイン部)・全角→半角変換などの正規化ルールを設けるべきです。
A: はい。表3にメールアドレス(例: 「saito@aa.jitec.jp」)があり、業務要件に「メルマガを配信」があるため、空白削除・大文字→小文字化(少なくともドメイン部)・全角→半角変換などの正規化ルールを設けるべきです。
関連キーワード: データクレンジング、文字コード正規化、住所正規化、重複排除、正規化
(4)
手順4中の(d)に入れる適切な作業内容を、50字以内で述べよ。
模範解答
複数のWebサイトを利用している、同一人物であると考えられる会員の会員データを特定する。
解説
解答の論理構成
- 【問題文】では手順4の作業方法に「この作業を行うための具体的な判定基準、ルールは別途定義する。」とあります。これは“判定=同一人物かどうか”を意味します。
- さらに冒頭で「各Webサイトの重複した会員データを統合する」と述べられており、目的は重複レコードの統合です。
- 手順1〜3で形式統一までは完了していますが、まだ重複行は残存します。そこで、同一人物と考えられる複数行を「特定」する処理が必要になります。
- 以上より、(d)には「複数のWebサイトを利用している、同一人物であると考えられる会員の会員データを特定する」が妥当となります。
誤りやすいポイント
- 「削除」や「統合」と書いてしまう
手順4は“候補の特定”であり、削除・統合は手順5以降です。 - 判定基準の作成と誤解する
判定基準は「別途定義する」と既に書かれているため、(d)は基準作成ではなく特定作業です。 - 「重複データの検索」だけを書く
“同一人物であると考えられる”という主旨を明示しないと減点対象となります。
FAQ
Q: 手順2で会員番号を統一したのに、なぜまだ重複が残るのですか?
A: 会員番号はWebサイト単位で発番されており、別サイトでは同一人物でも異なる番号が付いているためです。
A: 会員番号はWebサイト単位で発番されており、別サイトでは同一人物でも異なる番号が付いているためです。
Q: 手順4で特定した後、具体的な統合はどの手順ですか?
A: 統合や削除の確定は「手順5」で「移行対象のデータを確定する」と示されています。
A: 統合や削除の確定は「手順5」で「移行対象のデータを確定する」と示されています。
Q: 判定基準にはどんな項目が使われますか?
A: 例として「姓」「名」「フリガナ」「住所」「メールアドレス」などが考えられますが、詳細は別途定義です。
A: 例として「姓」「名」「フリガナ」「住所」「メールアドレス」などが考えられますが、詳細は別途定義です。
関連キーワード: 正規化、主キー、重複データ、データクレンジング、データ統合






