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

令和2年度10月 データベーススペシャリスト 午後Ⅰ 問2

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

問題

問2 データベースの実装に関する次の記述を読んで,設問1~3に答えよ。 劇場運営会社のY社は,オンラインチケット販売システム(以下,チケット販売システムという)を構築してインターネットでのチケットの申込みを受け付けている。Y社ではチケット販売システムを刷新し,新たにプレイガイドなどでのチケット販売委託を進めることになった。 〔RDBMSの主な仕様〕 チケット販売システムに用いているRDBMSの主な仕様は,次のとおりである。 1. ISOLATIONレベル 選択できるトランザクションのISOLATIONレベルとその排他制御の内容は,表1のとおりである。 ロックは行単位で掛ける。共有ロックを掛けている間は,他のトランザクションからの対象行の参照は可能であり,変更は共有ロックの解放待ちとなる。専有ロックを掛けている間は,他のトランザクションからの対象行の参照,変更は専有ロックの解放待ちとなる。 表1 トランザクションのISOLATIONレベルとその排他制御の内容 2. レプリケーション機能 (1) 1か所のデータを複数か所に複製する機能,複数か所のデータを1か所に集約する機能,及び両者を組み合わせて双方向に反映する機能がある。これらの機能を使用すると,一方のテーブルへの挿入・更新・削除を他方に自動的に反映させることができる。 (2) トランザクションログを用いてトランザクションと非同期に一定間隔でデータを反映するバッチ型と,レプリケーション元のトランザクションと同期してデータを反映するイベント型がある。 ① バッチ型では,テーブルごとに,レプリケーションの有効化,無効化をコマンドによって指示することができる。無効化したレプリケーションを有効化するときには,蓄積されたトランザクションログを用いてデータを反映する。 ② イベント型では,レプリケーション先への反映が失敗すると,レプリケーション元の変更はロールバックされる。 (3) 列の選択,行の選択及びその組合せによって,レプリケーション先のテーブルに必要とされるデータだけを反映することができる。 〔チケット販売システムの概要〕 チケット販売システムは,空席管理システムと販売管理システムで構成される。オンラインチケット販売時には,空席管理システムで空席を確認した後に座席を確保し,販売管理システムでチケット情報を保持する。 〔チケット販売システムのテーブル〕 空席管理システムと販売管理システムのそれぞれの主なテーブルのテーブル構造は,図1,2のとおりである。索引は,主キー及び外部キーに定義している。 図1 空席管理システムの主なテーブルのテーブル構造(一部省略) 図2 販売管理システムの主なテーブルのテーブル構造(一部省略) 〔チケット販売業務の概要〕 1. テーブル及び列の設定 (1) 会場と座席 ① 会場には,一意な会場番号を付与して,都道府県,住所,座席図などを設定する。 ② 座席には,会場ごとに一意な座席番号を付与して,席種(‘S’,‘A’,‘B’など)を設定する。 (2) 公演と席種料金 ① 公演には,一意な公演番号を付与する。公演開催明細には,公演日時(公演日,開演時刻)ごとに,開場時刻,公演会場番号,販売開始日などを設定する。 ② 席種料金には,公演の席種ごとに料金を設定する。 (3) 席種在庫と座席状況 ① 席種在庫には,席種ごとの空席数をもつ。座席の購入が確定したら空席数を減らし,購入された座席がキャンセルされたら空席数を戻す。 ② 座席状況には,公演開催明細ごとの全ての座席の状況をもつ。販売開始時には,空席フラグはオン,仮予約フラグはオフとする。座席の購入処理中は仮予約フラグをオンにする。座席の購入が確定したら,空席フラグをオフにして,仮予約フラグをオフにする。 (4) チケット ① チケットには,公演開催明細ごとに,全ての座席番号と席種を設定する。 ② 未販売のチケットは,購入フラグをオフに,購入番号をNULLに設定する。 ③ チケットの購入を申し込まれたら,購入フラグをオンにする。購入が確定したら,購入番号を設定する。 2. チケットの購入 (1) チケットを購入するためには,会員登録をする必要がある。 (2) 会員は,チケットの検索を行って,チケット情報一覧を表示する。チケット情報は,公演名・公演日・開演時刻の昇順,料金の降順に出力される。 (3) 会員は,チケット情報一覧から,空席のある公演の席種を選択する。その後,枚数を指定し,空席の座席番号を希望枚数分指定する。 (4) 会員は,決済を行い,決済が成立すれば購入が確定する。 〔チケット情報一覧を出力するSQL文の設計〕 空席管理システムから,公演日が2020年4月かつ都道府県が東京のチケット情報一覧の出力の例を図3,出力するSQL文の構文を図4に示す。 図3 チケット情報一覧の出力の例 図4 チケット情報一覧を出力するSQL文の構文(未完成) 〔オンラインチケット販売処理の設計〕 チケット販売委託のため,空席管理システムは,プレイガイドなどの外部委託先にも公開する。このために,空席管理システムの空席確認,仮予約の処理の見直しを行った。見直しに当たって,同時実行されたトランザクションのやり直しが極力発生しないようにする方針とした。 ある会員が複数のチケットを購入することを想定して,チケットの販売処理について検討した。その概要を図5に示す。 図5では,会員の意思で購入を途中でキャンセルした場合,空席でない座席があり購入が失敗した場合,又はその他のエラーが発生した場合の,途中までの処理を取り消すための例外処理を省略している。 図5 チケットの販売処理の概要(未完成) 図5の内容のレビューを行った。レビューでの指摘内容と対策を表2に示す。 表2 指摘内容と対策(未完成) 〔レプリケーションの設計〕 チケット販売委託先に,空席管理システムを介して,空席情報を表示するサービスも提供する。そのため,データベースへの大量のアクセスによるロックの解放待ちの多発が見込まれるので,空席情報表示用のレプリケーション先のテーブル(以下,レプリカデータという)を作成することにした。レプリカデータのテーブル構造は,図1の空席管理システムの主なテーブルと同等なものとし,サービスの提供先ごとにレプリカデータを用意する。レプリカデータの運用について図6に示す。さらに,図6の内容のレビューを行った。レビューでの指摘内容と対策を表3に示す。 図6 レプリカデータの運用(未完成) 表3 指摘内容と対策(未完成) 表4 イベント型レプリケーション機能の設定内容(未完成) 設問1 〔チケット情報一覧を出力するSQL文の設計〕について,図4中の[a]~[g]に入れる適切な字句を答えよ。 設問2 〔オンラインチケット販売処理の設計〕について,(1),(2)に答えよ。 (1) 表2中の[あ]~[お]に入れる適切な字句を答えよ。 (2) 空席管理システムで実行するトランザクションのISOLATIONレベルはREAD COMMITTED(①)とREPEATABLE READ(②)のどちらを設定すべきか,①か②で答えよ。また,その理由を30字以内で述べよ。 設問3 〔レプリケーションの設計〕について,(1)~(3)に答えよ。 (1) 図6中の[ア]~[ウ]に入れる適切な字句を,本文中の字句を用いて答えよ。 (2) 表3中の[エ]に入れる文章を,1. に倣って30字以内で述べよ。 (3) イベント型レプリケーション機能の対象とするテーブルとその列を答えて,表4を完成させよ。 なお,表4の欄は全て埋まるとは限らない。
表1 トランザクションのISOLATIONレベルとその排他制御の内容。READ COMMITTEDとREPEATABLE READの2つのISOLATIONレベルについて、参照時の共有ロックと変更時の専有ロックをいつ掛け、いつ解放するかを示した表。
表1 トランザクションのISOLATIONレベルとその排他制御の内容。READ COMMITTEDとREPEATABLE READの2つのISOLATIONレベルについて、参照時の共有ロックと変更時の専有ロックをいつ掛け、いつ解放するかを示した表。
図1 空席管理システムの主なテーブルのテーブル構造(一部省略)。会場、座席、公演、公演開催明細、席種料金、席種在庫、座席状況の関係スキーマ。主キーは実線下線、公演会場番号は破線下線(外部キー)で示されている。
図1 空席管理システムの主なテーブルのテーブル構造(一部省略)。会場、座席、公演、公演開催明細、席種料金、席種在庫、座席状況の関係スキーマ。主キーは実線下線、公演会場番号は破線下線(外部キー)で示されている。
図2 販売管理システムの主なテーブルのテーブル構造(一部省略)。会員情報、購入、チケットの関係スキーマ。購入の会員番号・公演番号・公演日・開演時刻・席種と、チケットの購入番号は破線下線(外部キー)で示されている。
図2 販売管理システムの主なテーブルのテーブル構造(一部省略)。会員情報、購入、チケットの関係スキーマ。購入の会員番号・公演番号・公演日・開演時刻・席種と、チケットの購入番号は破線下線(外部キー)で示されている。
図3 チケット情報一覧の出力の例。公演名、公演日、開演時刻、開場時刻、会場名、都道府県、席種、料金、空席情報の列をもつ出力例の表。空席情報は○が空席あり、×が売切れを表すという注記付き。
図3 チケット情報一覧の出力の例。公演名、公演日、開演時刻、開場時刻、会場名、都道府県、席種、料金、空席情報の列をもつ出力例の表。空席情報は○が空席あり、×が売切れを表すという注記付き。
図4 チケット情報一覧を出力するSQL文の構文(未完成)。会場、公演・公演開催明細・席種料金の結合結果A1、空席数が0より大きい席種在庫A2を結合し、空席情報を導出して並べ替えるSELECT文。空欄a~gを含む。
図4 チケット情報一覧を出力するSQL文の構文(未完成)。会場、公演・公演開催明細・席種料金の結合結果A1、空席数が0より大きい席種在庫A2を結合し、空席情報を導出して並べ替えるSELECT文。空欄a~gを含む。
図5 チケットの販売処理の概要(未完成)。販売管理システムの処理①~⑧(トランザクション開始、購入番号確認、購入フラグ更新、仮予約依頼、決済、購入確定依頼、購入情報登録、コミット)と、空席管理システム側の対応処理を2列で示した表。
図5 チケットの販売処理の概要(未完成)。販売管理システムの処理①~⑧(トランザクション開始、購入番号確認、購入フラグ更新、仮予約依頼、決済、購入確定依頼、購入情報登録、コミット)と、空席管理システム側の対応処理を2列で示した表。
表2 指摘内容と対策(未完成)。複数の会員がほぼ同時に購入しようとした場合に排他制御で不便を強いる指摘と、②の処理をやめ、③の条件を追加して1座席ごとに処理する対策。空欄あ~おを含む。
表2 指摘内容と対策(未完成)。複数の会員がほぼ同時に購入しようとした場合に排他制御で不便を強いる指摘と、②の処理をやめ、③の条件を追加して1座席ごとに処理する対策。空欄あ~おを含む。
図6 レプリカデータの運用(未完成)。オリジナルのテーブルへのデータ登録と、バッチ型レプリケーションでレプリカデータへ一定間隔で反映する運用の説明。対象テーブルと使用する機能が空欄ア~ウになっている。
図6 レプリカデータの運用(未完成)。オリジナルのテーブルへのデータ登録と、バッチ型レプリケーションでレプリカデータへ一定間隔で反映する運用の説明。対象テーブルと使用する機能が空欄ア~ウになっている。
表3 指摘内容と対策(未完成)。レプリカデータにアクセスするタイミングによって空席情報の表示が不正になる場合がある(1.と空欄エ)という指摘と、イベント型レプリケーションを必要最低限の対象に適用する対策。
表3 指摘内容と対策(未完成)。レプリカデータにアクセスするタイミングによって空席情報の表示が不正になる場合がある(1.と空欄エ)という指摘と、イベント型レプリケーションを必要最低限の対象に適用する対策。
表4 イベント型レプリケーション機能の設定内容(未完成)。レプリケーション元テーブルとレプリケーション対象列の2列からなる表。データ行は4行あり、すべて空欄になっている。
表4 イベント型レプリケーション機能の設定内容(未完成)。レプリケーション元テーブルとレプリケーション対象列の2列からなる表。データ行は4行あり、すべて空欄になっている。
解き方のヒントを見る

