DBデータベーススペシャリスト試験 午後Ⅱ

令和4年度秋期 データベーススペシャリスト 午後Ⅱ 問2

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問2 フェリー会社の乗船予約システムのデータベース設計に関する次の記述を読んで、設問に答えよ。 X社は、複数航路でフェリーを運航している。乗船予約システムを構築してから時間が経過していることから、改めて現行業務を分析し、更に新規要件を洗い出し、乗船予約システムを再構築することになった。予約、乗船手続、下船手続などに関する業務について、概念データモデルとテーブル構造を設計した。 〔現行業務の分析結果〕 1. フェリーの概要 (1) フェリー ① 12隻のフェリーを運航している。フェリーはフェリー番号で識別している。 ② 一つの設計図で複数のフェリーを造っている。同じ設計図から造られたフェリーを同じ船型のフェリーと呼ぶ。同じ船型であれば、外見だけでなく、船内施設、宿泊区画などの構成も同じとなる。船型は船型番号で識別している。 ③ 現在、三つの船型があり、船型ごとに4隻のフェリーがある。 ④ フェリーが乗船客のほかに積載できるのは、次のとおりである。 ・乗用車・トラック・バス(以下、車両という) ・ペット持込み用のペットケージ ・自転車・原動機付自転車・自動二輪車(以下、二輪車という) ⑤ どれだけの車両を積載できるかは、車両の長さが基準となる。船型ごとに積載可能車両長合計を決めており、積載する車両の車両長の合計が、積載可能車両長合計を超えない範囲であれば積載可能となる。 ⑥ ペットケージ、二輪車については、船型ごとに積載可能数をそれぞれ決めている。 (2) 宿泊区画 ① 宿泊区画とは、乗客の宿泊のための販売単位であり、大部屋に設置されたベッド(定員1名)と個室(定員1名から4名まで)とがある。 ② 宿泊区画には一意な宿泊区画番号を付与している。宿泊区画番号には、個室の場合は個室番号、ベッドの場合はベッド番号を用いる。 (3) 等級 ① 宿泊区画は等級に分かれており、等級を等級コードで識別している。個室の等級には、ロイヤルスイート、スイート、デラックス、レディースデラックスなどがあり、大部屋の等級には、ステート、ツーリストなどがある。 ② 船型ごとに存在する等級が異なる。例えば、ある船型にはロイヤルスイートが存在しないということがある。 ③ 一部の等級のエリアは、後述するカードキーをタッチしないとドアが開かず立ち入ることができない。 ④ 同じ等級でも船型ごとに定員、面積が異なる場合がある。 (4) 航路 ① 出発港から幾つかの経由港を経て到着港までを航路と呼ぶ。ただし、経由港のない航路もある。A港とB港との間を運航している場合、A港発B港行とB港発A港行とは別の航路となる。航路ごとに航路番号を決めている。 ② 航路ごとに配船する船型を決めている。 ③ 航路ごとに航路明細として出発港、経由港、到着港、標準入港時刻、標準出港時刻を決めている。港は港コードで識別している。航路明細の例を表1に示す。 表1 航路明細の例 (5) 運航スケジュール ① 航路について、出発年月日ごとに配船するフェリーを決める。ある航路において、同日に複数のフェリーが出発することはない。運航スケジュールの例を表2に示す。 表2 運航スケジュールの例 ② 出発港、経由港、到着港にいつ入出港するかの運航スケジュール明細を決める。同じ航路でも出発年月日によって出発港、経由港、到着港の入港日時及び出港日時が、標準入港時刻及び標準出港時刻と異なる場合がある。運航スケジュール明細の例を表3に示す。 表3 運航スケジュール明細の例 (6) 販売区間 航路内の販売可能な乗船港と下船港との組合せを販売区間と呼ぶ。宿泊を伴わない区間は販売区間とならない。C港とF港の間を運航し、D港、E港を経由する航路の場合、C港~E港、C港~F港、D港~E港、D港~F港、E港~F港が販売区間となり得る。販売区間は販売区間名をもち、航路番号、乗船港コード、下船港コードで識別する。 (7) 運賃 ① 販売区間ごとに乗船客、車両、ペットケージ、二輪車の運賃表がある。 ② 乗船客の運賃は、等級ごとに大人運賃を決めている。小人運賃は大人運賃の半額としている。中学生以上には大人運賃、小学生には小人運賃を適用する。小学生未満の乳幼児は、大人1名につき1名分が無料となり、2人目以降は小人運賃となる。 ③ 車両の運賃は、車両の長さの範囲(4m未満、4m以上5m未満など)ごとに決めている。 ④ ペットの運賃は、ペットケージ1個ごとに決めている。 ⑤ 二輪車の1台当たりの運賃は、自転車・原動機付自転車・自動二輪車の種類ごとに決めている。 ⑥ 等級に、車両の長さの範囲、ペットケージ、二輪車の種類を併せて運賃種類と呼び、運賃種類コードで識別している。運賃種類コードのうち、乗船客の運賃を表すものは等級コードである。 ⑦ 乗船客、車両及び二輪車については、通常期運賃とは別に繁忙期運賃を設定している。 ⑧ 復路の乗船年月日が往路の乗船年月日から30日以内であれば往復割引を適用し、復路は10%割引としている。 ⑨ 運賃表は燃油の価格変動に伴い、数か月ごとに見直す。運賃表の運用開始日を決めている。 (8) 船内施設 フェリーの船内には、レストラン、ショップなどの施設があり、フェリーごとの施設コードで識別している。 (9) 船内商品 船内施設で提供する商品として、レストランでの飲食メニュー、ショップでのお土産品・雑貨品などがある。これらは、全フェリー共通の商品コードで識別している。 2. 予約業務 (1) 予約登録 ① 予約は、予約受付順の予約番号で一意に識別している。予約登録は、航路と販売区間を指定した上で次のように行う。 ・宿泊区画:個室の場合は1部屋、大部屋の場合は同じ等級の6人まで ・車両:1台まで ・ペットケージ、二輪車:数に制限無し ② 往復予約の場合は、往路と復路とは別の予約番号を振り、復路の予約に往路予約番号をもたせる。 ③ 航路、乗船港、下船港、乗船年月日、等級、大人人数、小人人数、乳幼児人数、車両の有無(有りの場合は車両の長さ)、ペットケージ、二輪車の数を登録する。併せて乗船予定者全員の氏名、性別、生年月日、住所、大人運賃・小人運賃・無料のいずれかを表す適用運賃区分を予約客として登録する。 ④ 予約内容の変更は受け付けていない。 (2) 予約キャンセル ① 予約キャンセルは、出港時刻までであれば、予約番号ごとに可能である。ただし、乗船年月日の6日前以降のキャンセルは、キャンセル料が発生する。乗船年月日までの日数によってキャンセル期間区分を決め、キャンセル料率を変えている。出港後はキャンセルできず、全額請求する。往復で予約している場合、往路復路それぞれの乗船年月日に対してキャンセル料を算出する。 ② 天候不良などによる欠航の場合、翌日以降の運航に振り替えるか、キャンセルするかを、予約客に選択してもらう。キャンセルの場合、キャンセル料は請求せず、全額を返金する。 ③ 往復予約の往路が天候不良などで欠航になったときの復路をキャンセルする場合、キャンセル料は請求せず、全額を返金する。 (3) 在庫の把握 ① 個室については利用可能個室残数を、大部屋については利用可能ベッド残数を等級別在庫としてそれぞれ記録している。出発港、経由港を出港する時点での等級ごとの残数を記録する。予約受付時又は予約無しでの乗船時に、個室であれば利用可能個室残数を、大部屋であれば利用可能ベッド残数を更新(利用分を減算)する。 ② 車両については積載可能車両残長を、ペットケージについては積載可能ペットケージ残数を、二輪車については積載可能二輪車残数をそれぞれ記録する。出発港、経由港を出港する時点の残長・残数を記録する。予約受付時又は予約無しでの乗船時に、車両であれば積載可能車両残長を、ペットケージであれば積載可能ペットケージ残数を、二輪車であれば積載可能二輪車残数を更新(積載分を減算)する。 ③ 上述の残長・残数について、乗船港と下船港との間に経由港がある場合には乗船港を出港する時点の残長・残数だけではなく、経由港を出港する時点の残長・残数も更新する。C港を出港し、D港、E港を経由し、F港に到着する航路で、C港で乗船し、F港で下船する場合、C港を出港する時点の残長・残数だけではなく、D港、E港を出港する時点の残長・残数も更新する。 ④ 予約キャンセル時には、予約登録時と逆に更新(キャンセル分を加算)する。 3. 入金業務 (1) 運賃の支払には、乗船前の支払と乗船当日の乗船窓口での支払とがある。 (2) 乗船前の支払方法には、クレジットカード決済と現金振込みとがある。支払が完了すると乗船前支払フラグを「支払済」にする。 (3) 乗船当日の乗船窓口での支払方法には、クレジットカード決済と現金払とがある。 4. 顧客管理業務 (1) リピーターを確保する目的で顧客管理を行っており、希望する顧客には、氏名、性別、生年月日、住所、電話番号、メールアドレスを登録してもらい、顧客番号が記載された顧客カードを渡す。 (2) 顧客は、顧客カードに記載された顧客番号を伝えることで、予約時及び乗船時に氏名、性別などを記入する必要がなくなる。 5. 乗船手続(チェックイン) (1) 乗船当日に乗船窓口において、予約有りの場合は予約の単位に、予約無しの場合は乗船する個人又はグループ単位に乗船客の乗船手続をする。乗船手続では運航スケジュールごとの乗船番号を発番する。 (2) 予約有りの乗船手続 ① 乗船窓口の担当者が予約を確認する。予約が確認できたら、予約の記録を乗船の記録に引き継ぐ。 ② 予約時に申請した予約客に変更がある場合には、変更後の内容を乗船客として記録する。 ③ 運賃が未払の場合は、運賃を請求する。 (3) 予約無しの乗船手続 ① 乗船窓口の担当者が、乗船客の航路、乗船港、下船港、乗船年月日、等級、大人人数、小人人数、乳幼児人数、車両の有無、ペットケージ、二輪車の数を確認する。これらは予約の記録ではなく、乗船の記録とする。 ② 次に乗船客を確認する。氏名、性別、生年月日、住所、適用運賃区分を乗船客の記録とする。顧客登録している場合、顧客番号を提示してもらうことで、氏名、性別などを確認する必要がなくなる。 ③ 運賃を請求する。 (4) 予約の有無にかかわらず、乗船手続時に乗船窓口の担当者が個室又はベッドを決定する。宿泊区画状態区分が乗船の全区間を通して「チェックイン可」の個室又はベッドを割り当てる。 (5) 乗船手続時に個室・大部屋の解錠ができるカードキーを手渡す。カードキーは乗船客ごとに作成する。カードキーには、航路番号、出発年月日、乗船客番号、宿泊区画番号を登録する。 (6) 乗船手続終了後、乗船ステータス及び宿泊区画状態区分を「チェックイン」に変更する。 6. 船内売上 (1) 乗船中に乗船客が船内商品を購入する場合の支払方法には、クレジットカード決済、現金払がある。 (2) 乗船客が購入した船内商品及び個数・金額を船内売上明細に、購入ごとの合計金額を船内売上に記録する。 7. 下船手続(チェックアウト) 下船口で乗船客から受領したカードキーを読み取り、乗船ステータス及び宿泊区画状態区分を「チェックアウト」にする。 〔概念データモデルとテーブル構造〕 現行業務の分析結果に基づいて、概念データモデルとテーブル構造を設計した。テーブル構造は、概念データモデルでサブタイプとしたエンティティタイプを、スーパータイプのエンティティタイプにまとめた。現行業務の概念データモデルを図1に、現行業務のテーブル構造を図2に示す。 図1 現行業務の概念データモデル(未完成) 図2 現行業務のテーブル構造(未完成) 〔新規要件〕 1. 予約業務 (1) 航路の出発港から到着港まで全て乗船する予約に限り、個室又はベッドを指定できるようにする。乗船手続(チェックイン)までならば、指定した個室又はベッドを変更することもできるようにする。 (2) 1回の予約で複数個室又は大部屋に7人以上の予約ができるようにする。 (3) キャンセル待ちをできるようにする。キャンセル待ちは、通常の予約と同様に航路、乗船年月日、乗船港、下船港、等級、人数などを指定する。出港までにキャンセルが発生した場合、キャンセル待ちを仮予約に変更し、予約希望者に確認の上、本予約に変更する。複数のキャンセル待ちがある場合は、キャンセル待ちの予約番号順かつ条件に合致するものを優先する。 2. 下船手続(下船時精算) (1) レストラン及びショップでの船内精算の際にカードキーを提示すると、その場で都度支払うのではなく、下船時に乗船客ごとに一括して支払うことができるようにする。この場合、下船時にフロントで精算する。下船時の一括支払方法としては、クレジットカード決済、現金払がある。下船時精算額を記録する。 (2) 下船時にフロントで精算する場合、乗船客の家族が持つ複数のカードキーをまとめて精算することができるようにする。精算合計金額を記録する。 解答に当たっては、巻頭の表記ルールに従うこと。ただし、エンティティタイプ間の対応関係にゼロを含むか否かの表記は必要ない。 なお、エンティティタイプ間のリレーションシップとして「多対多」のリレーションシップを用いないこと。エンティティタイプ名は、意味を識別できる適切な名称とすること。また、識別可能なサブタイプが存在する場合、他のエンティティタイプとのリレーションシップは、スーパータイプ又はサブタイプのいずれか適切な方との間に記述せよ。同一のエンティティタイプ間に異なる役割をもつ複数のリレーションシップが存在する場合、役割の数だけリレーションシップを表す線を記述せよ。また、テーブル構造は第3正規形の条件を満たしていること。列名は意味を識別できる適切な名称とすること。 設問1 現行業務の概念データモデルとテーブル構造について答えよ。 (1) 図1中のマスター領域は、エンティティタイプ及びリレーションシップが未完成である。【ア】に入れる適切なエンティティタイプ名を答えよ。また、欠落しているリレーションシップを補い、図を完成させよ。なお、マスター領域のエンティティタイプとトランザクション領域のエンティティタイプ間のリレーションシップは不要である。 (2) 図1中のトランザクション領域は、サブタイプ及びリレーションシップが未完成である。【イ】~【オ】に入れる適切なサブタイプ名を答えよ。また、欠落しているリレーションシップを2本補い、図を完成させよ。なお、マスター領域のエンティティタイプとトランザクション領域のエンティティタイプ間のリレーションシップは不要である。 (3) 図2中の【カ】に入れる一つ又は複数の適切な列名を答えよ。主キーを表す実線の下線、外部キーを表す破線の下線についても答えること。 設問2 現行業務の業務処理及び制約について答えよ。 (1) 出港時に乗船客が予約有りで乗船した場合には更新の必要がないが、予約無しで乗船した場合には行の更新が必要となるテーブルがある。 (a) 車両・ペットケージ・二輪車を伴わない場合について、そのテーブル名及び更新する可能性のある列名を、図2中から選び、全て答えよ。 (b) 表1~表3の例において、ある乗船客1名が出発年月日「2022-03-14」、航路番号「01」(C港発F港行)、販売区間「C港~F港」、等級コード「DX」(デラックスの等級コード)を乗船した場合、(a)で答えたテーブルの主キーの列名及び列値、並びに変更する列名及び変更内容を答えて、次の表を完成させよ。なお、表は全て埋まるとは限らない。 (2) 車両・ペットケージ・二輪車有りの予約の場合に挿入行に対して必要となる制約条件を表4にまとめた。表4中の【a】、【b】に入れる適切な字句を答えよ。 表4 予約時の制約条件(未完成) (3) 顧客都合で往復予約をキャンセルした場合、往路だけにキャンセル料が発生する場合がある。そのときの条件を50字以内で具体的に答えよ。 設問3 〔新規要件〕について答えよ。 (1) 「1. 予約業務」の(1)を実現する方法として、図2中の二つのテーブルに列を追加する案を考えた。該当するテーブル名及び追加する列名をそれぞれ答えよ。 (2) 「1. 予約業務」の(2)を実現する方法として、現行と同じ単位(個室であれば1部屋、大部屋であれば同じ等級の6人まで)に分けて複数の予約とし、予約客には複数の予約の中から代表の予約番号だけを提示して代表の予約番号以外を意識させないようにすることにした。このために、図2中の一つのテーブルに列を追加する案を考えた。該当するテーブル名及び追加する列名を答えよ。 (3) 「1. 予約業務」の(3)を実現する方法について答えよ。 (a) 図2中の「予約」テーブルに列を追加する案を考えた。追加する列の役割を25字以内で答えよ。 (b) 予約のキャンセルが発生した場合に、キャンセル待ちから仮予約への変更処理を起動するトリガーを定義する。トリガーを定義する図2中のテーブル名を答えよ。また、トリガーの実行契機を答えよ。 (4) 「2. 下船手続(下船時精算)」の(1)を実現する方法として、図2中の二つのテーブルに列を追加する案を考えた。該当するテーブル名及び追加する列名をそれぞれ答えよ。 (5) 「2.下船手続(下船時精算)」の(2)を実現する方法として、「まとめ精算」テーブルを追加する。「まとめ精算」テーブルは、運航スケジュールごとのまとめ精算番号で一意に識別することとする。「まとめ精算」テーブルの構造を答えよ。主キーを表す実線の下線、外部キーを表す破線の下線についても答えること。また、図2中の一つのテーブルに列を追加する。該当するテーブル名及び追加する列名を答えよ。
表1 航路明細の例。航路番号、航路名、港コード、港名、寄港順、港区分、標準入港時刻、標準出港時刻を示す航路明細の例。
表1 航路明細の例。航路番号、航路名、港コード、港名、寄港順、港区分、標準入港時刻、標準出港時刻を示す航路明細の例。
表2 運航スケジュールの例。航路番号、航路名、出発年月日、フェリー名を対応付けた運航スケジュールの例。
表2 運航スケジュールの例。航路番号、航路名、出発年月日、フェリー名を対応付けた運航スケジュールの例。
表3 運航スケジュール明細の例。航路ごとの出発年月日、港コード、港名、入港日時、出港日時を示す運航明細の例。
表3 運航スケジュール明細の例。航路ごとの出発年月日、港コード、港名、入港日時、出港日時を示す運航明細の例。
図1 現行業務の概念データモデル(未完成)。マスター領域とトランザクション領域に分け、フェリー、航路、予約、乗船などのエンティティと関係を示した未完成の概念データモデル。
図1 現行業務の概念データモデル(未完成)。マスター領域とトランザクション領域に分け、フェリー、航路、予約、乗船などのエンティティと関係を示した未完成の概念データモデル。
図2 現行業務のテーブル構造(未完成)。港、航路、フェリー、予約、乗船、乗船客、売上などのテーブルと列定義を列挙した未完成のテーブル構造。
図2 現行業務のテーブル構造(未完成)。港、航路、フェリー、予約、乗船、乗船客、売上などのテーブルと列定義を列挙した未完成のテーブル構造。
表4 予約時の制約条件(未完成)。車両、ペットケージ、二輪車を伴う予約時に、運航スケジュール明細と予約の値を比較する制約条件の表。
表4 予約時の制約条件(未完成)。車両、ペットケージ、二輪車を伴う予約時に、運航スケジュール明細と予約の値を比較する制約条件の表。
解き方のヒントを見る

