応用情報技術者 2013年 秋期 午後 問05
レンタルビデオ管理システムに関する次の記述を読んで、設問1~4に答えよ。
W社は、会員に対してDVD及びブルーレイディスク(以下、レンタルビデオという)の貸出サービスを行う会社であり、貸し出すレンタルビデオを、レンタルビデオ管理システム(以下、管理システムという)を使用して管理している。
管理システムのE-R図を図1に示す。エンティティ名と属性名は、システム開発時に規定したデータベース命名規約(表1)に従っている。


管理システムの機能概要を表2に示す。
〔予約機能の追加〕
W社では、サービス向上のために、レンタルビデオの予約機能の追加開発を行うことにした。
予約機能を実現するために、図1のE-R図に、図2に示す貸出予約エンティティと、必要な関連を追加する。
予約機能の概要は、次のとおりである。
(1) 予約登録
会員が借りたいタイトルのレンタルビデオが、既に他の会員に貸し出されており、貸出可能なレンタルビデオがない場合に、予約登録を行うことができる。予約登録では、予約ステータスを“予約中”にし、予約日時(予約した時点の日時)を設定した貸出予約の情報を貸出予約エンティティに登録する。なお、予約は店舗に1台だけある予約専用端末から受け付ける。
(2) 取置き
返却されたレンタルビデオに貼り付けたバーコードを店員が読み取った時点で、そのレンタルビデオのタイトルに予約が入っている場合には、レンタルビデオマスタエンティティの貸出ステータスを“予約済”に変更する。その後、店員は、返却されたレンタルビデオを陳列棚に戻さないで取置き棚に格納する。
(3) 貸出可能連絡
店員が取置き棚からレンタルビデオを取り出して、レンタルビデオに貼り付けたバーコードを読み取ると、予約日時が最も早い予約者の連絡先が画面に表示される。店員がこの予約者に連絡できた場合には、予約貸出待ち棚に格納し、この予約者に連絡ができなかった場合には、取置き棚に戻す。
(4) 予約貸出し
会員が予約したタイトルのレンタルビデオを借りに来た際に、レンタルビデオマスタエンティティの貸出ステータスが“予約済”であるレンタルビデオが予約貸出待ち棚に一つ以上格納されていて、この会員がこのレンタルビデオのタイトルを予約している(貸出予約エンティティの予約ステータスが“予約中”である)場合に、貸出時の処理をする。予約したタイトルのレンタルビデオを貸し出したタイミングで、貸出予約エンティティの予約ステータスを“予約貸出完了”とする。
管理システムでは、E-R 図のエンティティ名をテーブル名、属性名を列名にして、適切なデータ型で表定義した関係データベースによって、データを管理する。
貸出可能連絡の際に、予約日時が最も早い予約者の連絡先を出力するためのSQL 文を図3に示す。ここで、“:予約タイトルID”は、バーコードで読み取ったレンタルビデオのタイトルIDを格納した埋込み変数である。