業務要件から設計判断を逆算する

問題の記述から、業務上守るべき条件が何かを先に言葉にしてから設計判断を検討しましょう。SQL、排他制御、運用設計のいずれでも、判断の根拠を業務要件に結び付けて考えると、検討の筋道が整理しやすくなります。

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

確認すべき観点は一つ、『その設計判断はどの業務要件を満たすためのものか』です。問題の状況説明に書かれた条件や制約を拾い出し、各判断がそれとどう対応するかを自分の言葉で説明できるか確かめてください。

視点

データベースの設計や運用の判断では、一般にどの選択にも得るものと引き換えにするものがあり、どれが適切かは置かれた状況の条件によって決まります。そのため、まず状況説明に書かれた条件を整理し、判断に関わる条件とそうでない条件を分けることが検討の出発点になります。

確認ポイント

  • 状況説明の中から、業務上必ず守るべき条件や制約を抜き出して書き出したか
  • 検討している判断が、抜き出した条件のどれに対応するのかを説明できるか
  • 判断の根拠が、状況に書かれた業務要件ではなく一般論や思い込みに頼っていないか見直したか
正解と解説を見る

解説

劇場のチケット販売システムを題材にした問題です。空席情報を○×で表示するSQL(左外部結合とCASE式)、同じ座席を同時に購入しようとした場合の排他制御の見直し、仮予約の二重登録を防ぐISOLATIONレベルの選択、空席情報表示用レプリカデータの反映方式(バッチ型とイベント型)の使い分けを、RDBMS仕様と業務の記述から導きます。

