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








解き方のヒントを見る
要件と前提条件を対応づけて読む
設問が求めている要件と、その前提として示されている条件を一つずつ対応づけることに観点を絞ります。どの条件が判断の根拠になるのかを先に明確にしてから、各候補がそれを満たすかを落ち着いて確かめましょう。
この問題で問われていること
この問題では、状況説明に含まれる要件や制約のうち、どれが判断を左右するかを見極める力が問われていると考えられます。記述された条件を読み落とさず、根拠となる箇所を特定する姿勢が大切です。
視点
データベースの設計や運用の判断では、何を実現したいのか(要件)と、どのような状況で運用されるのか(前提)の組合せによって適否が変わります。用語の一般的な印象だけで判断せず、示された条件に照らして妥当かどうかを考えることが基本です。
確認ポイント
- 判断を求められている要件が何かを、自分の言葉で言い直せるか
- その要件に関係する前提条件や制約が、どこに書かれているかを特定できたか
- 用語の印象ではなく、示された条件に照らして判断の根拠を説明できるか
正解と解説を見る
解説
見積システムのマスターである“商品”テーブルに変更履歴を保存する設計変更と、クラウド移行時の基盤設計を題材にした問題です。前半は、結合条件、主キーと外部キーの関係、BEFORE/AFTERトリガーと相関名、LAG/LEADによる適用期間の算出、最新の行と過去の行の振り分けを問います。後半は、ログ切替え間隔に基づくRPO、リストア時間とログ適用時間によるRTO、同期型と非同期型のレプリケーションの特性を仕様から読み取る力を問います。
問題の全体像
専門商社B社の見積システムでは、仕入先の見積回答で判明したモデル名や定価の変更を“見積回答明細”に登録し、“商品”テーブルには後日反映しています。今回、商品属性の変更履歴を残すため、既存のアプリケーションへの影響が少ない案2(“商品”はそのまま残し、“商品履歴”を追加する案)を採用し、トリガーとデータ移行を実装します。後半ではクラウド移行を想定して、ディスク障害時のRPO/RTOの見積りと、参照専用インスタンスへの非同期型レプリケーションの考慮点を扱います。出題趣旨では、マスターテーブルの設計変更、トリガーの実装、列の値の変更を前提としたデータ移行、RPO/RTOの見積り、レプリケーションの考慮点についての理解を問うとしています。
設問1(1)(a)
図2は、見積回答明細Aと商品Cを突き合わせ、新旧のモデル名と定価を比べるSQL文です。図1を見ると、両テーブルに共通し、“見積回答明細”から“商品”を参照している列は商品コードです。したがって、公式解答例のとおり結合条件はA.商品コード = C.商品コードとなり、aには「商品コード」が入ります。
設問1(1)(b)
本文には「モデル名又は定価のいずれかが変更されたが」とあります。モデル名だけが違う場合も、定価だけが違う場合も抽出する必要があるため、二つの不一致条件は論理和で結びます。公式解答例ではbは「OR」です。図3でも同じ字句を使い、前の行からモデル名又は定価が変わった行を抽出しています。
設問1(2)(テーブル名)
案1では“商品”の主キーが{商品コード、 適用開始日}の複合キーに変わり、同じ商品コードの行が複数存在するようになります。図1の中で商品コードを外部キー(破線の下線)として持ち、“商品”を参照しているのは“見積依頼明細”と“見積回答明細”です。公式解答例でも、この2テーブルを挙げています。両方を答える必要があります。
設問1(2)(制約)
“見積依頼明細”と“見積回答明細”は、商品コードだけで“商品”を参照しています。案1では商品コードだけでは“商品”の行を一意に特定できず、被参照側のキーとして使えなくなります。このため参照関係を定義し直す必要があり、公式解答例では変更すべき制約を「外部キー制約」としています。既存アプリケーションへの影響を避けるために案2が採用された理由も、ここから読み取れます。
設問1(3)(c)
“商品履歴”には、同じ商品について過去の行が複数入ります。本文には「同一の適用開始日に同一の商品を複数回更新することはない前提」とあるため、商品コードと適用開始日の組合せで行を一意に識別できます。公式解答例ではc、dは順不同で、cの一方は「商品コード」です。
設問1(3)(d)
(c)と同じ理由で、主キーのもう一方の構成列は「適用開始日」です(公式解答例ではcと順不同)。商品コードだけでは履歴が重複するため、行の適用期間の開始を示す適用開始日を組み合わせることが根拠になります。
設問1(3)(e)
トリガー1は、SET NEW1.適用開始日 = COALESCE(...)によって、更新後の行の値を反映前に書き換えます。仕様(4)①では、更新中や挿入中の値を実際の反映前に修正できるのはBEFOREトリガーだと説明しています。したがって公式解答例のとおり、eは「BEFORE」です。
設問1(3)(f)
トリガー2は、INSERT INTO 商品履歴によって、ほかのテーブルを変更します。仕様では、変更操作の後に実行され、ほかのテーブルに対する変更操作を行えるのはAFTERトリガーです。また、トリガー1で確定した更新後の適用開始日を使う必要があるため、更新後に実行するのが自然です。公式解答例では、fは「AFTER」です。
設問1(3)(g)
“商品履歴”に挿入するのは、対象行の更新前の行です。VALUESの各列もOLD2で修飾されているため、履歴行の適用開始日には、更新前の行の適用開始日を設定します。公式解答例では、gは「OLD2」です。
設問1(3)(h)
目的欄には「挿入行の適用終了日には、更新後の行の適用開始日の前日を設定する」とあります。そのため、更新後の行を指すNEW2の適用開始日をADD_DAYSで1日戻します。公式解答例では、hは「NEW2」です。
設問1(4)(i)
図3の適用終了日は、ADD_DAYS(LEAD(見積回答日)、 -1)で求めます。つまり、同じ商品の次の変更行の適用開始日の前日です。商品コード1で行2(2020-09-01、 M1-1)の次の行は行3で、その見積回答日は2022-09-01です(表3の見積依頼番号2022001201)。その前日なので、公式解答例のとおりiは「2022-08-31」です。
設問1(4)(j)
行3(定価1100、 M1-2)は、表4の見積依頼番号2022001201の明細です。表3でこの見積回答日を確認すると2022-09-01です。適用開始日には見積回答日が入るため、公式解答例ではjは「2022-09-01」です。
設問1(4)(k)
行3は商品コード1の最後の行なので、LEADは1行後の行がないためNULLを返します。注記では、ADD_DAYSは引数1がNULLならNULLを返すとされています。その結果、適用終了日はNULLになり、公式解答例ではkは「NULL」です。表1の注記2の「適用終了日が未定の場合はNULL」という、現在適用中の行の扱いとも一致します。
設問1(5)(商品)
“商品”テーブルには、各商品の最新の状態、つまり適用終了日が未定の行を反映します。商品コード1は行3、商品コード2は行5、商品コード3は変更がなく1行だけなので行6が最新です。公式解答例では「3、5、6」です。移行前の状態によらず、変更があった全商品を更新するという記述も、最新行で上書きする根拠になります。
設問1(5)(商品履歴)
“商品履歴”には、後継の行があり適用期間が終了した過去の行を挿入します。該当するのは、商品コード1の行1と行2、商品コード2の行4です。公式解答例では「1、2、4」です。採点講評では、更新行と挿入行を重複して答える誤答が散見されたと指摘しています。“商品”は最新の状態、“商品履歴”は過去の状態を持つ設計だと読み取り、各行をどちらか一方にだけ振り分けることが重要です。
設問2(1)(ア)
回復にはオブジェクトストレージ上のフルバックアップとアーカイブログを使います。ディスク障害時には、まだアーカイブされていない現行ログファイルの内容が失われます。そのため、どこまで戻せるかは失われるログの量で決まり、公式解答例ではアは「ログの量」です。
設問2(1)(イ)
ログの切替えは5分に1回行われ、その時点でオブジェクトストレージにアーカイブされます。したがって、失われるのは最大で直前の切替え以降5分間の更新です。公式解答例では、イは「5」(分)です。
設問2(1)(ウ)
リストア時間は、データベース容量を転送速度で割って求めます。180×10^9バイト ÷ (100×10^6バイト/秒) = 1、800秒です。公式解答例では、ウは「1、800」です。
設問2(1)(エ)
ログを適用する期間は最大24時間で、ログは毎秒10ページ出力されます。24時間×3、600秒×10ページ = 864、000ページとなり、公式解答例ではエは「864、000」です。
設問2(1)(オ)
バッファヒット率が0%なので、全ページで同期入出力が発生します。864、000ページ×2ミリ秒 = 1、728、000ミリ秒 = 1、728秒です。公式解答例では、オは「1、728」です。
設問2(2)
仕様(3)②では、非同期型は複製先へのログの到達を待たずに複製元のトランザクションをコミットします。同期型は、複製先でログがディスクに出力されるまでコミットを待ちます。そのため同期型では、参照専用インスタンスの負荷や応答が本番インスタンスのコミット時間に影響します。非同期型ならこの待ちが発生しません。公式解答例では「非同期型では複製先へのログの到達を待たないから」や「同期型では複製先でのログのディスク出力を待つから」としています。30字以内で答える場合は、『複製先へのログ到達を待たずにコミットする』という仕様上の根拠を明記すれば、要素を押さえられます。
設問2(3)
非同期型では、複製元がコミットした時点で、そのログが複製先に届いているとは限りません。本番インスタンスで障害が起きたときにまだ複製先へ反映されていない変更は、フェイルオーバー後の参照専用インスタンスには存在せず、失われます。公式解答例では「複製元の変更操作が複製先で未反映だった場合」を挙げ、そうした状態を生む状況として「複製元と複製先の間の通信が切断されていた場合」「複製先のインスタンスが停止していた場合」も示しています。30字以内では、コミット済みの変更が複製先に未到達・未反映のまま障害が起きた状況を簡潔に書きます。
学習のポイント
主キーの変更が外部キーに及ぼす影響、トリガーの実行タイミングと相関名の使い分け、ウィンドウ関数の結果を手で追う力、RPO/RTOの計算手順、同期型と非同期型のレプリケーションの長所と短所を重点的に学習します。
出典:独立行政法人 情報処理推進機構(IPA)令和4年度秋期 データベーススペシャリスト試験 午後Ⅰ 問2(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針