DBデータベーススペシャリスト試験 午後Ⅰ
平成25年度春期 データベーススペシャリスト 午後Ⅰ 問2
事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。
問題








解き方のヒントを見る
属性が何に依存するかを確かめる
データベース設計の問題では、各項目がどの識別子によって一意に決まるのかを一つずつ確かめることが出発点になります。問題で示された業務上の条件と、設計上の扱いが対応しているかを落ち着いて照合してみましょう。
この問題で問われていること
この問題で確認すべき観点は一つ、各データ項目が「何を決めれば値が一つに定まるか」です。時間の経過や区分の違いがある場合も含め、その決まり方が業務条件と矛盾しないかを自分の言葉で説明できるか確かめてください。
視点
テーブル分割や正規化の判断は、項目同士の依存関係をつかむことから始まります。ある項目の値を決めるのに何が必要かを考えると、その項目をどこで管理するのが自然かを検討しやすくなります。業務のルールを自分の言葉で書き出し、それと設計が整合しているかを比べるのが基本的な進め方です。
確認ポイント
- 各項目について、値を一つに定めるために何が分かっていればよいかを言葉にしたか
- その決まり方が、時点や区分によって変わりうるかを業務条件から確認したか
- 自分が整理した決まり方と、問題で示された設計内容に食い違いがないか照合したか
正解と解説を見る
解説
家庭清掃サービスの受注管理システムを題材に、データベース設計を問う問題です。主な論点は次の三つです。(1)サービスを個別・セット・オプションのサブタイプに分け、固有の属性を適切に配置すること。(2)候補キーが二つある継続パターンの正規形を判定すること。(3)注文明細どうしの親子関係を自己参照の列で表し、継続注文の変更履歴を注文変更年月日で管理すること。採点講評では、全体の正答率は低く、特に設問1(3)の正規形判定と設問3(2)の履歴設計ができていなかったと指摘されています。
問題の全体像
A社は個人宅の清掃サービスを提供する会社で、受注管理システムを新しく作ります。サービスは個別・セット・オプションの3種類で、種類によって持つ属性が違います。
・セットサービス:複数の個別サービスから選ぶ形式
・オプションサービス:特定の個別サービスに追加するもの
注文にはスポット注文と継続注文があり、見積り結果(図1)では、明細どうしの関係が記号で示されています。
・◆:セットで選んだ個別サービス
・>>:個別サービスに追加したオプション
出題趣旨によると、この問題で問われる能力は次の三つです。
・業務要件を分析する能力
・サブタイプを切り出し、サブタイプ間のリレーションシップを読み取る能力
・履歴を含むテーブルを設計する能力
出題趣旨では特に、契約のように履歴を持つマスタについて、トランザクションとの整合を保ちながら履歴を管理する設計が重視されています。
設問1(1)
業務概要3(2)と表1〜3で、各サービスがどの項目を持つかを比べます。
・3種類すべてにある項目:サービスコード、サービス区分、サービス名、標準価格
・個別サービス(表1)とオプション(表3)にだけある項目:サービス内容、標準作業時間数(セットサービスの表2にはありません)
・セットサービスだけにある項目:個別サービス選択可能数
・オプションサービスだけにある項目:適用先の個別サービス(一つに決まる)
公式解答例の構成は次のとおりです。
・サービス共通(サービスコード、サービス区分、サービス名、標準価格)
・個別サービス(サービスコード、サービス内容、標準作業時間数)
・セットサービス(サービスコード、個別サービス選択可能数)
・オプションサービス(サービスコード、サービス内容、標準作業時間数、個別サービスコード)
主キーはどれもサービスコードです。オプションサービスの個別サービスコードは、個別サービスを参照する外部キーにします。サービス内容と標準作業時間数をサービス共通に置くと、セットサービスの行で意味のない列ができてしまいます。そのため、この2列は個別サービスとオプションサービスの両方に置きます。
設問1(2)
業務概要4(2)②によると、期間・回数・曜日の組合せは継続パターンコードで識別されます。つまり、継続パターンコードは一意の識別子です。さらに、期間・回数・曜日の組合せも一つの継続パターンに対応するため、この3列の組でも行が一意に決まります。3列のうち一つでも欠けると、行は一意に決まりません。そのため、この組は極小の候補キーです。公式解答例は「継続パターンコード、{期間,回数,曜日}」の二つです。
設問1(3)(正規形)
非キー属性は継続割引率だけです。継続割引率は、業務概要4(2)②の「それによって継続割引率は異なる」から、期間・回数・曜日の組合せ全体で決まります。そのため、どちらの候補キーにも完全関数従属します。また、非キー属性が一つしかないため、非キー属性を経由した推移もありません。したがって、公式解答例は「第3正規形」です。採点講評では、候補キーが複数あるときの正規形の判定を誤った答案が多かったと指摘されています。
設問1(3)(部分関数従属性の有無)
部分関数従属性とは、非キー属性が候補キーの一部だけに従属していることです。継続割引率は、期間だけ、回数だけ、曜日だけで決まるわけではなく、3列の組合せによって決まります。継続パターンコードは単一列の候補キーなので、部分関数従属性は起こりません。公式解答例は「なし」です。
設問1(3)(推移的関数従属性の有無)
継続パターンコード→{期間,回数,曜日}→継続割引率 は、一見すると推移のように見えます。しかし、{期間,回数,曜日}→継続パターンコード も成り立ちます。中間の{期間,回数,曜日}はそれ自体が候補キーなので、推移的関数従属性にはなりません。推移的関数従属性とは、候補キーではない属性の集合を経由する従属のことです。公式解答例は「なし」です。
設問1(3)(部分関数従属性)
部分関数従属性の有無が「なし」なので、この欄には記入しません。公式解答例でも空欄です。候補キーの一部に従属しているように見える例を無理に書くと、有無の判定と矛盾するので注意が必要です。
設問1(3)(推移的関数従属性)
推移的関数従属性の有無も「なし」なので、この欄には記入しません。公式解答例でも空欄です。継続パターンコード→{期間,回数,曜日}→継続割引率 のように、候補キーを中間に置いた例を書くのは誤りです。
設問2(1)
図1の◆は直上のセットで選んだ個別サービスを、>>は直上の個別サービスに追加したオプションを表します。ここから親子関係は次の二つです。
・セットサービス注文明細 1 → 個別サービス注文明細 多
・個別サービス注文明細 1 → オプションサービス注文明細 多
ゼロを含むかどうかは、次のように決まります。
・セット側は必ず個別サービスを含みます(選択可能数分)。そのため、個別側の端は●です。
・個別サービスは単品でも注文できます(業務概要4(3))。そのため、セット側の端は○です。
・オプションは単独では提供されず、必ず個別サービスに付きます。そのため、個別側の端は●です。
・個別サービスにはオプションが無いこともあります。そのため、オプション側の端は○です。
公式解答例の図では、「セットサービス注文明細 ○─●→ 個別サービス注文明細 ●─○→ オプションサービス注文明細」と、矢印が個別側・オプション側を向いています。採点講評では、参照元と参照先を逆にした解答が散見されたと指摘されています。矢印の向き(1側から多側へ)に注意してください。
設問2(2)①
設計方針(1)では、セットで選んだ個別サービスも単品の個別サービスも、同じ形式で注文明細に格納します。そのため、個別サービスの明細行から、元のセットの明細行を指し示す列が必要です。親の明細は同じ注文の中にあるので、注文明細番号を持てば特定できます。公式解答例の趣旨は、選択された個別サービスの元となったセットサービスの注文明細番号です。40字以内で、次の三点を押さえます。
・どの行に設定するか(選択された個別サービス)
・何を指すか(元のセットサービス)
・値は何か(注文明細番号)
設問2(2)②
同じように、オプションの明細行から、追加先の個別サービスの明細行を指し示す列が必要です。図1のエアコン清掃の例のように、同じ個別サービスが実施場所違いで複数行ある場合も考えます。このとき、サービスコードだけでは親の行を特定できないため、注文明細番号で参照します。公式解答例の趣旨は、追加されたオプションサービスの元となった個別サービスの注文明細番号です。「オプション行に、親である個別サービスの注文明細番号を設定する」ことを40字以内で書きます。
設問3(1)(行)
業務概要6(3)(5)を見ると、予定作業時間数と実施作業時間数は、個別サービスとオプションサービスごとに割り当て、登録します。セットサービスには標準作業時間数もなく(表2)、実際の清掃は、そのセットで選んだ個別サービスとして行われます。したがって、実施明細に反映する必要がないのはセットサービスの明細です。公式解答例は「セットサービス注文明細の行」です(15字以内)。
設問3(1)(理由)
セットサービスは、個別サービスをまとめて価格を決める単位にすぎません。清掃の作業そのもの(実施の対象)ではないため、作業時間を管理する実施明細は作りません。公式解答例は「セットサービスは実施対象ではないから」です。20字以内で「実施の対象でない」という点を押さえます。
設問3(2)(列名)
〔継続注文の変更〕(2)に「変更履歴を注文変更年月日ごとに保存する」とあります。履歴の発生単位は注文変更年月日です。列名は本文の語句を使うよう指示されているので、公式解答例は「注文変更年月日」です。
設問3(2)(テーブル)
変更の対象は次の二つです。
・注文の予定開始時刻・予定終了時刻(〔継続注文の変更〕(1))
・注文明細のオプションの追加・取消しと適用価格
公式解答例では、各テーブルを次のように変えます。
・注文:主キーを{注文番号,注文変更年月日}にします(主キー○)。
・注文明細:変更年月日ごとに明細を持つため、注文変更年月日を主キーに加えます。あわせて、注文を参照する外部キー{注文番号,注文変更年月日}の一部にもなります(主キー○・外部キー○)。
・実施:どの版の注文内容に基づいて実施したかを参照します(外部キー○)。
・実施明細:どの版の注文明細に基づいたかを参照します(外部キー○)。
実施と実施明細は実施番号で識別できるので、主キーは変えません。採点講評では、この設問の正答率は低かったと指摘されています。そのうえで、履歴の発生単位を主キーに加え、そのテーブルを外部参照する側も直すという設計の知識を身に付けるよう求めています。
学習のポイント
主に次の四点を身に付けることが大切です。 ・サブタイプに固有の属性を見極めること ・候補キーが複数あるときに部分関数従属性・推移的関数従属性を正しく判定すること ・ゼロを含むかどうかを区別するリレーションシップ表記の読み方 ・履歴の単位を主キーに加え、参照する側の外部キーも合わせて直す設計
出典:独立行政法人 情報処理推進機構(IPA)平成25年度春期 データベーススペシャリスト試験 午後Ⅰ 問2(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針