問題の全体像

Y社は、空席管理システムと販売管理システムで構成されるチケット販売システムを刷新し、プレイガイドなどの外部委託先にも空席管理システムを公開します。設問1はチケット情報一覧を出力するSQL文、設問2は複数の会員が同時に購入する場合の排他制御とISOLATIONレベル、設問3は空席情報表示用のレプリカデータを作るレプリケーションの設計を扱います。公式解答例の出題趣旨では、同時に実行される要求が互いに影響して予期しない結果を生まないよう処理を設計することが重要だとしたうえで、SQLの設計能力、トランザクション制御と排他制御の理解、適切な同時実行性を満たす設計能力を問うとしています。採点講評では、全体の正答率はやや低かったとされています。

設問1(a)

図4のSELECT句は「( [a] A2.空席数 [b] THEN '×' ELSE '○' END) AS 空席情報」となっています。THEN、ELSE、ENDが並んでいるので、条件によって値を切り替えるCASE式の書き方だと分かります。最初の条件の前に置く字句なので、公式解答例は「CASE WHEN」です。採点講評では、aは正答率が低く、条件構文の理解に課題があったとされています。

設問1(b)

図3の注記によると、空席情報は○が空席あり、×が売切れです。A2は「空席数 > 0」の席種在庫だけを取り出した副問合せなので、売切れの席種はA2に対応する行がなく、外部結合によってA2.空席数がNULLになります(設問1(c)参照)。そのため、×を返す条件は「A2.空席数がNULLであること」になり、公式解答例は「IS NULL」です。NULLは「= NULL」では判定できない点に注意しましょう。

