応用情報技術者過去問題 令和2年秋期 午後問6
問6 データベース
宿泊施設の予約を行うシステムに関する次の記述を読んで,設問1〜3に答えよ。
U社は,旅館や民宿などの宿泊施設の宿泊予約を行うWebシステム(以下,予約システムという)を開発している。予約システムの主な要件を図1に示す。
〔データベースの設計〕
予約システムを開発するに当たり,データベースの設計を行った。データベースのE-R図を図2に示す。
このデータベースでは,E-R図のエンティティ名を表名にし,属性名を列名にして,適切なデータ型で表定義した関係データベースによって,データを管理する。部屋IDは,全施設を通して一意な値である。また,予約ID,予約明細IDは,レコードを挿入した順に値が大きくなる。
〔部屋の予約の流れ〕
部屋の予約は,部屋の空き状況の確認と,予約確定の二つの処理から成る。部屋を予約する際には,希望した施設,部屋の種別,チェックイン日付,チェックアウト日付,部屋数について,空き状況の照会を行う。照会の結果,部屋に空きがあった場合は,予約手続の画面を表示する。部屋に空きがなかった場合は,部屋が空いていない旨を画面に表示し,空き部屋照会のための条件入力の画面に戻って条件を変更するよう促す。
部屋の空き状況の確認を行うためのSQL文を図3に示す。予約する部屋の施設ID,部屋種別ID,チェックイン日付,チェックアウト日付及び部屋数は,埋込み変数":施設ID",":部屋種別ID",":チェックイン日付",":チェックアウト日付"及び":部屋数"に設定されている。
〔部屋の空き状況の確認の処理〕
予約システムは,図3のSQL文の検索結果として,レコードが返された場合に予約可能であると判定し,予約手続の画面を表示する。レコードが返されなかった場合は,部屋が空いていない旨を画面に表示する。空き状況確認の処理の流れを図4に示す。
〔予約確定の処理〕
予約手続の画面が表示された後,利用者は予約の確定の操作を行うことで部屋の予約を確定させる。予約の確定の処理では,予約のレコードを挿入した後,各宿泊日について,予約明細に必要な部屋数分のレコードを挿入する。
予約手続の画面が表示されてから,利用者が予約の確定の操作を行うまでの間に,他の利用者が先に予約を確定してしまうこともある。そこで,予約確定の処理では,レコードの挿入の前に図3のSQL文を再度実行し,まだ予約可能な状態であるかを確認してから挿入を行う。予約確定の処理の流れを図5に示す。
〔不具合の報告と対応〕
予約システムのテスト中に,同じ宿泊日の同じ部屋について,予約明細のレコードが重複して挿入されてしまう不具合が報告された。報告された事象について確認すると,別々の利用者が同じ時刻に予約確定の操作を行った際に発生していた。
そこで,今後同じ宿泊日の同じ部屋の予約が重複して入らないようにするために,予約明細テーブルのe列とf列の複合キーに対して制約を追加することにした。このような制約のことを,gという。
gを追加するためには,既に重複して挿入されてしまったレコードを削除する必要がある。削除に当たっては,同じ宿泊日の同じ部屋の予約が重複した予約明細のレコードについて,最初に挿入された予約のレコードと,それに紐づく予約明細のレコードを残し,それ以外の予約明細,予約のレコードを削除することにした。
予約明細について,削除するレコードを抽出するSQL文を図6に示す。図6で得られた該当の予約明細のレコードを削除するとともに,それらに紐づく予約のレコードを削除してから,テストの作業を再開することにした。
予約明細テーブルへの制約の追加後,当該の不具合について再度テストを行ったところ,追加した制約によって,重複が発生しなくなったことが確認できた。
U社は,旅館や民宿などの宿泊施設の宿泊予約を行うWebシステム(以下,予約システムという)を開発している。予約システムの主な要件を図1に示す。

予約システムを開発するに当たり,データベースの設計を行った。データベースのE-R図を図2に示す。

