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













解き方のヒントを見る
要件と設計判断の対応を確かめる
設問が求めている条件や前提を先に書き出し、それぞれがどの設計上の判断と結び付くのかを一つずつ対応付けて考えると、見落としや思い込みを減らせます。記述された前提から外れた一般論で判断しないよう注意しましょう。
この問題で問われていること
確認すべき観点は一つで、問題中に示された業務上の前提や条件が、検討対象の設計判断を成り立たせる根拠として本当に書かれているかどうかです。前提と結論のつながりを自分の言葉で説明できるか試してください。
視点
データベース設計では、ある方式が適切かどうかは、方式そのものの良し悪しよりも、扱うデータの性質や運用上の条件との組合せで決まることが多いです。一般に知られた長所や短所を当てはめる前に、その条件が問題の状況に本当に当てはまるかを確かめることが大切です。
確認ポイント
- 問題中の前提や条件を、自分の言葉で短く書き出したか
- 検討中の判断ごとに、それを支える記述を問題中から指し示せるか
- 問題に書かれていない一般論や経験だけで判断していないか
正解と解説を見る
解説
不動産会社の商談管理システムを題材に、データベースの物理設計を幅広く問う問題です。前半では、追客サブタイプの実装方法、物件情報の参照制約に沿った反映順序、一意性制約・BEFOREトリガ・AFTERトリガによる業務制約の実装を扱います。中盤では、完全外結合とCOALESCEを使う集計問合せ、範囲テーブルを使う結合条件を扱います。後半はバックアップ・リカバリで、I/O回数から回復時間を求める試算、差分バックアップが有利な理由、誤登録データを論理削除した後に相関副問合せで最新接触日時を更新するUPDATE、エクスポートとインポートを組み合わせた部分復旧を扱います。どの設問も、本文の〔RDBMSの主な仕様〕と状況の記述を根拠に解答を組み立てることが重要です。
問題の全体像
D社は、マンション販売の商談管理システムを刷新しています。物件情報は物件管理システムから、資料請求と来場予約はWebサイトから、契約データは契約システムから受領し、APでデータベースに反映します。出題趣旨によると、本問で評価するのは次の四つの能力です。①論理データモデルを基に実装するテーブルを設計する能力、②業務上の制約を実装する能力、③問合せを設計する能力、④障害からリカバリする能力。設問1ではテーブル構造と制約の実装、設問2ではミスマッチ分析表を出力する問合せ、設問3では三つの障害ケースのリカバリが問われます。解答の根拠は、〔RDBMSの主な仕様〕(トリガの制限、バックアップの種類、復元・回復、エクスポート・インポートのオプション)と、表2・表7・表8に書かれた条件です。
設問1(1)(ア)
方法①は、スーパタイプと全サブタイプを一つのテーブルにまとめます。そのため、単一のサブタイプ(例えば“受付”だけ)を参照したいときは、テーブル内の全追客行の中から該当する区分の行だけを取り出さなければなりません。項目Dと項目Fがどちらも空欄アなのはこのためです。公式解答例では、アは「追客区分による選択が必要」です。他の方法ではサブタイプごとにテーブルが分かれているので、この選択は不要です。
設問1(1)(イ)
方法②は、スーパタイプとサブタイプを別々のテーブルにします。スーパタイプの属性と全サブタイプの属性をまとめて得るには、まず“追客”テーブルと各サブタイプのテーブルを主キーで結合し、さらに“受付”“実施”“応対”の三つの結果を和集合でまとめる必要があります。項目Eには「和集合が必要」、項目Fには「結合が必要」と記入されているので、Gはその両方にあたります。公式解答例では、イは「結合及び和集合が必要」です。
設問1(1)(ウ)
方法③では、スーパタイプの属性がすでに各サブタイプのテーブルに列として含まれているため、結合は不要です。ただし、三つのサブタイプのテーブルに分かれているので、全部を参照するには和集合が必要です。これは項目Eの方法③と同じ理屈です。公式解答例では、ウは「和集合が必要」です。
設問1(1)(エ)
処理5は、指定した物件と顧客の全ての追客について、接触日時と追客種別(スーパタイプの属性)を表示します。あわせて、追客区分ごとに固有の属性値(例:受付の開始予定日時・終了予定日時)から追客概要を作ります。つまり、スーパタイプと全部のサブタイプを参照する処理です。公式解答例では、エは「G」です。本文にある「方法②では処理5の応答時間に不安がある」という記述も、方法②のGには結合と和集合の両方が必要になることと合っています。
設問1(1)(オ)
処理6は、追客種別ごと・接触日時の日ごとに件数を集計するだけです。使う属性は物件コード、接触日時、追客種別で、いずれもスーパタイプ“追客”の属性です。サブタイプ固有の属性は使いません。公式解答例では、オは「C」です。採点講評では(1)イ及びオに誤答が散見されたとされています。処理が実際に参照する属性がどちらのタイプのものかを、図2と表2で確かめることが大切です。
設問1(2)(カ)
図2の外部キーをたどり、参照先のテーブルが自分より前のグループに入るように配置します。グループ1は、どこも参照しない大エリアと鉄道事業者です。グループ2は、それらを参照する小エリアと沿線です。住所は小エリアコードだけを参照しているので、小エリアの次のグループ3に置けます。公式解答例では、カは「住所」です。
設問1(2)(キ)
駅は、沿線コード(グループ2)と住所コード(グループ3)を参照するので、グループ4になります。物件は、物件情報のうち所在地住所コードで住所を参照するので、同じくグループ4です。販売センタは物件管理システムから受領する物件情報に含まれないため、順序付けの対象外です。公式解答例では、キは「駅,物件」です。
設問1(2)(ク)
最寄り駅は物件と駅を、販売期と棟は物件を参照するので、この三つはグループ4の次のグループ5に置けます。住戸は棟と販売期を参照するので、表4のとおりグループ6になります。公式解答例では、クは「最寄り駅,販売期,棟」です。同じグループのテーブルは並行して処理されるので、互いに参照関係がないことも確認しておきましょう。
設問1(3)(ケ)
制約②は「同じ顧客、接触日時及び追客種別の追客を行うことはない」、つまり三つの列の組合せが重複しないという制約です。一意性制約で実装できます。公式解答例では、「顧客コード,接触日時,追客種別を構成列とする一意性制約を定義する。」です。答案では、構成列の三つ(顧客コード・接触日時・追客種別)と、一意性制約という手段を、40字以内で両方書くことがポイントです。
設問1(3)(コ)
制約③は、契約ステータスが後退する変更を拒否する制約です。更新前の値と更新後の値を比べる必要があるので、同一行の列しか扱えない検査制約では実装できません。旧値(OROW)と新値(NROW)を参照できるトリガを使い、変更操作の前に判定して例外でエラーを通知するため、BEFOREトリガにします。BEFOREトリガ内では変更操作ができませんが、チェックだけなら問題ありません。公式解答例では、「OROW.契約ステータスとNROW.契約ステータスの値をチェックするBEFOREトリガを定義する。」です。答案で押さえる要素は、OROWとNROWの比較、BEFOREトリガの二つです。
設問1(4)①
RDBMSの仕様(5)には、トリガ内で発生した例外は契機となった変更操作に返却され、トランザクションは終了しないので明示的なコミット又はロールバックが必要、と書かれています。契約ステータスの更新だけをコミットすると、制約④(契約ステータスと商談ステータスの一致)が崩れてしまいます。そのため、まずトランザクションを取り消す必要があります。公式解答例では、一つ目の処置は「トランザクションをロールバックする。」です。
設問1(4)②
ロック待ちタイムアウトは、他のトランザクションがロックを解放すれば解消する一時的な例外です。そのため、ロールバックしただけで終わらせず、時間をおいてもう一度処理すれば反映できる見込みがあります。公式解答例では、二つ目の処置は「間隔を空けてトランザクションを再実行する。」です。採点講評では、(4)で例外の特性を考慮しない解答が散見されたとされています。「ロールバック」と「間隔を空けた再実行」を、それぞれ25字以内で書き分けることが求められます。
設問2(1)(理由)
図1には「/2名」(住戸はないが顧客はいる)や「1戸/」(住戸はあるが顧客はいない)のセルがあります。表2の処理7にも「住戸数と顧客数の片方又は両方を対応させて」とあります。M2(住戸の集計)とT2(顧客の集計)の一方にしかない価格帯・面積帯の組も出力する必要があるので、内結合や片側の外結合ではなく完全外結合を使います。公式解答例では、理由は「価格帯,面積帯の組がM2とT2のどちらか一方にしかない場合があるから」です。
設問2(1)(サ)
完全外結合では、相手側に対応する行がないと、その側の列はNULLになります。M2.価格帯だけを出力すると顧客だけの組で価格帯がNULLになり、T2.価格帯だけを出力するとその逆になります。そのため、NULLでない方を採用する必要があります。公式解答例では、サは「M2の価格帯とT2の価格帯のどちらかNULLでない方」又は「COALESCE(M2.価格帯、 T2.価格帯)」です。採点講評でも、完全外結合の結果の列値がNULLになることを理解した解答を求めたと述べられています。
設問2(2)(シ)
価格帯1は、案1の条件で「販売価格 < 3000」の範囲です。販売価格は0~99、999の整数なので、下限値は0です。上限値は、ソの比較演算に合わせて決めます。公式解答例では、シは「0、 3000」(上限を含まない<で比較する場合)又は「0、 2999」(上限を含む<=やBETWEENで比較する場合)です。どちらを選んでも、ソの条件と組み合わせたときに境界の値が漏れたり重複したりしないことが必要です。
設問2(2)(ス)
価格帯2は、3000以上4000未満の範囲です。シと同じ考え方で、公式解答例では、スは「3000、 4000」又は「3000、 3999」です。下限値は前の帯の上限と連続させ、上限値の決め方はシ・セと同じ方式にそろえます。
設問2(2)(セ)
価格帯5は6000以上の範囲です。表1から販売価格の最大値は99、999なので、それを含むように上限値を設定します。公式解答例では、セは「6000、 100000」(<で比較する場合)又は「6000、 99999」(<=やBETWEENで比較する場合)です。上限値をNULLにすると比較が成立しなくなるので、表1の値域を根拠に具体的な数値を入れます。
設問2(2)(ソ)
住戸Aの販売価格が、価格帯Bの下限値以上かつ上限値の範囲内にあれば、その価格帯と結合します。公式解答例では、ソは「A.販売価格 >= B.下限値 AND A.販売価格 < B.上限値」です。上限値を2999のように範囲に含める値で登録した場合は、「A.販売価格 >= B.下限値 AND A.販売価格 <= B.上限値」又は「A.販売価格 BETWEEN B.下限値 AND B.上限値」です。シ~セの値と整合する組合せで答えることがポイントです。
設問3(1)(a)a
本文で、“商談”テーブルの回復時のI/Oは404、000回と示されています。1ページ当たりのI/Oは0.01秒なので、404、000 × 0.01 = 4、040秒です。公式解答例では、aは「4、040」です。
設問3(1)(a)b
表8より、“追客”テーブルの追加は1時間当たり50、000件なので、8時間分で400、000件です。追加時は1ページ当たりの平均行数(25行)まではバッファ上で処理し、ページが一杯になるごとに空白ページを読み込みます。したがって、I/Oは400、000 ÷ 25 = 16、000回です。公式解答例では、bは「16、000」です。
設問3(1)(a)c
“追客”テーブルの更新は1時間当たり5、000件なので、8時間分で40、000件です。更新時はログ1件ごとに対象ページを読み込み、バッファヒット率は0とするので、I/Oは40、000回です。公式解答例では、cは「40、000」です。
設問3(1)(a)d
“追客”テーブルのI/O回数は、b+c=16、000+40、000=56、000回です。これに0.01秒を掛けると560秒になります。公式解答例では、dは「560」です。
設問3(1)(a)e
12:00、14:00、16:00にテーブル単位のバックアップを取ると、18:00の障害では16:00のバックアップから復元できます。その後に適用する更新ログは、16:00~18:00の2時間分で済みます。公式解答例では、eは「2」です。
設問3(1)(a)f
2時間分の“商談”テーブルは、追加10、000件で10、000 ÷ 10 = 1、000回、更新100、000件で100、000回、合わせて101、000回のI/Oです。これに0.01秒を掛けると1、010秒になります。公式解答例では、fは「1、010」です。
設問3(1)(b)
増分バックアップでは、12:00、14:00、16:00の各回に変更されたページが別々のファイルに入ります。復元時は全ファイルを順番に適用するので、何度も更新されたページはそのたびに上書きされます。一方、差分バックアップは、全体バックアップ以降に変更されたページの最新状態を一つのファイルに持つので、各ページを1回反映すれば済みます。“商談”テーブルは更新が1時間当たり50、000件と多く、同じ行が繰り返し更新されやすいので、差が大きくなります。“追客”テーブルは追加が中心なので、ほとんど差が出ません。公式解答例では、「同じ行への複数の更新を反映する必要がないから」です。30字以内で、同じ行(ページ)への複数回の更新を重ねて反映しなくてよい点を書きます。採点講評では、この設問の正答率が低かったとされています。
設問3(2)(a)
表7の障害ケース②では、誤登録の前後の時間帯にも断続的に追客を記録する業務が行われています。バックアップと更新ログで誤登録直前の状態に戻すと、誤登録期間中や誤登録後に行われた正しい登録や更新まで取り消され、失われてしまいます。公式解答例では、「誤登録が発生したデータ以外も誤登録前の状態に戻ってしまい,記録した情報が失われる。」です。60字以内で、誤登録以外のデータも戻ること、正当な記録が失われることの二点を押さえます。
設問3(2)(b)g
表1で、最新接触日時は「商談に紐付く追客の最新の接触日時」と定義されています。誤登録分を削除状態にした後、残っている追客の接触日時の最大値で最新接触日時を置き換えます。公式解答例では、gは「MAX(T.接触日時)」です。
設問3(2)(b)h
相関副問合せでは、外側で更新している商談Sの行ごとに、その商談に紐付く追客Tだけを集計します。“商談”と“追客”は、顧客コードと物件コードの組で対応しています。公式解答例では、hは「S.顧客コード = T.顧客コード」で、iと順不同です。採点講評では、この(2)(b)の正答率が低かったとされ、相関副問合せはUPDATE文でも利用できるので知っておいてほしいと述べられています。
設問3(2)(b)i
hと組になる、もう一つの対応条件です。顧客コードだけでは、同じ顧客の別の物件の追客まで含まれてしまいます。物件コードも一致させる必要があります。公式解答例では、iは「S.物件コード = T.物件コード」で、hと順不同です。
設問3(2)(b)j
直前の手順で、誤登録した“追客”の行は削除フラグ=1(論理削除)に更新されています。論理削除では行が物理的に残るので、条件を付けないとMAXに誤登録の接触日時が含まれてしまいます。未削除の行だけを対象にする条件が必要です。公式解答例では、jは「T.削除フラグ = 0」です。
設問3(3)k
手順2では、作業用DBに当日0時の全体バックアップを復元しています。誤更新の直前(2021-07-21 13:45:11)までの状態にするには、更新ログを使ったロールフォワード処理が必要です。仕様6(1)により、異なる環境に復元した場合も同じように回復できます。公式解答例では、kは「更新ログによる回復機能」です。
設問3(3)l
本番DBは誤更新後も参照系で稼働しており、誤更新の発生中に行われた正しい追加・更新も含んでいます。そのため、過去の状態に戻す作業は本番DBではなく、手順2で復元した作業用DBで行います。公式解答例では、lは「作業用DB」です。
設問3(3)m
作業用DBを、誤更新が行われる直前の日時まで回復します。回復機能には「指定の時刻の状態に回復」という指定ができるので、その時刻を作業内容に含めます。公式解答例では、mは「誤更新が行われた直前の日時の状態に回復する。」です。
設問3(3)n
作業用DBの正しい状態の“顧客”データを本番DBへ移すには、まずファイルに抽出する必要があります。テーブル単位で抽出でき、抽出条件も指定できるのはエクスポート機能です。公式解答例では、nは「エクスポート機能」です。
設問3(3)o
正しい状態の“顧客”データがあるのは、手順3で回復した作業用DBです。公式解答例では、oは「作業用DB」です。
設問3(3)p
不正な状態になったのは、“顧客”テーブルのうち名寄せ先顧客コードがNULLの行です(表7)。誤更新された行だけを戻す方針なので、エクスポート時に抽出条件を指定し、対象行だけをファイルに出します。公式解答例では、pは「“顧客”テーブルのうち名寄せ先顧客コードがNULLの行をファイルに抽出する。」です。採点講評では、(3)でエクスポートに指定するテーブルの検索条件を書いていない解答が散見されたとされています。
設問3(3)q
エクスポートしたファイルを別の環境の同じ構造のテーブルに格納するのは、インポート機能です。公式解答例では、qは「インポート機能」です。
設問3(3)r
誤更新された行を正しい状態に戻す相手は、稼働中の本番DBです。公式解答例では、rは「本番DB」です。
設問3(3)s
本番DBには、主キーが一致する行(誤更新された行)がすでにあります。オプションを指定しないとSKIPと同じ動作になり、何も更新されません。既存の行を上書きするには、MERGEオプションの指定が必要です。公式解答例では、sは「手順4で抽出したファイルを,MERGEオプションを指定して格納する。」です。採点講評では、インポート機能に指定するオプションを書いていない解答が散見されたとされています。40字以内に、対象ファイルとMERGE指定を必ず含めます。
学習のポイント
採点講評では、設問3の(1)(b)(差分バックアップからの復元が増分バックアップからの復元より時間が掛からない理由)と(2)(b)(相関副問合せを使ったUPDATE文)の正答率が低かったとされ、相関副問合せはUPDATE文でも使えるので知っておいてほしいと述べられています。ほかにも採点講評では、次の点が指摘されています。 ・設問1(1)イ・オの誤答(業務処理に必要な関係演算に合ったテーブル構造の設計) ・設問1(4)で例外の特性を考慮していない解答 ・設問2(1)サで、完全外結合の結果の列値がNULLになることを理解していない誤答 ・設問3(3)で、エクスポートの検索条件やインポートのオプションを書いていない解答 学習では、この順に理由を説明できるか確かめるとよいでしょう。
出典:独立行政法人 情報処理推進機構(IPA)令和3年度秋期 データベーススペシャリスト試験 午後Ⅱ 問1(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針