設問1(c)

図3では、売切れ(×)の席種も一覧に出ています。一方、A2は空席数が0より大きい行だけに絞り込まれています。内部結合にすると売切れの席種が一覧から消えてしまうため、A1の行をすべて残し、A2に対応する行がなければNULLを補う結合が必要です。結合列を「USING (公演番号、 公演日、 開演時刻、 席種)」で指定しているので、JOIN構文を使います。公式解答例は「LEFT [OUTER] JOIN」です。採点講評では、cも正答率が低く、結合構文に課題があったとされています。

設問1(d)

抽出条件は、公演日が2020年4月、つまり '2020-04-01' から '2020-04-30' までです。「公演日 [d] '2020-04-01' [e] '2020-04-30'」という形で範囲を指定できる述語なので、公式解答例は「BETWEEN」です。

設問1(e)

BETWEEN述語は「BETWEEN 下限 AND 上限」と書き、下限と上限をANDでつなぎます。公式解答例は「AND」です。

設問1(f)

業務概要2.(2)に「チケット情報は,公演名・公演日・開演時刻の昇順,料金の降順に出力される」とあります。図4の最後の行は並べ替えの指定なので、公式解答例は「ORDER BY」です。

設問1(g)

料金だけが降順です。公演名・公演日・開演時刻は何も指定しなければ昇順になるので、料金の後ろに降順の指定を付けます。公式解答例は「DESC」です。図3でも、同じ公演日・開演時刻の中で料金が高い順(S→A→B)に並んでいることを確認できます。

