応用情報技術者過去問題 平成25年秋期 午後問5
⇄問題文と設問を画面2分割で開く⇱問題PDF問5 データベース
レンタルビデオ管理システムに関する次の記述を読んで,設問1~4に答えよ。
W社は,会員に対してDVD及びブルーレイディスク(以下,レンタルビデオという)の貸出サービスを行う会社であり,貸し出すレンタルビデオを,レンタルビデオ管理システム(以下,管理システムという)を使用して管理している。
管理システムのE-R図を図1に示す。エンティティ名と属性名は,システム開発時に規定したデータベース命名規約(表1)に従っている。 管理システムの機能概要を表2に示す。〔予約機能の追加〕
W社では,サービス向上のために,レンタルビデオの予約機能の追加開発を行うことにした。
予約機能を実現するために,図1のE-R図に,図2に示す貸出予約エンティティと,必要な関連を追加する。 予約機能の概要は,次のとおりである。
管理システムでは,E-R図のエンティティ名をテーブル名,属性名を列名にして,適切なデータ型で表定義した関係データベースによって,データを管理する。
貸出可能連絡の際に,予約日時が最も早い予約者の連絡先を出力するためのSQL文を図3に示す。ここで,":予約タイトルID"は,バーコードで読み取ったレンタルビデオのタイトルIDを格納した埋込み変数である。 レンタルビデオの予約機能の運用テストを実施したところ,①予約者への貸出可能連絡時と予約貸出時に問題が発生することがあると分かった。
この問題を解決するために,貸出予約エンティティの予約ステータスの値に"貸出可能連絡済"を追加し,貸出可能連絡の際に連絡ができた場合,予約ステータスを"貸出可能連絡済"に変更するようにした。これに合わせて,予約貸出しの手順も一部変更することにした。
W社はその後も運用テストを続け,更に幾つかの改善点を発見し,システムの修正を行った。その結果,運用テストを完了し,レンタルビデオの予約機能をリリースできた。
W社は,会員に対してDVD及びブルーレイディスク(以下,レンタルビデオという)の貸出サービスを行う会社であり,貸し出すレンタルビデオを,レンタルビデオ管理システム(以下,管理システムという)を使用して管理している。
管理システムのE-R図を図1に示す。エンティティ名と属性名は,システム開発時に規定したデータベース命名規約(表1)に従っている。 管理システムの機能概要を表2に示す。〔予約機能の追加〕
W社では,サービス向上のために,レンタルビデオの予約機能の追加開発を行うことにした。
予約機能を実現するために,図1のE-R図に,図2に示す貸出予約エンティティと,必要な関連を追加する。 予約機能の概要は,次のとおりである。
- 予約登録
会員が借りたいタイトルのレンタルビデオが,既に他の会員に貸し出されており,貸出可能なレンタルビデオがない場合に,予約登録を行うことができる。予約登録では,予約ステータスを"予約中"にし,予約日時(予約した時点の日時)を設定した貸出予約の情報を貸出予約エンティティに登録する。なお,予約は店舗に1台だけある予約専用端末から受け付ける。 - 取置き
返却されたレンタルビデオに貼り付けたバーコードを店員が読み取った時点で,そのレンタルビデオのタイトルに予約が入っている場合には,レンタルビデオマスタエンティティの貸出ステータスを"予約済"に変更する。その後,店員は,返却されたレンタルビデオを陳列棚に戻さないで取置き棚に格納する。 - 貸出可能連絡
店員が取置き棚からレンタルビデオを取り出して,レンタルビデオに貼り付けたバーコードを読み取ると,予約日時が最も早い予約者の連絡先が画面に表示される。店員がこの予約者に連絡できた場合には,予約貸出待ち棚に格納し,この予約者に連絡ができなかった場合には,取置き棚に戻す。 - 予約貸出し
会員が予約したタイトルのレンタルビデオを借りに来た際に,レンタルビデオマスタエンティティの貸出ステータスが"予約済"であるレンタルビデオが予約貸出待ち棚に一つ以上格納されていて,この会員がこのレンタルビデオのタイトルを予約している(貸出予約エンティティの予約ステータスが"予約中"である)場合に,貸出時の処理をする。予約したタイトルのレンタルビデオを貸し出したタイミングで,貸出予約エンティティの予約ステータスを"予約貸出完了"とする。
管理システムでは,E-R図のエンティティ名をテーブル名,属性名を列名にして,適切なデータ型で表定義した関係データベースによって,データを管理する。
貸出可能連絡の際に,予約日時が最も早い予約者の連絡先を出力するためのSQL文を図3に示す。ここで,":予約タイトルID"は,バーコードで読み取ったレンタルビデオのタイトルIDを格納した埋込み変数である。 レンタルビデオの予約機能の運用テストを実施したところ,①予約者への貸出可能連絡時と予約貸出時に問題が発生することがあると分かった。
この問題を解決するために,貸出予約エンティティの予約ステータスの値に"貸出可能連絡済"を追加し,貸出可能連絡の際に連絡ができた場合,予約ステータスを"貸出可能連絡済"に変更するようにした。これに合わせて,予約貸出しの手順も一部変更することにした。
W社はその後も運用テストを続け,更に幾つかの改善点を発見し,システムの修正を行った。その結果,運用テストを完了し,レンタルビデオの予約機能をリリースできた。
設問1
図1のE-R図について,(1),(2)に答えよ。
- a~cに入れる適切なエンティティ名又は属性名を答えよ。属性名が主キー又は外部キーの場合は,凡例に倣って下線を引くこと。
(※正誤判定の都合上、主キー属性は{属性名}、外部キー属性は(属性名)と入力してください) - d,eに入れる適切なエンティテイ間の関連を答えよ。
解答入力欄
- a:
- b:
- c:
- d:
- e:
解答例・解答の要点
- a:レンタルビデオID
- b:レンタルビデオID
- c:貸出
- d:→
- e:←
解説
- 〔aについて〕
レンタルビデオマスタエンティティには、主キーがないため追加する必要があります。表1には、属性名の命名規則は「マスタ系エンティティの主キーとなる属性は,エンティティ名から"マスタ"という文字列を取り除き,末尾に"ID"という文字列を追加したものとする」とあります。したがって、レンタルビデオマスタエンティティの主キーは「レンタルビデオマスタ」の末尾の"マスタ"を取り除き、末尾に"ID"を付与した「レンタルビデオID」です。
∴a=レンタルビデオID
〔bについて〕
レンタルビデオマスタエンティティと貸出明細エンティティの間には関連があります。エンティティ同士は同じ主キーと外部キーを持たせることによって関連付けますが、貸出明細エンティティには、レンタルビデオマスタエンティティと共通する属性が含まれていません。よって、レンタルビデオマスタエンティティの主キーを表す属性が、貸出明細エンティティでの外部キーとして必要であることがわかります。したがって、空欄には「レンタルビデオID」が当てはまります。
∴b=レンタルビデオID
〔cについて〕
表1の属性名の命名規則には「トランザクション系エンティティの主キーとなる属性は,エンティティ名の末尾に"番号"という文字列を追加したものとする」とあります。レンタルビデオの貸出記録はそのイベントがある度に生成されるトランザクション系エンティティですから、主キーである「貸出番号」から末尾の"番号"を取り除いた「貸出」が空欄に入るエンティティ名となります。
∴c=貸出
※マスタ系エンティティは"リソース系エンティティ"、トランザクション系エンティティは"イベント系エンティティ"とも呼ばれます。 - 〔dについて〕
レンタルビデオマスタエンティティと貸出明細エンティティには共通の属性「レンタルビデオID」があります。この属性「レンタルビデオID」は、レンタルビデオエンティティ側では主キーであり、レンタルビデオを一意に特定します。また、貸出明細エンティティ側では外部キーであり、同一のレンタルビデオが複数回貸し出されることが想定されています。つまり、同一のレンタルビデオIDをもつ複数のレコードが存在しえるということです。したがって、レンタルビデオマスタエンティティと貸出明細エンティティのカーディナリティは1対多であり、空欄には「→」が当てはまります。
∴d=→
〔eについて〕
貸出エンティティと貸出明細エンティティの関連について考えると、貸出番号にはある日にある会員に貸出を行ったという情報が、貸出明細番号にはその際に具体的に貸し出したレンタルビデオの情報が紐づくと考えられます。もちろん、同じ日に同じ会員に複数のレンタルビデオの貸出を行うことができると考えるのが自然です。よって、dと同様に貸出明細エンティティと貸出エンティティのカーディナリティは多対1です。したがって、空欄には「←」が当てはまります。
※貸出明細エンティティの「貸出番号」は下線のみですが、主キーであり貸出エンティティの「貸出番号」を参照する外部キーでもある属性です。
∴e=←
関係データベースの理論上、主キー属性と外部キー属性の関連があるとき、主キー側エンティティが"1"、外部キー側エンティティが"多"になるので、常に主キー側から外部キー側に向けた矢印となります。E-R図を見て機械的に判断してしまってもいいでしょう。
設問2
図2中のfに入れる適切な属性名を答えよ。属性名が主キー又は外部キーの場合は,図1の凡例に倣って下線を引くこと。
(※正誤判定の都合上、主キー属性は{属性名}、外部キー属性は(属性名)と入力してください)
(※正誤判定の都合上、主キー属性は{属性名}、外部キー属性は(属性名)と入力してください)
解答入力欄
- f:
解答例・解答の要点
- f:タイトルID
解説
〔fについて〕
〔予約機能の追加〕(4)には「会員が予約したタイトルのレンタルビデオ」「会員がこのレンタルビデオのタイトルを予約している」などとあります。表2のタイトル管理欄には、「一つのタイトルに対して,貸出可能なレンタルビデオは1本以上ある」と説明されていて、2本以上ある場合にはそのうちどれを貸し出しても同等ですから、顧客は個々のレンタルビデオではなくタイトルを指定して予約することになります。
したがって、貸出予約エンティティにはタイトルを表す属性が必要です。タイトルを管理するエンティティはタイトルマスタエンティティであり、その主キー「タイトルID」によりタイトルを一意に特定することができます。したがって、空欄にはタイトルマスタエンティティの主キーを参照する外部キー「タイトルID」が当てはまります。
∴f=タイトルID
〔予約機能の追加〕(4)には「会員が予約したタイトルのレンタルビデオ」「会員がこのレンタルビデオのタイトルを予約している」などとあります。表2のタイトル管理欄には、「一つのタイトルに対して,貸出可能なレンタルビデオは1本以上ある」と説明されていて、2本以上ある場合にはそのうちどれを貸し出しても同等ですから、顧客は個々のレンタルビデオではなくタイトルを指定して予約することになります。
したがって、貸出予約エンティティにはタイトルを表す属性が必要です。タイトルを管理するエンティティはタイトルマスタエンティティであり、その主キー「タイトルID」によりタイトルを一意に特定することができます。したがって、空欄にはタイトルマスタエンティティの主キーを参照する外部キー「タイトルID」が当てはまります。
∴f=タイトルID
設問3
図3中のg~iに入れる適切な字句を答えよ。列名は,テーブル名を省略せずに,"テーブル名.列名"と記述すること。
解答入力欄
- g:
- h:
- i:
解答例・解答の要点
- g:タイトルマスタ.タイトルID = 貸出予約.タイトルID
- h:MIN(貸出予約.予約日時)
- i:貸出予約.タイトルID = :予約タイトルID
解説
〔gについて〕
JOIN句の"ON"では、表同士の結合条件を指定します。
[g]までにFROM句内で登場している表はタイトルマスタと貸出予約のみであるので、これらの表の主キーと外部キーを結合すればよいことがわかります。タイトルマスタ表と貸出予約表の共通の列は「タイトルID」です。したがって、空欄には「タイトルマスタ.タイトルID = 貸出予約.タイトルID」が当てはまります。
∴g=タイトルマスタ.タイトルID = 貸出予約.タイトルID
〔hについて〕
"="の直後に副問合せが記述されています。このように記述できるのは副問合せの結果が単一値の(1行1列となる)場合のみです。また、このSQL文は予約日時が最も早い予約者を検索するものであるため、集約関数 MIN() を用いて値が最も小さい(古い)予約日時を求めればよいと考えられます。したがって、空欄には「MIN(貸出予約.予約日時)」が当てはまります。
∴h=MIN(貸出予約.予約日時)
〔iについて〕
貸出予約表から検索対象のタイトルに入っている最も早い予約日時を取得したいので、貸出予約表のレコードを検索対象のタイトルで絞り込まなければなりません。今検索しようとしているタイトルは、バーコードで読み取ったレンタルビデオのタイトルIDとして埋め込み変数":予約タイトルID"に格納されています。したがって、空欄には「貸出予約.タイトルID = :予約タイトルID」が当てはまります。
∴i=貸出予約.タイトルID = :予約タイトルID
JOIN句の"ON"では、表同士の結合条件を指定します。
[g]までにFROM句内で登場している表はタイトルマスタと貸出予約のみであるので、これらの表の主キーと外部キーを結合すればよいことがわかります。タイトルマスタ表と貸出予約表の共通の列は「タイトルID」です。したがって、空欄には「タイトルマスタ.タイトルID = 貸出予約.タイトルID」が当てはまります。
∴g=タイトルマスタ.タイトルID = 貸出予約.タイトルID
〔hについて〕
"="の直後に副問合せが記述されています。このように記述できるのは副問合せの結果が単一値の(1行1列となる)場合のみです。また、このSQL文は予約日時が最も早い予約者を検索するものであるため、集約関数 MIN() を用いて値が最も小さい(古い)予約日時を求めればよいと考えられます。したがって、空欄には「MIN(貸出予約.予約日時)」が当てはまります。
∴h=MIN(貸出予約.予約日時)
〔iについて〕
貸出予約表から検索対象のタイトルに入っている最も早い予約日時を取得したいので、貸出予約表のレコードを検索対象のタイトルで絞り込まなければなりません。今検索しようとしているタイトルは、バーコードで読み取ったレンタルビデオのタイトルIDとして埋め込み変数":予約タイトルID"に格納されています。したがって、空欄には「貸出予約.タイトルID = :予約タイトルID」が当てはまります。
∴i=貸出予約.タイトルID = :予約タイトルID
設問4
本文中の下線①について,(1),(2)に答えよ。
- 貸出可能連絡時に発生することがあるシステム上の問題は何か。40字以内で述べよ。
- 予約貸出時に発生することがある運用上の問題は何か。40字以内で述べよ。
解答入力欄
解答例・解答の要点
- 同じタイトルが返却される度に,連絡先として連絡済みの会員が出力される (34文字)
- 予約はしているが,連絡をもらっていない会員に対して貸出しをしてしまう (34文字)
解説
- 本文中ではこの問題に対する解決策として、予約ステータスに"貸出可能連絡済"を追加しているので、"貸出可能連絡済"がないと貸出可能連絡時にどのような問題が発生するかを考えます。
貸出可能連絡では、図3のSQL文により出力される予約日時が最も早い予約者に連絡を行います。連絡できたときに予約ステータスを"貸出可能連絡済"にしないのであれば、予約ステータスは"予約中"のままとなります。この状態で、同一タイトルのビデオが返された際に連絡者(別の会員)を探そうとSQLを実行しても、単純に"予約中"で予約日時が最も早いという条件で絞り込むので、既に連絡を行ったかどうかは加味されず、以前に連絡済の会員が出力されることとなります。
したがって、貸出可能連絡時に発生することがあるシステム上の問題は「同じタイトルが返却される度に,連絡先として連絡済みの会員が出力される」などです。
∴同じタイトルが返却される度に,連絡先として連絡済みの会員が出力される
※一定期間連絡が付かなかった場合に次点の会員に連絡しようとする際も、同じ問題が発生すると思われます。しかし、追加される予約ステータスの名称が"貸出可能連絡済"ですから、ここでは連絡が取れないケースは問題とされていないことと考えられます。 - 〔予約機能の追加〕(4)において、当該タイトルの(予約時間が最も早い)予約者に連絡が取れた場合にレンタルビデオが予約貸出待ち棚に格納されます。この状態で、当該タイトルを予約しているものの、連絡を受けていない(または取れていない)会員が予約中のタイトルを借りにきた場合、データベース上は連絡済の会員かどうかを確認できないので、レンタルビデオを貸し出すことになってしまいます。これだと連絡を受けた正規の予約者が借りにきたときに、貸し出すレンタルビデオがないという状態に陥ります。
したがって、予約貸出時に発生することがある運用上の問題は「予約はしているが,連絡をもらっていない会員に対して貸出しをしてしまう」などです。
この問題も予約ステータス"貸出可能連絡済"を追加すれば、会員に対応する貸出予約番号の予約ステータスを見ることで、連絡済の会員か否かが分かるようになるので解決できます。
∴予約はしているが,連絡をもらっていない会員に対して貸出しをしてしまう