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




















![表16 表15中の手順[b2],[b4]のトリガーの処理内容(未完成)。宿泊と施設利用の両テーブルを同期するトリガーのINSERT・UPDATE処理を示す表。b2の更新条件コが空欄で,b4の条件は網掛けで表示されていない。](/figures/d6abe52d48163f726136a08b0787dad670652c44616c63a51c70df0cec6e85d8.webp)
解き方のヒントを見る
扱う情報の範囲を意識して考える
扱う情報の範囲に注目し、検討の途中でその範囲が変わっていないかを確かめましょう。記述や数値を個別に判断する前に、何を対象として考えているのかを自分の言葉で整理すると、論点を保ちやすくなります。
この問題で問われていること
検討対象に含める情報と、いったん対象の外に置く情報との境界を意識してください。考えを進める際には、その境界を動かしていないかを振り返り、対象範囲が曖昧な箇所だけを確認することに集中しましょう。
視点
情報の範囲とは、今の検討で何を対象としているかという区切りです。同じ言葉が使われていても、扱う範囲まで同じとは限らないため、結論を急がずに対象を確かめる視点を持ちましょう。
確認ポイント
- 検討対象の範囲を言葉にできるか
- 同じ対象範囲を保って考えているか
- 対象範囲が曖昧な箇所はどこか
正解と解説を見る
解説
宿泊管理のデータモデルから業務ルールを読み取り、会員数や稼働率を求めるSQLを理解する問題です。貸会議室への転用で集計対象が不足する原因を追い、時間帯を扱うテーブル設計と、APを段階的に改定する際の移行・同期の問題まで説明します。
問題の全体像
D社は、5年前に構築した宿泊管理システムから、リピート率、会員の利用金額別分類、客室稼働率を抽出しようとしています。調査すると、一部施設が客室タイプに時間帯を組み込んで貸会議室を管理しており、当初のデータモデルと実際の運用がずれていました。出題趣旨では、論理モデルの理解・検証、問合せの設計・試験、異常データの調査・修正、継続的な改善の実践を問うとしています。設問1ではモデルとSQL、設問2では異常値の原因、設問3では業務に合うテーブル設計と移行手順を読み解きます。
設問1(1)(a)
公式解答例では「×」です。表3の項番2は「全施設共通のプランがある」という想定です。図2のプランの主キーには施設コードとプランコードが含まれ、図1でもプランは施設に属しています。プランコードだけで全施設共通のプランを識別する構造ではないため、モデルに反映された業務ルールとは一致しません。
設問1(1)(b)
公式解答例では「○」です。図2の会員には氏名、住所などが登録され、会員予約には会員番号が含まれています。図1の会員と会員予約の対応関係からも、予約時に会員番号で登録済みの会員を参照できます。したがって、会員番号を提示すれば氏名や住所などの再提示を省略できるという想定と一致します。
設問1(1)(c)
公式解答例では「×」です。表3の項番4は、同じ会員が施設、プラン、客室タイプ、利用開始年月日の全てが同じ予約を複数取れないという想定です。しかし、図2の予約は施設コードと予約番号で識別され、これらの条件の組合せを一意にする制約は示されていません。同じ条件でも予約番号を変えた複数の予約を表せるため、想定とは一致しません。
設問1(1)(d)
公式解答例では「○」です。図1の予約と宿泊の対応関係に着目すると、各宿泊は一つの予約に対応し、予約のない宿泊は表せません。図2でも宿泊には予約番号が含まれます。飛び込み客でも当日の予約を登録してから宿泊を受け付けるという表3の業務ルールと一致します。
設問1(1)(e)
公式解答例では「×」です。図2の予約には客室タイプコードや客室数がありますが、個々の客室を指定する客室番号はありません。また、客室在庫も客室タイプ、禁煙喫煙区分、年月日ごとに数を管理する構造です。この予約・在庫の情報では、連泊中に同じ客室を使うように個別の客室を割り当てることは表せないため、表3の想定とは一致しません。
設問1(1)(f)
公式解答例では「○」です。図1では各予約が一つのプラン明細に対応し、図2の予約にはプランコードと客室タイプコードが含まれています。そのため予約時にはプランと客室タイプを指定します。また、予約には客室数があり、同じ客室タイプの複数室を一つの予約で扱えます。表3の項番7の二つの条件を満たしています。
設問1(1)(ア)
公式解答例では「プラン明細,予約」です。表3の項番7は、プランと客室タイプの必須指定、および一つの予約で複数室を扱えることの判定です。前者は図1のプラン明細と予約の対応関係、後者は図2の予約の客室数に着目します。本文には対応関係を用いる場合は両端のエンティティタイプを参照するとあるので、プラン明細と予約の両方を挙げます。
設問1(1)(イ)
公式解答例では「宿泊,宿泊者」です。表3の項番8の「1名以上」は、図1の宿泊と宿泊者の対応関係がゼロを許すかどうかから判断します。各宿泊には1件以上の宿泊者情報が必要な対応関係となっています。対応関係の両端を参照するという本文の指示に従い、宿泊と宿泊者を挙げます。
設問1(2)(ウ)
公式解答例では「COUNT(DISTINCT B.会員番号)」、または「COUNT(DISTINCT 会員番号)」です。表1の依頼1で求めるのは宿泊の件数ではなく会員の人数です。宿泊と予約の結合結果には、同じ会員の複数回の宿泊や複数室の利用に対応する行が含まれます。そこで会員番号の重複をDISTINCTで除き、COUNTで人数を数えます。R1とR2の両方でこの考え方を使います。採点講評でも、この空欄の正答率が低かったとされています。
設問1(2)(エ)
公式解答例では「EXISTS」です。R2では指定期間内の宿泊について、それより前の宿泊が存在する会員を抽出します。副問合せは過去の宿泊を探すためのもので、必要なのは該当行が一つでも存在することです。EXISTSを使うと、過去の宿泊回数にかかわらず存在の有無で判定できます。
設問1(2)(オ)
公式解答例では「B.会員番号 = D.会員番号」です。外側の予約Bと、副問合せで参照する予約Dが同じ会員の予約であることを確認します。副問合せには既に施設コードの一致条件があるため、会員番号も一致させることで、同じ施設を利用した同じ会員の過去の宿泊を探せます。別の会員の宿泊をリピートの根拠にしないための条件です。
設問1(2)(カ)
公式解答例では「A.チェックイン年月日 > C.チェックイン年月日」です。外側の宿泊Aは指定期間内の宿泊、副問合せの宿泊Cは過去の宿泊です。Cのチェックイン年月日をAより前に限定することで、指定期間内の宿泊が2回目以降であることを確認できます。過去の宿泊Cを指定期間より前に限定する条件ではなく、Aより前に限定する点に注意します。公式解答例では、オとカの条件は順不同です。
設問1(2)(キ)
公式解答例では「COALESCE(リピート会員数、0) / 累計新規会員数」です。表1の定義に従い、リピート会員数を累計新規会員数で割ります。R3はR1を基準にR2をLEFT JOINするので、リピート会員がいない施設ではR2側の値がNULLになります。COALESCEでNULLを0に置き換えると、要求されたリピート率0を求められます。百分率にする100倍は空欄の外にあります。採点講評では、この空欄も正答率が低かったとされています。
設問1(3)
表5のT2は、合計利用金額の降順に並べた行をNTILE(5)で5群に分けます。表7は10人なので各群は2人です。降順に、100・103が階級1、101・109が階級2、104・108が階級3、107・105が階級4、102・106が階級5となります。公式解答例の太枠内は、会員101から109の順に「2,5,1,3,4,5,4,3,2」です。NTILEは行を分割する関数であり、金額の範囲を等幅に分割するものではありません。
設問2(1)
下線①では、S3から客室稼働率100%超の行だけを抽出します。表6の式は、累計稼働客室数を累計予約可能客室数で割って100倍しています。そのため、分子が分母を超える行をWHERE句で選べば異常値を絞り込めます。公式解答例では、この比較条件の追加、または稼働率100%超の条件の追加を示しています。50字以内の答案では「累計稼働客室数が累計予約可能客室数を超える条件のWHERE句を追加する。」と、比較対象と変更箇所を押さえます。
設問2(2)
表12では客室1050が客室タイプ71だけに対応しますが、表13・表14では同じ会議室の時間帯が客室タイプ71~74として登録されています。S2は客室状況から客室を経由して客室タイプをたどるため、客室に対応しない72~74の予約可能数を集計できません。表9の稼働数は合計36、表10の予約可能数は30なので、稼働率が120%になります。公式解答例の要点を50字以内で示すと「客室タイプ72~74に対応する客室数が累計予約可能客室数に含まれないから。」です。採点講評では、SQLの構文ではなく、テーブル構造とデータの意味の相違を説明することが求められています。
設問2(3)
公式解答例では「客室在庫」です。ヒアリング結果では、時間帯を組み込んだ客室タイプごとに予約可能数を設定しています。図2の客室在庫には、施設コード、客室タイプコード、年月日などと予約可能数があるため、個々の客室との対応を経由せず、時間帯に相当する各客室タイプの予約可能数を集計できます。集計対象は割当済数や残数ではなく、稼働率の分母となる予約可能数です。
設問2(4)(a)
図2では定員を客室タイプに持たせています。表14のように同じ貸会議室を時間帯ごとの複数の客室タイプで表すと、本来一つである会議室の定員を複数箇所で管理することになります。定員変更時に一部だけ更新すると、時間帯によって異なる定員が登録されます。公式解答例の要点を40字以内で示すと「同じ貸会議室の異なる客室タイプに異なる定員が設定される。」です。
設問2(4)(b)
ヒアリング結果では、貸会議室利用を宿泊として登録しています。一方、表3の項番8と図1では、宿泊ごとに1名以上の宿泊者情報が必要です。会議室利用には宿泊者がいないのに、この宿泊業務のルールを満たすための登録が発生します。公式解答例の要点を40字以内で示すと「宿泊者がいないのに、1名以上の宿泊者を記録する作業。」です。採点講評では、定員確認など通常の業務ではなく、宿泊のルールを転用して生じる無駄を指摘することが求められています。
設問3(1)(ク)
公式解答例では「施設コード,客室タイプコード,年月日,時間帯コード,予約可能数,割当済数」で、主キーは最初の4列です。貸会議室を表す客室タイプと貸出時間帯を分け、施設・客室タイプ・日付・時間帯ごとに在庫を管理します。予約可能数と割当済数はその単位で管理する値です。答案では「<u>施設コード</u>,<u>客室タイプコード</u>,<u>年月日</u>,<u>時間帯コード</u>,予約可能数,割当済数」と主キーに実線の下線を付けます。貸会議室は全て禁煙なので、禁煙喫煙区分は含めません。採点講評では、必要な列の欠落と主キーの誤りが指摘されています。
設問3(1)(ケ)
公式解答例では「施設コード,予約番号,時間帯コード」で、3列全てが主キーです。ヒアリング結果の「1回の予約で1室だけ」と「複数時間帯を1回の予約で登録したい」を合わせて考えます。施設コードと予約番号で予約を特定し、その予約に含まれる各時間帯を明細として登録します。客室タイプや利用日は既存の予約側で扱えるため、明細では時間帯コードを加えます。答案では「<u>施設コード</u>,<u>予約番号</u>,<u>時間帯コード</u>」と下線を付けます。
設問3(2)(手順番号)
公式解答例では「c1」です。表15のc1は施設利用ビューの削除、c2は宿泊テーブルを施設利用テーブルに改名する手順です。c1を実行すると、新APが参照する施設利用という名前のビューがなくなり、c2が完了するまで同名のテーブルもありません。したがって、c1の前にAPのアクセスを停止する必要があります。
設問3(2)(理由)
移行期間中、新APは施設利用ビューを通じて宿泊テーブルにアクセスします。c1でビューを削除してからc2でテーブルを改名するまでの間は、施設利用というアクセス先が存在しません。その間に新APがアクセスすると異常終了します。公式解答例の要点を40字以内で示すと「新APが施設利用テーブルにアクセスすると異常終了するから。」です。停止理由は、ビュー削除と改名の間にアクセス先がなくなることです。
設問3(3)
表15では、b2で宿泊から施設利用へ変更を反映するトリガーを作成してから、b3で既存行を複写します。順序を逆にすると、複写中には同期用トリガーがありません。既に複写した宿泊の行がその後に更新されても、施設利用側には反映されず、複写対象も施設利用に存在しない行だけなので取り直されません。公式解答例に沿う50字以内の答案は「施設利用テーブルへの複写が済んだ宿泊テーブルの行が更新された場合。」です。未複写行ではなく、複写済みの行への更新を特定することが要点です。
設問3(4)(問題)
公式解答例では「処理の無限ループが発生する。」です。RDBMSの仕様には、AFTERトリガーが連鎖して実行されるとあります。宿泊の更新を施設利用へ反映すると、その更新が逆方向のトリガーを起動して宿泊を更新します。値が変わらない更新でも反映を続けると、相互の更新が繰り返されます。20字以内では「処理の無限ループが発生する。」と、発生する問題を端的に示します。
設問3(4)(コ)
公式解答例では「“宿泊”テーブルの行の旧値と新値が一致しない。」です。RDBMSの仕様では、トリガー内で更新前後の行を参照できます。旧値と新値が異なる場合だけ施設利用へ反映すれば、逆方向のトリガーから同じ値が戻った際には、宿泊側の実質的な変更がないため連鎖を止められます。30字以内では「宿泊テーブルの行の旧値と新値が一致しない。」と記します。条件は、反映先の存在確認ではなく、更新元の行に実際の値の変化があることです。
学習のポイント
主キー・必須対応・集計単位を業務の意味と結び付け、DISTINCT、EXISTS、NULL処理、時間帯別のキー設計、移行中の更新とトリガー連鎖を理解することが重点です。
出典:独立行政法人 情報処理推進機構(IPA)令和4年度秋期 データベーススペシャリスト試験 午後Ⅱ 問1(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針