設問2(1)(あ)

表2の指摘は、ほぼ同時に購入しようとした複数の会員が、排他制御のために待たされるという問題です。ロックは行単位で掛かるので、互いに待ちが起きるのは同じ行、つまり同じチケット(座席)を対象にした場合です。公式解答例は「同じ座席」または「同じチケット」です。

設問2(1)(い)

図5では、③で購入フラグをオンにした行の専有ロックは、⑧のコミット(決済や購入確定の後)まで保持されます。専有ロックが掛かっている間は、他のトランザクションは対象行を参照することもできません。そのため、後から購入しようとした会員は、先の会員の処理が終わるまで待たされます。待ち終わった後に確認すると、その座席は先の会員が購入済みです。公式解答例は「購入できない」です。長く待たされたうえに購入できないことが分かる、という点が「会員に不便を強いる」内容です。

設問2(1)(う)

対策は、②の確認(SELECT文)をやめ、③のUPDATE文の条件に確認内容を含めることです。こうすると、空席の確認と購入中の設定を一つの更新でまとめて行えます。②で確認していたのは「購入番号がNULLであること」で、業務概要1.(4)②にも、未販売のチケットは購入番号をNULLにすると書かれています。したがって、更新条件に加えるのは購入番号についての条件で、公式解答例は「購入番号」です。

設問2(1)(え)

(う)と合わせると、更新条件は「購入番号がNULLである」ことになります。公式解答例は「NULL」です。条件に合う行、つまり未販売の行だけが更新されます。そのため、更新できたかどうかがそのまま「空席を確認し、購入中にできたか」の結果になります。

設問2(1)(お)

表2には、全ての対象座席を②~⑦でまとめて処理しているのを、ロックの期間を短くするために1座席ごとに処理して[お]するよう変更する、とあります。ロックはトランザクションが終わるまで解放されないので、1座席ごとにトランザクションを終わらせれば、ロックを持つ期間が短くなります。公式解答例は「コミット」です。

設問2(2)(ISOLATIONレベル)

公式解答例は「②」(REPEATABLE READ)です。表1によると、READ COMMITTEDは参照時の共有ロックを参照が終わった時点で解放します。REPEATABLE READは、その共有ロックをトランザクションが終わるまで保持します。図5の空席管理システムの(b)では、「空席フラグがオンか確認する」「仮予約フラグがオフか確認する」という参照の後に、「仮予約フラグをオンにする」という更新を行います。参照した内容が更新の時点まで変わらないことが前提になっている処理です。

設問2(2)(理由)

READ COMMITTEDでは、仮予約フラグがオフであることを確認した直後に共有ロックが外れます。そのため、同時に実行している別のトランザクションも同じ座席を「オフ」と確認でき、両方が仮予約フラグをオンにしてしまう(同じ座席を二重に仮予約する)おそれがあります。REPEATABLE READにすると、確認した行の共有ロックがトランザクションの終わりまで保持され、その間は他のトランザクションが対象行を変更できません。公式解答例の理由は「同時実行した他者が同じ座席を仮予約できないようにするため」で、30字以内に収まっています。答案では「同時実行する他者」「同じ座席」「仮予約できない(二重仮予約の防止)」の三つの要素を押さえます。採点講評では、ロックの解放待ち時間の短縮やデッドロックの回避を理由にした解答が見られ、(2)の理由は正答率が低かったとされています。性能の観点ではなく、処理結果が正しくなるかという観点から理由を書くことが求められています。

設問3(1)(ア)