〔部屋の予約の流れ〕
部屋の予約は,部屋の空き状況の確認と,予約確定の二つの処理から成る。部屋を予約する際には,希望した施設,部屋の種別,チェックイン日付,チェックアウト日付,部屋数について,空き状況の照会を行う。照会の結果,部屋に空きがあった場合は,予約手続の画面を表示する。部屋に空きがなかった場合は,部屋が空いていない旨を画面に表示し,空き部屋照会のための条件入力の画面に戻って条件を変更するよう促す。
部屋の空き状況の確認を行うためのSQL文を図3に示す。予約する部屋の施設ID,部屋種別ID,チェックイン日付,チェックアウト日付及び部屋数は,埋込み変数":施設ID",":部屋種別ID",":チェックイン日付",":チェックアウト日付"及び":部屋数"に設定されている。

予約システムは,図3のSQL文の検索結果として,レコードが返された場合に予約可能であると判定し,予約手続の画面を表示する。レコードが返されなかった場合は,部屋が空いていない旨を画面に表示する。空き状況確認の処理の流れを図4に示す。

予約手続の画面が表示された後,利用者は予約の確定の操作を行うことで部屋の予約を確定させる。予約の確定の処理では,予約のレコードを挿入した後,各宿泊日について,予約明細に必要な部屋数分のレコードを挿入する。
予約手続の画面が表示されてから,利用者が予約の確定の操作を行うまでの間に,他の利用者が先に予約を確定してしまうこともある。そこで,予約確定の処理では,レコードの挿入の前に図3のSQL文を再度実行し,まだ予約可能な状態であるかを確認してから挿入を行う。予約確定の処理の流れを図5に示す。

予約システムのテスト中に,同じ宿泊日の同じ部屋について,予約明細のレコードが重複して挿入されてしまう不具合が報告された。報告された事象について確認すると,別々の利用者が同じ時刻に予約確定の操作を行った際に発生していた。
そこで,今後同じ宿泊日の同じ部屋の予約が重複して入らないようにするために,予約明細テーブルのe列とf列の複合キーに対して制約を追加することにした。このような制約のことを,gという。
gを追加するためには,既に重複して挿入されてしまったレコードを削除する必要がある。削除に当たっては,同じ宿泊日の同じ部屋の予約が重複した予約明細のレコードについて,最初に挿入された予約のレコードと,それに紐づく予約明細のレコードを残し,それ以外の予約明細,予約のレコードを削除することにした。
予約明細について,削除するレコードを抽出するSQL文を図6に示す。図6で得られた該当の予約明細のレコードを削除するとともに,それらに紐づく予約のレコードを削除してから,テストの作業を再開することにした。
予約明細テーブルへの制約の追加後,当該の不具合について再度テストを行ったところ,追加した制約によって,重複が発生しなくなったことが確認できた。

設問1
図2中のa,bに入れる適切なエンティティ間の関連及び属性名を答え,E-R図を完成させよ。
なお,エンティティ間の関連及び属性名の表記は,図2の凡例及び注記に倣うこと。(※正誤判定の都合上、主キー属性は(属性名)、外部キー属性は{属性名}と入力してください)
なお,エンティティ間の関連及び属性名の表記は,図2の凡例及び注記に倣うこと。(※正誤判定の都合上、主キー属性は(属性名)、外部キー属性は{属性名}と入力してください)
-解答入力欄-
- a:
- b:
-解答例・解答の要点-
- a:→
- b:施設ID
-解説-
この設問の解説はまだありません。
設問2
図3中のc,dに入れる適切な字句を答えよ。
-解答入力欄-
- c:
- d:
-解答例・解答の要点-
- c:NOT EXISTS
- d:HAVING COUNT(*)
-解説-
この設問の解説はまだありません。
設問3
〔不具合の報告と対応〕について,(1)〜(3)に答えよ。
- 本文中のe,fに入れる適切な列名を答えよ。
- 本文中のgに入れる適切な字句を答えよ。
- 図6中のh,jに入れる適切な字句を答えよ。
-解答入力欄-
- e:
- f:
- h:
- h:
- i:
- j:
-解答例・解答の要点-
- e:宿泊日
- f:部屋ID
- h:UNIQUE制約
- h:MIN(t2.予約ID)
- i:t1.部屋ID = t2.部屋ID
- j:t1.宿泊日 = t2.宿泊日
-解説-
この設問の解説はまだありません。