事実の単位と帰属先を見極める

データモデルの設計や拡張では、記録したい事実が何を一つ決めれば一意に定まるのかを考えることが基本です。業務の記述から、その事実の単位と帰属先を落ち着いて確かめる姿勢が、検討の出発点になります。

この問題で問われていること

新たな要件に出てくる情報について、それが既存のどの実体の一件ごとに一つだけ決まるのか、あるいは複数の実体の組合せや時点ごとに決まるのかを、業務の記述を根拠に判断する観点を意識しましょう。

視点

ある属性の値が決まると別の属性の値が一つに決まる関係を関数従属と呼び、値を決める側を決定項と呼びます。属性をどのテーブルに置くかは、この決定項が何かによって整理できます。決定項が主キーの一部だけだったり、主キー以外の属性だったりすると、同じ事実が複数の行に重複して記録されやすくなります。

確認ポイント

  • 追加したい情報は、何を一つ特定すれば値が一つに決まるか
  • その決定項は既存テーブルの主キーと一致するか、過不足はないか
  • 同じ事実が複数の行に重複して記録される構造になっていないか
正解と解説を見る

解説

フェリー会社の乗船予約システムの再構築を題材に、概念データモデルとテーブル構造を完成させ、現行業務の更新処理と制約を確認したうえで、新規要件に合わせてテーブル構造を見直す問題です。公式解答例では、販売区間の補完、顧客登録の有無による予約客と乗船客のサブタイプ、等級別在庫の更新、車両の残長制約、キャンセル料の条件、各種の列追加とまとめ精算テーブルが示されています。

問題の全体像

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による補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針