レンタルビデオの予約機能の運用テストを実施したところ、①予約者への貸出可能連絡時と予約貸出時に問題が発生することがあると分かった。
この問題を解決するために、貸出予約エンティティの予約ステータスの値に“貸出可能連絡済”を追加し、貸出可能連絡の際に連絡ができた場合、予約ステータスを
“貸出可能連絡済”に変更するようにした。これに合わせて、予約貸出しの手順も一部変更することにした。
W社はその後も運用テストを続け、更に幾つかの改善点を発見し、システムの修正を行った。その結果、運用テストを完了し、レンタルビデオの予約機能をリリースできた。
設問1:図1のE-R図について、(1)、(2)に答えよ。
(1)a〜cに入れる適切なエンティティ名又は属性名を答えよ。属性名が主キー又は外部キーの場合は、凡例に倣って下線を引くこと。
模範解答
a:レンタルビデオID
b:レンタルビデオID
c:貸出
解説
解答の論理構成
-
a はエンティティ “レンタルビデオマスタ” の主キー
- 表1‐属性名の規則に「マスタ系エンティティの主キーとなる属性は、エンティティ名から “マスタ” を取り除き、末尾に “ID” を追加」とあります。
- よって “レンタルビデオマスタ” → “レンタルビデオ”+“ID” = レンタルビデオID。
-
b はエンティティ “貸出明細” に存在する外部キー
- 表1‐属性名の規則に「外部キーとなる属性は、対応する主キーの属性の名前と同じ」とあります。
- 1対多の関連 “レンタルビデオマスタ ──> 貸出明細”(線上に d)に対応するので、外部キーも レンタルビデオID。
-
c は “貸出番号” を主キーにもつトランザクション系エンティティ
- 表2「レンタルビデオ貸出管理」の説明に「c エンティティに貸出番号、会員ID、貸出日を登録」とあります。
- 表1‐属性名の規則に「トランザクション系エンティティの主キーとなる属性は、エンティティ名の末尾に “番号” を追加」とあるため、主キー “貸出番号” からエンティティ名は “貸出”。
- よって c は 貸出。
誤りやすいポイント
- 主キー作成時に “マスタ” を除かず “レンタルビデオマスタID” としてしまう。
- トランザクション系でも “ID” を付けて “貸出ID” と誤記する。
- 外部キーの破線下線を忘れ、主キーと同じ実線下線で書いてしまう。
- “c” を “貸出情報” や “貸出ヘッダ” と補足語を付けてしまう(命名規約は10文字以内)。
FAQ
Q: “貸出明細” にも “貸出番号” があるがエンティティ “c” が別に必要ですか?
A: はい。貸出番号は “貸出” エンティティで1回の貸出を表し、“貸出明細” はその貸出に含まれる個々のディスクを表します。1対多で管理するためエンティティを分けます。
A: はい。貸出番号は “貸出” エンティティで1回の貸出を表し、“貸出明細” はその貸出に含まれる個々のディスクを表します。1対多で管理するためエンティティを分けます。
Q: 外部キーに破線下線を付けるのは必須ですか?
A: 図1の凡例に「属性名の破線下線は外部キーを示す」とあるので、本設問の解答欄でも破線下線で示す必要があります。
A: 図1の凡例に「属性名の破線下線は外部キーを示す」とあるので、本設問の解答欄でも破線下線で示す必要があります。
Q: “レンタルビデオID” は複合キーにすべきでは?
A: レンタルビデオ1本に一意のIDを付与する設計方針のため、単一キーで問題ありません。タイトルID+シリアル等の複合キーも設計可能ですが、本問題の命名規約は単一IDを想定しています。
A: レンタルビデオ1本に一意のIDを付与する設計方針のため、単一キーで問題ありません。タイトルID+シリアル等の複合キーも設計可能ですが、本問題の命名規約は単一IDを想定しています。
関連キーワード: 主キー、外部キー、ER図、命名規約、トランザクション
設問1:図1のE-R図について、(1)、(2)に答えよ。
(2)d、eに入れる適切なエンティティ間の関連を答えよ。
模範解答
d:→
e:←
解説
解答の論理構成
-
外部キー規約の確認
表1には「外部キーとなる属性は、対応する主キーの属性の名前と同じとする。」とあります。
したがって、あるエンティティに他エンティティの主キーと同名の列が存在すれば、そこには“参照される側(1)”と“参照する側(多)”の関係が成立します。 -
d(レンタルビデオマスタと貸出明細)の判定
• 機能概要には「貸出時には、レンタルビデオマスタエンティティの貸出ステータスを“貸出中”に変更し、…貸出明細エンティティに貸出情報を登録する。」と記述されています。
• 一つのレンタルビデオは貸出と返却を繰り返すため、貸出明細に複数行が蓄積される一方、貸出明細は必ず1本のレンタルビデオに紐付きます。
• よって関係は「レンタルビデオマスタ(1)→貸出明細(多)」となり、d は “→” です。 -
e(貸出明細と c エンティティ)の判定
• 機能概要の同一段落に「cエンティティに貸出番号、会員ID、貸出日を登録するとともに、貸出明細エンティティに貸出情報を登録する。」とあります。
• “貸出番号”が c の主キー、同名列が貸出明細側にも存在することから、1回の貸出処理(=1つの貸出番号)に対して複数の明細行が発生する仕組みです。
• 従って関係は「c(1)→貸出明細(多)」ですが、図中では矢印が左向きに描かれるため e は “←” となります。
誤りやすいポイント
- 「外部キーがある側が“多”」を見落として逆方向に矢印を書いてしまう。
- d と e をどちらも同じ向きにしてしまい、レンタルビデオと貸出の粒度差を混同する。
- 図全体のスペース配置を見て方向を決めてしまい、論理(1対多)を後回しにする。
FAQ
Q: “貸出明細”はなぜレンタルビデオと c の両方を外部キーに持つのですか?
A: 1本のディスクがいつ・誰に・いくらで貸し出されたかという履歴を詳細に残すためです。レンタルビデオを特定する列と、貸出トランザクションを特定する列の両方が必要になります。
A: 1本のディスクがいつ・誰に・いくらで貸し出されたかという履歴を詳細に残すためです。レンタルビデオを特定する列と、貸出トランザクションを特定する列の両方が必要になります。
Q: “多対多”の関係に見えるのですが?
A: 実際の物理設計では “多対多” は中間テーブルで 1対多 × 1対多 に分解されます。本問の「貸出明細」がその中間役であり、結果として二つの 1対多 が成立しています。
A: 実際の物理設計では “多対多” は中間テーブルで 1対多 × 1対多 に分解されます。本問の「貸出明細」がその中間役であり、結果として二つの 1対多 が成立しています。
Q: 矢印の向きはツールや流派で変わりますか?
A: モデリングツールにより表記は異なりますが、試験では「→ が 1 から多側」を暗黙のルールとしています。問題文中の他の矢印を手掛かりに統一してください。
A: モデリングツールにより表記は異なりますが、試験では「→ が 1 から多側」を暗黙のルールとしています。問題文中の他の矢印を手掛かりに統一してください。
関連キーワード: 主キー、外部キー、1対多、エンティティ関係、履歴管理
設問2:
図2中のfに入れる適切な属性名を答えよ。属性名が主キー又は外部キーの場合は、図1の凡例に倣って下線を引くこと。
模範解答
f:タイトルID
解説
解答の論理構成
- 【問題文】では、予約機能を実現するために「貸出予約エンティティ」を追加すると述べています。そのエンティティには「会員ID」が外部キーとして示されており、もう一つの外部キーが未決定でした。
- 予約は “会員が借りたいタイトル” を対象に行うため、予約レコードにはどのタイトルに対する予約かを示す列が必須です。
- タイトルを識別する主キーは、図1の「タイトルマスタ」エンティティ内の「タイトルID」であると示されています。
- 表1の命名規約には「外部キーとなる属性は、対応する主キーの属性の名前と同じとする。」と明記されています。
- したがって、貸出予約エンティティの外部キー名も主キーと同じ「タイトルID」となります。
- 外部キーであることを示すため、図1の凡例に倣い “破線下線” を付与します。
結論:
貸出予約エンティティの f に入る適切な属性名は
タイトルID です。
貸出予約エンティティの f に入る適切な属性名は
タイトルID です。
誤りやすいポイント
- 「レンタルビデオID」と解答してしまう
→ 予約は個別のディスク(物理媒体)ではなく “タイトル” 単位で受け付けるため誤りです。 - 命名規約を無視して「タイトルコード」など別名を付ける
→ 外部キーは主キーと同じ名前を使う規約に反します。 - 外部キーであることを示す破線下線を忘れる
→ 受験生が記法ミスで減点されやすい典型例です。
FAQ
Q: 予約時に物理メディアを特定しないのはなぜですか?
A: 同一タイトルのディスクが複数本存在するため、返却されたどのディスクでも予約者に充当できるようタイトル単位で管理する設計です。
A: 同一タイトルのディスクが複数本存在するため、返却されたどのディスクでも予約者に充当できるようタイトル単位で管理する設計です。
Q: 外部キーに破線下線を付けるルールは必須ですか?
A: 本試験の図記法では「主キーは実線下線」「外部キーは破線下線」と示されているため、答案でも同じ規約を厳守する必要があります。
A: 本試験の図記法では「主キーは実線下線」「外部キーは破線下線」と示されているため、答案でも同じ規約を厳守する必要があります。
Q: 「貸出予約番号」は主キーですが複合キーではないのですか?
A: 運用上、一意な連番で管理できるため単一属性の主キーになっています。主キーが複合になるケースとの混同に注意してください。
A: 運用上、一意な連番で管理できるため単一属性の主キーになっています。主キーが複合になるケースとの混同に注意してください。
関連キーワード: E-R図、外部キー、リレーショナル設計、命名規約、予約管理
設問3:
図3中のg〜iに入れる適切な字句を答えよ。列名は、テーブル名を省略せずに、“テーブル名.列名”と記述すること。
模範解答
g:タイトルマスタ.タイトルID = 貸出予約.タイトルID
h:MIN(貸出予約.予約日時)
i:貸出予約.タイトルID =:予約タイトルID
解説
解答の論理構成
- 連結条件 g
問題文では「タイトルマスタ」と「貸出予約」の両テーブルを INNER JOIN していると記載されています。INNER JOIN では“互いの主キー/外部キーが一致する列”を指定しなければ正しい結合になりません。予約情報には「タイトルID」が保存され、タイトル情報にも同じ列が存在するため
sql
タイトルマスタ.タイトルID = 貸出予約.タイトルID
が唯一適切です。これが g の解答です。
- 集計列 h
目的は「予約日時が最も早い予約者」を求めることです。問題文中に
「予約日時が最も早い予約者の連絡先を出力するためのSQL 文」
と明記されているので、日付の最小値を取得する MIN 集約関数を用います。また列は「貸出予約.予約日時」なので
sql
MIN(貸出予約.予約日時)
が h となります。
- サブクエリの抽出条件 i
サブクエリ側では「検索対象タイトル」と「予約ステータス='予約中'」で絞り込み、その中で最小の予約日時を選定しています。タイトルの一致を示す列は「貸出予約.タイトルID」です。問題文で「“:予約タイトルID”はバーコードで読み取ったレンタルビデオのタイトルIDを格納した埋込み変数」と説明されているため、比較式は
sql
貸出予約.タイトルID = :予約タイトルID
となり、これが i の答えです。
以上より
g:タイトルマスタ.タイトルID = 貸出予約.タイトルID
h:MIN(貸出予約.予約日時)
i:貸出予約.タイトルID = :予約タイトルID
g:タイトルマスタ.タイトルID = 貸出予約.タイトルID
h:MIN(貸出予約.予約日時)
i:貸出予約.タイトルID = :予約タイトルID
誤りやすいポイント
- 結合条件を「タイトル名」で書いてしまう
タイトルは重複する可能性があるため主キーである「タイトルID」を使う必要があります。 - 集約関数で MIN(*) や FIRST を選択してしまう
SQL 標準で日時の最小値を取る関数は MIN です。FIRST は RDBMS 依存の擬似関数で誤りになります。 - サブクエリ側で 貸出予約.予約ステータス = '予約中' を書き忘れる
ステータス条件を漏らすと「既に連絡が完了した予約」まで候補に含まれてしまい、仕様を満たせません。
FAQ
Q: INNER JOIN と WHERE の結合条件、どちらで書いても同じですか?
A: 機能的には同じですが、読みやすさと誤表記防止のため結合は ON 節にまとめるのが推奨です。
A: 機能的には同じですが、読みやすさと誤表記防止のため結合は ON 節にまとめるのが推奨です。
Q: MIN(予約日時) を使用しただけで「最も早い予約者」が一意に決まらない場合は?
A: 同時刻予約が存在する場合、さらに 予約番号 などで ORDER し、LIMIT 1 または ROWNUM=1 を組み合わせる方法があります。
A: 同時刻予約が存在する場合、さらに 予約番号 などで ORDER し、LIMIT 1 または ROWNUM=1 を組み合わせる方法があります。
Q: 予約ステータスに“貸出可能連絡済”を追加した後のSQLは変更が必要ですか?
A: 連絡後にステータスが更新されるため、WHERE 句のステータス条件を '予約中' から '貸出可能連絡済' へ変更、または両方を対象にする必要があります。
A: 連絡後にステータスが更新されるため、WHERE 句のステータス条件を '予約中' から '貸出可能連絡済' へ変更、または両方を対象にする必要があります。
関連キーワード: INNER JOIN, 集約関数、サブクエリ、外部キー、主キー
設問4:本文中の下線①について、(1)、(2)に答えよ。
(1)貸出可能連絡時に発生することがあるシステム上の問題は何か。40字以内で述べよ。
模範解答
同じタイトルが返却される度に、連絡先として連絡済の会員が出力される。
解説
解答の論理構成
- 【問題文】では、貸出可能連絡時に表示する予約者を
「予約日時が最も早い予約者の連絡先が画面に表示される。」と定義しています。 - その SQL は WHERE 句で
貸出予約.予約ステータス = '予約中'
を条件にしているため、抽出対象は “予約中” のレコードだけです。 - 一方、連絡後も予約ステータスを変更する仕様はなく、【問題文】には
「店員がこの予約者に連絡できた場合には、予約貸出待ち棚に格納」
とあるだけで、状態遷移が示されていません。 - その結果、同じタイトルを再度スキャンすると、連絡済であっても依然 “予約中” のままなので、 先ほどと同じレコードが再び最小予約日時として抽出されます。
- 以上より「同じタイトルが返却される度に、連絡先として連絡済の会員が出力される」という問題が発生します。
誤りやすいポイント
- 予約ステータスが変わらないことに気付かず、「連絡後は自動で除外される」と思い込む。
- SQL の = '予約中' がフィルタ条件であることを見落とし、最小予約日時だけに注目してしまう。
- 取置き棚や予約貸出待ち棚の物理的運用に気を取られ、データ更新の欠落を意識しない。
FAQ
Q: なぜ “貸出可能連絡済” を追加すると問題が解消するのですか?
A: 連絡後にステータスを “貸出可能連絡済” に更新すれば、WHERE 貸出予約.予約ステータス = '予約中' に該当しなくなり、次回検索で同一会員が除外されるためです。
A: 連絡後にステータスを “貸出可能連絡済” に更新すれば、WHERE 貸出予約.予約ステータス = '予約中' に該当しなくなり、次回検索で同一会員が除外されるためです。
Q: 予約者が来店せず有効期限が切れた場合はどう扱いますか?
A: 有効期限切れ処理で “予約キャンセル” など別ステータスに更新し、やはり '予約中' から除外するのが一般的です。
A: 有効期限切れ処理で “予約キャンセル” など別ステータスに更新し、やはり '予約中' から除外するのが一般的です。
関連キーワード: ステータス管理、サブクエリ、最小値抽出、一貫性、状態遷移
設問4:本文中の下線①について、(1)、(2)に答えよ。
(2)予約貸出時に発生することがある運用上の問題は何か。40字以内で述べよ。
模範解答
予約はしているが、連絡をもらっていない会員に対して貸出をしてしまう。
解説
解答の論理構成
-
問題の前提
本文には「①予約者への貸出可能連絡時と予約貸出時に問題が発生することがある」とあります。この“問題”を特定するのが問われています。 -
予約後の連絡手順
予約ビデオが返却されたら、(3) 貸出可能連絡で「予約日時が最も早い予約者の連絡先が画面に表示される。店員がこの予約者に連絡できた場合には、予約貸出待ち棚に格納」します。ここでは連絡できたか否かだけを扱い、予約ステータスは依然として“予約中”のままです。 -
予約貸出しの判定条件
(4) 予約貸出しでは「この会員がこのレンタルビデオのタイトルを予約している(貸出予約エンティティの予約ステータスが“予約中”である)場合」に貸出処理を行います。つまり“連絡済みかどうか”は判定に使われていません。 -
発生し得る事象
そこで、連絡を受けた会員Aが来店する前に、同じタイトルを予約していた会員Bが来店すると、Bも“予約中”なので貸出要件を満たしてしまいます。結果として、Aは連絡を受けたのに借りられず、Bは連絡を受けていないのに借りられる――これが運用上の問題です。 -
模範解答との一致
よって模範解答「予約はしているが、連絡をもらっていない会員に対して貸出をしてしまう。」が導かれます。
誤りやすいポイント
- 「最も早い予約者」に限定するのは連絡時だけで、貸出時の条件と混同しやすい。
- 連絡可否に応じて棚を変更する動きに注目が集まり、予約ステータスが更新されていない事実を見落としやすい。
- 「貸出ステータスが“予約済”」と「予約ステータスが“予約中”」の二つのステータスを混同しがち。
FAQ
Q: なぜ“連絡済”のフラグを追加するだけで問題が解消するのですか?
A: 連絡できた予約に“貸出可能連絡済”を付ければ、貸出判定時にそのフラグを条件に加えることで未連絡者を除外できるためです。
A: 連絡できた予約に“貸出可能連絡済”を付ければ、貸出判定時にそのフラグを条件に加えることで未連絡者を除外できるためです。
Q: 予約日時の最小値を求めるサブクエリだけで十分ではないのですか?
A: サブクエリはあくまで連絡時の抽出用であり、貸出時には用いられていません。貸出判定ロジックそのものを変えない限り、未連絡者でも貸出対象になってしまいます。
A: サブクエリはあくまで連絡時の抽出用であり、貸出時には用いられていません。貸出判定ロジックそのものを変えない限り、未連絡者でも貸出対象になってしまいます。
Q: 排他制御を導入すれば同時来店は防げるのでは?
A: 排他制御は同時更新の競合を防ぐもので、来店順序による業務ルールの選択を自動で補完するものではありません。業務ルールを正しく反映したステータス管理が先決です。
A: 排他制御は同時更新の競合を防ぐもので、来店順序による業務ルールの選択を自動で補完するものではありません。業務ルールを正しく反映したステータス管理が先決です。
関連キーワード: 予約ステータス、排他制御、ステータスマネジメント、外部キー、SQLサブクエリ