図6には、空席確認や購入などのトランザクションを妨げないように、オリジナルをレプリケーション元、レプリカデータをレプリケーション先とする、とあります。空席情報を表示するために必要で、空席確認や購入の処理で更新されてロック待ちの原因になるのは、席種ごとの空席数を持つ「席種在庫」と、座席ごとの空席フラグ・仮予約フラグを持つ「座席状況」です。公式解答例では、ア・イは「席種在庫」「座席状況」で、順不同とされています。

設問3(1)(イ)

(ア)と組になる空欄です。公式解答例は、アが「席種在庫」、イが「座席状況」で、備考に順不同とあります。どちらを書いても、もう一方の空欄にはもう一つのテーブルを入れます。座席状況は、会員が空席の座席番号を指定する(業務概要2.(3))ために必要な、座席ごとの空席の状況を持つテーブルです。

設問3(1)(ウ)

本文には「サービスの提供先ごとにレプリカデータを用意する」とあり、一つのオリジナルから複数のレプリカデータへ反映することになります。RDBMS仕様2.(1)の三つの機能のうち、これに当たるのは「1か所のデータを複数か所に複製する機能」です。本文中の字句を使って答えるので、公式解答例は「1か所のデータを複数か所に複製」です。採点講評では、(1)ウは正答率が低く、レプリケーション機能の仕様と状況の記述から目的と必要な処理を読み取ってほしいとされています。

設問3(2)(エ)

図6ではバッチ型を使っています。RDBMS仕様2.(2)によると、バッチ型はトランザクションとは非同期に、一定間隔で反映します。そのため、反映されるまでの間は、オリジナルとレプリカデータの内容が一致しません。1.の「購入された座席が空席として表示される」は、空席が減った変更がまだ反映されていない場合です。逆の方向として、業務概要1.(3)①には、購入された座席がキャンセルされたら空席数を戻すとあります。空席が増えた変更がまだ反映されていないと、キャンセルされた座席が空席として表示されません。公式解答例は「キャンセルされた座席が空席として表示されない。」で、1.と同じ文の形で30字以内に収まっています。

設問3(3)

公式解答例では、表4は、レプリケーション元テーブルが座席状況で対象列が空席フラグの行と、レプリケーション元テーブルが席種在庫で対象列が空席数の行の2行です。残りの欄は空欄です。

【表3の対策欄に書かれていること】表3の対策欄に書かれているのは、「イベント型のレプリケーション機能を適用する」「対象とするテーブルとその列を表4のように設定する」「ただし、レプリケーションの性能への影響を抑えるため、対象は必要最低限のものとする」の三点だけです。対象を最小限にする理由として表3が挙げているのは、性能への影響を抑えることです。

【RDBMS仕様から推論できること】ここからは表3の記載ではなく、RDBMS仕様からの推論です。仕様2.(2)によると、イベント型はレプリケーション元のトランザクションと同期してデータを反映します。仕様2.(2)②によると、反映に失敗するとレプリケーション元の変更がロールバックされます。つまり、イベント型の対象が増えるほど、空席管理システムの本来のトランザクションに負担がかかると考えられます。また、仕様2.(3)の列の選択を使えば、必要な列だけを反映できます。

【対象列の絞り込み】表3で問題になっているのは、空席かどうかの表示のずれです。業務概要1.(3)によると、購入が確定すると空席数を減らして空席フラグをオフにし、キャンセルされると空席数を戻します。空席かどうかの表示に関わるのは、座席単位では座席状況の空席フラグ、席種単位では席種在庫の空席数です。この2列だけを同期して反映すれば、表3の1.と2.の両方のずれを防げます。表の欄が全部埋まるとは限らないという注記のとおり、公式解答例では必要最低限の2行だけが示されています。

学習のポイント

外部結合で生じるNULLの扱い、ISOLATIONレベルごとのロック保持期間の違い、更新条件で確認と更新を一度に行う手法、レプリケーション方式の特徴と対象の絞り方を、本文の仕様に結び付けて説明できるようにしておきましょう。

出典:独立行政法人 情報処理推進機構(IPA)令和2年度10月 データベーススペシャリスト試験 午後Ⅰ 問2(公式資料:問題冊子(PDF) / 解答例 / 採点講評)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針