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






解き方のヒントを見る
事実の単位と帰属先を見極める
データモデルの設計や拡張では、記録したい事実が何を一つ決めれば一意に定まるのかを考えることが基本です。業務の記述から、その事実の単位と帰属先を落ち着いて確かめる姿勢が、検討の出発点になります。
この問題で問われていること
新たな要件に出てくる情報について、それが既存のどの実体の一件ごとに一つだけ決まるのか、あるいは複数の実体の組合せや時点ごとに決まるのかを、業務の記述を根拠に判断する観点を意識しましょう。
視点
ある属性の値が決まると別の属性の値が一つに決まる関係を関数従属と呼び、値を決める側を決定項と呼びます。属性をどのテーブルに置くかは、この決定項が何かによって整理できます。決定項が主キーの一部だけだったり、主キー以外の属性だったりすると、同じ事実が複数の行に重複して記録されやすくなります。
確認ポイント
- 追加したい情報は、何を一つ特定すれば値が一つに決まるか
- その決定項は既存テーブルの主キーと一致するか、過不足はないか
- 同じ事実が複数の行に重複して記録される構造になっていないか
正解と解説を見る
解説
フェリー会社の乗船予約システムの再構築を題材に、概念データモデルとテーブル構造を完成させ、現行業務の更新処理と制約を確認したうえで、新規要件に合わせてテーブル構造を見直す問題です。公式解答例では、販売区間の補完、顧客登録の有無による予約客と乗船客のサブタイプ、等級別在庫の更新、車両の残長制約、キャンセル料の条件、各種の列追加とまとめ精算テーブルが示されています。
問題の全体像
X社は12隻のフェリーを複数の航路で運航しています。業務の対象は、船型・等級・宿泊区画・航路・運航スケジュール・販売区間・運賃などのマスターと、予約・キャンセル・乗船・船内売上などのトランザクションです。問題文で与えられた図1(概念データモデル)と図2(テーブル構造)は未完成で、設問1ではこれを完成させます。設問2では、予約無しで乗船したときの在庫更新、予約時の積載制約、往復予約のキャンセル料を問います。設問3では、宿泊区画の指定、7人以上の予約、キャンセル待ち、下船時精算という新規要件に対してテーブル構造を見直します。公式解答例の出題趣旨によると、概念データモデルを読み取る能力、更新対象のテーブルと制約条件を見抜く能力、新規要件に合わせてモデルを見直す能力が問われています。採点講評では、全体の正答率は平均的だったとされています。一方で、設問1の航路明細と販売区間の関係、設問1(2)の2本のリレーションシップ、設問2(1)(b)、設問3(4)と(5)は正答率が低かったと指摘されています。
設問1(1)
欠落しているリレーションシップは、図2の主キー構成から導きます。販売区間は「航路番号、乗船港コード、下船港コード」で識別されます。(航路番号、 乗船港コード) も (航路番号、 下船港コード) も航路明細の主キー (航路番号、 港コード) に対応するので、航路明細から販売区間へ、乗船港用と下船港用の2本の1対多の線を引きます。問題文には、役割が異なる関係は役割の数だけ線を引くよう指示されています。運賃の主キーには航路番号・乗船港コード・下船港コードが含まれるため、販売区間から運賃への1対多も必要です。運航スケジュール明細 (航路番号、 出発年月日、 港コード) は、運航スケジュール (航路番号、 出発年月日) と航路明細 (航路番号、 港コード) の両方から1対多で参照されます。等級別在庫 (航路番号、 出発年月日、 港コード、 等級コード) は運航スケジュール明細を参照するので、運航スケジュール明細から等級別在庫への1対多も追加します。公式解答例の図では、これらの線が太線で追記されています。採点講評では、航路明細とア(販売区間)の間の関係の正答率が低く、同じエンティティタイプ間に役割の異なる複数の関係があるかどうかを注意深く読み取るよう求められています。
設問1(ア)
公式解答例ではアは「販売区間」です。問題文1.(6)には、販売区間は販売区間名をもち、航路番号・乗船港コード・下船港コードで識別すると書かれています。一方、図2のマスター領域にはこれに当たるテーブルがありません。運賃や予約運賃明細が航路番号・乗船港コード・下船港コードを外部キーとして持っていることからも、参照先としてアが販売区間だと判断できます。
設問1(2)
イ〜オは、予約客と乗船客を顧客登録の有無で分けたサブタイプです。図2の予約客と乗船客に「顧客登録有無区分」と外部キーの顧客番号があることが根拠です。欠落している2本のリレーションシップは、予約を引き継いで乗船した場合の対応です。乗船には予約番号が、乗船客には予約番号と予約客番号が外部キーとしてあります。このため、「予約」と「予約有乗船」の間、「予約客」と「予約有乗船客」の間にそれぞれ線を引きます。予約無しの乗船には予約が存在しないので、線はスーパータイプの乗船や乗船客ではなく、予約有のサブタイプにつなぎます。公式解答例の図では、どちらも矢印の無い線で描かれています。予約の内容を乗船に引き継ぐという業務(5.(2)①)から、1件の予約(1人の予約客)に対して予約有乗船(予約有乗船客)は1件という1対1の関係と読み取れます。採点講評は、スーパータイプとサブタイプのどちらとの間に関係があるかを注意深く読み取るよう求めています。
設問1(イ)
公式解答例ではイは「顧客登録無予約客」です。予約客のサブタイプのうち、図1で顧客からの線(①)がつながっていない側がイです。つまり、顧客番号を持たず、氏名・性別などを予約時に記入する予約客に当たります。
設問1(ウ)
公式解答例ではウは「顧客登録有予約客」です。図1では、マスター領域の顧客から出た①の線がウにつながっています。顧客番号を伝えれば氏名などの記入が不要になる(4.(2))ので、顧客と関係を持つのは顧客登録をしている予約客に限られます。
設問1(エ)
公式解答例ではエは「顧客登録有乗船客」です。顧客から出た②の線がエにつながっています。予約無しの乗船でも、顧客番号を提示すれば氏名などの確認が不要になる(5.(3)②)ことから、顧客と関係を持つのは顧客登録をしている乗船客のサブタイプです。
設問1(オ)
公式解答例ではオは「顧客登録無乗船客」です。乗船客を顧客登録の有無で分けたとき、顧客との関係を持たない側がオです。乗船客は予約の有無でも別にサブタイプ化されており、この二つの分け方は独立しています。
設問1(3)
公式解答例ではカは「航路番号、乗船港コード、下船港コード、販売区間名」です。主キーは航路番号・乗船港コード・下船港コードの三つで、実線の下線を付けます。問題文の識別方法がそのまま主キーになり、販売区間名は非キー属性です。乗船港コードと下船港コードは航路明細(港)を参照する役割も持ちますが、公式解答例では三つとも主キーを表す実線で示されています。図2の航路明細などで、主キーの一部になっている外部キーに実線だけを付けている表記とも一致します。
設問2(1)(a)
在庫の把握(2.(3))では、予約受付時か予約無しでの乗船時に残数を減らすと書かれています。予約有りの場合は予約時にすでに減らしているので、乗船時の更新は要りません。予約無しの場合は乗船時に初めて減らします。車両・ペットケージ・二輪車を伴わなければ、運航スケジュール明細の残長・残数は対象外です。宿泊区画状態は予約の有無に関係なく乗船手続で更新されるので、これも該当しません。このため公式解答例では、テーブルは「等級別在庫」、列は「利用可能個室残数、利用可能ベッド残数」です。個室か大部屋かで、どちらの列を更新するかが変わるので、両方を挙げます。
設問2(1)(b)
等級別在庫の主キーは、航路番号・出発年月日・港コード・等級コードです。残数は出発港と経由港を出港する時点の値を記録するので、到着港F港(006)には行がありません。C港〜F港を乗船する場合、C港(003)、D港(004)、E港(005)を出港する時点の3行が更新対象です。列値は、航路番号01、出発年月日2022-03-14、等級コードDXに、港コード003・004・005を組み合わせた3行になります。デラックスは個室の等級なので、変更する列は利用可能個室残数、変更内容は1減算です(1名でも個室1部屋を使います)。採点講評によると、更新対象を4行とした解答が散見され、到着港の行が存在しないことを読み取れていませんでした。
設問2(2)(a)
車両は車両長の合計で積載の可否を判断し、運航スケジュール明細の出発港・経由港ごとに残長を持っています(1.(1)⑤、2.(3)②③)。表4の空欄aには運航スケジュール明細テーブルの列が入るので、公式解答例では「積載可能車両残長」です。乗船港から下船港の直前までのすべての行で、残長が足りている必要があります。
設問2(2)(b)
空欄bには、予約テーブル側の比較対象と比較条件が入ります。予約テーブルで車両の長さを表す列は「車両全長」です。残長が予約する車両の全長を下回っていなければ積載できるので、公式解答例では「車両全長以上」となります。
設問2(3)
キャンセル料は、乗船年月日の6日前以降にキャンセルすると発生します。往復予約では、往路と復路それぞれの乗船年月日に対して算出します(2.(2)①)。往路だけにキャンセル料が発生するのは、キャンセル日が往路の6日前以降に入っていて、復路の6日前にはまだ達していないときです。公式解答例では、「キャンセル日が往路乗船年月日の6日前以降、かつ、復路乗船年月日の7日前以前の場合」などの表現が示されています。答案には、①往路について6日前以降であること、②復路について6日前より前(7日前以前)であること、の二つを50字以内で入れます。
設問3(1)
宿泊区画の指定は、予約時点で個室やベッドを記録することで実現できます。現行の乗船記録では、個室は乗船単位(乗船.乗船時個室宿泊区画番号)で、ベッドは乗船客単位(乗船客.乗船時大部屋宿泊区画番号)で持っています。予約でも同じ粒度にし、公式解答例では「予約」に個室宿泊区画番号を、「予約客」に大部屋宿泊区画番号を追加します(①と②は順不同)。個室は1予約1部屋、ベッドは1人1台という単位の違いが根拠です。列にしておけば、乗船手続までの変更も更新で対応できます。
設問3(2)
現行と同じ単位で複数の予約に分けたうえで、利用者には代表の予約番号だけを見せます。そのためには、各予約がどの代表予約に属するかを記録する必要があります。公式解答例では、「予約」テーブルに「代表予約番号」を追加します。予約が予約を参照する自己参照の外部キーで、往路予約番号と同じ考え方です。
設問3(3)(a)
キャンセル待ちは通常の予約と同じ項目を指定し、キャンセルが出たら仮予約に、利用者の確認後に本予約に変わります。そのため、予約テーブルの行の状態を区別する列が必要です。公式解答例では、追加する列の役割を「キャンセル待ちと仮予約と本予約とを区分する。」としています。25字以内に収めるには、区分する三つの状態を並べて書きます。キャンセル待ちの優先順位は予約番号順と定められているので、順序のための列は別途要りません。
設問3(3)(b)
予約のキャンセルは、予約キャンセルテーブルに行を挿入することで記録されます(図2の予約キャンセル)。キャンセル発生をきっかけに仮予約への変更処理を起動するには、このテーブルへの挿入を契機にします。公式解答例では、テーブル名は「予約キャンセル」、実行契機は「行の挿入後」です。キャンセルが確定し、在庫が加算された後で起動すれば、空いた在庫を条件に合うキャンセル待ちに割り当てられます。
設問3(4)
下船時にまとめて支払うには、船内売上がどの乗船客のものかを特定できる必要があります。現行の船内売上はフェリー番号・売上番号・施設コードしか持たず、乗船客を特定できません。カードキーには航路番号・出発年月日・乗船客番号が登録されているので、公式解答例では「船内売上」にこの三つを追加し、乗船客への外部キーとします。さらに、下船時精算額と支払方法を乗船客ごとに記録するため、「乗船客」に「下船時精算額、下船時一括支払方法区分」を追加します(①と②は順不同)。採点講評によると、設問3(4)は正答率が低かった設問です。
設問3(5)
まとめ精算は、運航スケジュールごとのまとめ精算番号で一意に識別すると指定されています。そのため主キーは、航路番号・出発年月日・まとめ精算番号の三つです。記録する項目は精算合計金額です。公式解答例では「まとめ精算(航路番号、出発年月日、まとめ精算番号、精算合計金額)」で、主キー三つに実線の下線を付けます。どの乗船客がどのまとめ精算に含まれるかを表すため、「乗船客」に「まとめ精算番号」を追加します。乗船客がもともと持つ航路番号・出発年月日と組み合わせると、まとめ精算を参照する外部キーになります。採点講評は、既存テーブルの行を集計するテーブルを追加し、既存テーブルに外部キーを追加する方法は実務でもよく使われるので、ぜひ知っておいてほしいと述べています。
学習のポイント
複合キーからリレーションシップを導く方法、同じテーブルを役割違いで複数回参照する場合の線の数、サブタイプとの間に引く関係、在庫行の存在範囲、新規要件に対して列やテーブルをどこに追加するかを重点的に練習してください。
出典:独立行政法人 情報処理推進機構(IPA)令和4年度秋期 データベーススペシャリスト試験 午後Ⅱ 問2(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針