![見出し画像](https://assets.st-note.com/production/uploads/images/152466687/rectangle_large_type_2_73d21f4129f13d69dfb14b878bc00d62.png?width=1200)
【デスペ】令和5年秋午後1問2の解説(データベーススペシャリスト)
このNoteでは「デスペR6春午後1問2」の解説をします。
私はデータベース設計に絞って、デスペに合格しました。
データベース設計の基本は「問題文から仕様を読み取る→スキーマ(表と項目)を作る→ER図(エンティティとリレーション)を作る」です。
今回の問題では、この流れを2回も演習できる良い問題でした。本試験出ても充分高得点を狙える問題です。
ぜひデスペの基礎力を測る・最新の問題への処刑正解力を測るための問題として重宝してくださいね。答えを覚えてでも繰り返し演習する大変価値ある問題です。
このNoteは、私が独学合格した経験と、IT専門学校での授業のノウハウで書いています。合格のお手伝いに少しでもなったら嬉しいです。
それでは始めましょう!
設問1(2)
スキーマを作ってからの方が、ER図のエンティティやリレーションを考えるのが楽なので、解く順番を逆にしますね。
アについて
客室の記述は、13頁1(2)。「客室はホテルごとに客室番号で識別」より、客室(ホテル, 客室番号)。(1)よりホテルコードを使う。
(3)で「客室ごとに客室タイプ」なので項目追加。「客室タイプコードで識別」なので、客室タイプコードが追加。
(4)の館内施設はホテルごとなので、少なくとも客室表には不要。
以上より、客室(ホテルコード, 客室番号, 客室タイプコード)。主キーはホテルコードと客室番号。
![](https://assets.st-note.com/img/1724989054295-AmaEQi17sB.png?width=1200)
ホテルコードはホテル表、客室タイプコードは客室タイプ表がありそうです。よって、外部キーはホテルコード(主キーでもある)と客室タイプコード。
図1を見ると、客室はリレーションが一切ありません。そして「ホテル」表と「客室タイプ」表があります。
ホテル表と客室は1対多。1つのホテルに複数の客室があるはずなので(文章で明記はないですが一般常識で判断)。
客室タイプと客室は1対多。1つの客室タイプ(例えばシングル)に対して、複数の客室があるはずです。
イについて
予約は13頁(4)
(1)より「予約区分」。
(2)より、旅行会社予約の時は旅行会社も記録される。図2を見ると、旅行会社のみの表はないので、予約表で良さそうです。旅行会社は旅行会社の「旅行会社コード」が使えます。
(3)より、「ホテル」(ホテルコード)、「客室タイプ」(客室タイプコード)、「泊数」「客室数」「宿泊人数」「チェックイン予定年月日」。主キーは「予約番号」のようです。この状態では、客室タイプを混合した予約はできなさそうですね。
(4)より、「1室当たりの宿泊料金」が必要
(5)より、「会員番号」が必要。会員でない場合に備え「予約者の氏名」「(予約者の)住所」、これを予約表に入れるのか非会員に関する表を別途設けるかは不明ですが、会員非会員区分という言葉がなかったので一緒でしょう。
以上より、
予約(予約区分, 旅行会社コード, ホテルコード, 客室タイプコード, 泊数, 客室数, 宿泊人数, チェックイン予定年月日, 予約番号, 1室当たりの宿泊料金, 会員番号, 予約者の氏名, 予約者の住所)あたりと目星。
図2に合わせて、予約(予約番号, 予約者の氏名, 住所, 予約区分, チェックイン予定年月日, 泊数, 客室数, 宿泊人数, 1室当たりの宿泊料金, 予約時前払い金額, 会員番号, 旅行会社コード, ホテルコード, 客室タイプコード)。予約時前払い金額は把握してませんでしたが良いでしょう。
よってイは、旅行会社コード, ホテルコード, 客室タイプコード。模範解答には「宿泊割引券番号」が足りませんがまぁこれでとりあえず書いておきます。
![](https://assets.st-note.com/img/1724818096845-q073FXdP6n.png?width=1200)
ウについて
宿泊は14頁の5。「宿泊番号で識別」なので、主キーは宿泊番号。
他は6~9より見つけていくので、難しいですね。
![](https://assets.st-note.com/img/1724818101802-G6V3nXKArd.png?width=1200)
エについて
予約有宿泊は、6チェックイン(1)。
「客室を決め宿泊を記録する」より、「客室コード」「宿泊番号」を使います。
転記する項目も記述があり「泊数」「宿泊人数」「宿泊料金」。予約から転記なので、予約表を参照するために「予約番号」を外部キーで追加するでしょう。
(2)は予約無なのでスルー。
(3)より「会員番号」を追加。
(4)はスルー。
(5)は宿泊表なのでスルー。
(6)も予約とは無関係なのでスルー。
以上より、予約有宿泊(客室コード, 宿泊番号, 泊数, 宿泊人数, 宿泊料金, 予約番号, 会員番号)。
![](https://assets.st-note.com/img/1724818101802-G6V3nXKArd.png?width=1200)
ウについて(再度)
では、問題文仕様を1~9まで読み終えたので、ウを再度洗い出しましょう。
![](https://assets.st-note.com/img/1724818101802-G6V3nXKArd.png?width=1200)
5:「宿泊番号で識別する」より宿泊番号が主キー(既にある)
6-(1):「客室を決め宿泊を記録する」から、宿泊表の話。客室番号を追加。しかも客室番号はホテルごとなので、ホテルコードも追加。ホテルコードと客室番号の複合キーにします。
6-(1):「泊数, 宿泊人数, 宿泊料金は、予約から転記」より、3項目追加(既にある)
6-(2):予約無の場合ですが、4項目は6-(1)と同じ
6-(3):「会員番号を記録」「予約の会員番号を宿泊に転記」より、会員番号を追加(既にある)
6-(4):予約表の話なのでスルー
6-(5):「宿泊ごとに」より宿泊Eの話。「氏名, 住所を記録」より2項目追加(宿泊者Eに既にある)
6-(6):「チェックイン年月日時刻」は宿泊ごとなので追加(既にある)
7:「チェックアウト年月日時刻」は各個人の宿泊なので宿泊Eに追加(既にある)
8-(1):チェックインは宿泊ごとなので考えます。「チェックアウト時に宿泊料金」「予約時」「チェックイン時に」と支払いタイミングが3つ。予約時は予約Eに「予約時前払い金額」があるので、残り2つを追加(既にある)
8-(2):館内施設の料金の話。既に館内施設利用料金があります
9-(1)①:「会員の宿泊に対して」より考える必要ありそう。でも発行についてなので、宿泊割引券E(発行元宿泊番号がある)と判断。ただし割引券発行区分は既にあります。
9-(1)②:予約時の話なので、予約Eに宿泊券割引券番号を追加するので無関係(空欄イ)。
9-(1)③:チェックインとチェックアウトでの割引券利用なので宿泊割引券番号を追加。
9-(2)①:発行についてなので無関係
9-(2)②:チェックアウト時の話なので、「館内施設割引券番号」を追加。
9-(2)②:「宿泊割引券と併用が可能」より、宿泊割引券番号と館内割引券番号の2項目が必要と確定します。併用できない場合は割引券番号を1項目で足りますから。
![](https://assets.st-note.com/img/1724818101802-G6V3nXKArd.png?width=1200)
その他
得点には関係ないですが、エ(割引券発行対象宿泊)以降のスキーマについても問題文との関係を図にしておきました。
![](https://assets.st-note.com/img/1724818111921-rwL9MEaKCm.png?width=1200)
PMIIでは、スキーマは穴埋めどころか、自分で全部書きます。ER図もリレーションだけでなく、エンティティから書きます。
「問題文仕様からスキーマを正確に書き出す設計能力」を、PMIのうちにどんどん鍛えましょう。速く、正確に、そして慎重に。
設問1(1) | 完成したスキーマからER図を完成させる
スキーマの各エンティティ(表)を1つずつ見ていきます。
外部キー、主キーに注目します。
個数対応では、片方を1に固定して相手が1つか複数かを考えます。例えば、「1つの客室タイプは多くの客室に出てくるよな」「1つの客室は1つの客室タイプに属するよね」と考えて「1対多」だなと分かります。
もし「多対多」が現れたら間違いなので考え直してください。第三正規形を満たさないためあり得ません。「多対多」には、必ず「連関エンティティ」が間に入って「1対多」「多対1」にします。
![](https://assets.st-note.com/img/1724986097027-FcpzS8Fnru.png?width=1200)
![](https://assets.st-note.com/img/1724986100257-WjKsjjga1h.png?width=1200)
![](https://assets.st-note.com/img/1724986103610-ygYg1ZGiiJ.png?width=1200)
![](https://assets.st-note.com/img/1724986106216-LxEQl5jbSq.png?width=1200)
![](https://assets.st-note.com/img/1724986110833-3hJrgStQnn.png?width=1200)
設問2(1)abcd
まず設問文に「発行対象となる宿泊」とあるので、問題文を見返します。私も正直忘れていました。
15頁9(1)より
①会員の宿泊について、宿泊割引券を発行
①「旅行会社予約による宿泊は発行対象外」
13頁4(1)より「自社サイト予約と旅行会社予約があり、予約区分で分類する」。
②予約時の前払いで利用できる
③チェックイン時の前払いでも利用できる
④チェックアウト時の精算でも利用できる
あと9(2)を見ると館内施設割引券もあります。宿泊割引券と区別して考えねばですね。
では解きます。どこから解いても良いのですが、私は条件の少ない予約無の空欄bから。
9(1)①より、割引券は会員限定。でも宿泊って会員じゃなくてもできるんですよね。13頁4(5)「会員でない場合は、予約者の氏名と住所を記録する」など。
よって会員であるかを確認するために、「会員番号」に値が入っているか確認が必要。表2-3の通り「宿泊」Eに「会員番号」があるか図2を見ると空欄ウの前にちゃんとあったのでOK。
空欄bは「会員番号」です。
では予約有の場合、空欄a, c, dについて。
c, dから行きます。9(1)①「旅行会社予約による宿泊は発行対象外」より、予約をどこでやったかを確認する必要がありますね。13頁4(1)より「自社サイト予約と旅行会社予約があり、予約区分で分類する」。
空欄cは「予約区分」、空欄dは「自社サイト予約」。13頁4(1)の言葉を使ってください。多分dを「X社の予約」では失点します。
最後に空欄a。
予約有の場合、空欄bが会員番号、なので、予約したのが会員か確認したいのだから「予約」E、といきたいのですが違います。
13頁4(3)で、予約って複数人数できちゃうんですよね。しかし15頁9(1)②で「会員本人の予約だけに利用できる」、③「会員本人の宿泊だけに利用できる」なので、宿泊者個人の記録で確認すべきです。
よって「宿泊」Eの方。空欄aは「宿泊」E。
設問2(2)efghij
「予約時に割引券を利用する場合」が問われているので、また問題文14頁9を読み返します。
9:「割引券番号と発行先の会員番号を記載」。これで使用が正しいか確認しそうです
9:「宿泊割引券と館内施設割引券があり、割引券区分で分類」。9(2)より館内施設割引券は「チェックアウト時の精算だけで利用」なので、予約時に使えるのは宿泊割引券の方。割引券区分が宿泊割引券であるか確認しそうです
9:「割引券の状態には未利用, 利用済, 有効期限切れによる失効があり、割引券ステータスで分類する」。いかにも割引券ステータスが未利用であるか確認しそうです
9(1)②:「1回の予約で1枚」は、予約時に記録できる割引券番号の項目は1つ、単一値なので大丈夫でしょう。
ひとまず、これだけ情報集めて考えてみましょう。
表3-1,2は同じ。
ひとまず、割引券Eを見て、割引券区分, 割引券ステータス, 会員番号は使えそうですね。有効期限年月日は割引券ステータスに「有効期限切れによる失効」があるので要らないでしょう。
さっき集めた情報の2番目と3番目を使って。
表3-1ef:割引券Eの「割引券区分」の値が「宿泊割引券」であること
表3-2gh:割引券Eの「割引券ステータス」の値が「未利用」であること
上手いコト決まりました。
表3-3ijについて。使ってない情報は1番目と4番目。
9:「割引券番号と発行先の会員番号を記載」。これで使用が正しいか確認しそうです
9(1)②:「1回の予約で1枚」は、予約時に記録できる割引券番号の項目は1つ、単一値なので大丈夫でしょう。
穴埋めから見て、割引券Eの項目と予約Eの項目で一致するものを探して見ます。
一致する項目は、会員番号, 宿泊券番号のみ。利用できるかを判定する制約条件の話なので、iとjは会員番号と判断します。
ちょっと余談ですが、宿泊割引券は2回使えるし、2種類あるかもしれません。
予約Eにも宿泊Eにも割引券番号を記載できます。そして予約は複数人を同時にできるので、たぶんグループ割的なものかなと。宿泊Eは個々人の記録なので、個人の支払いにへの割引でしょうね。
それかデータベースでは記録できる設計だけど、どちらか1回しか使えないようにプログラムを組んでいるか。
設問3(2) | 問題文からスキーマを完成させる
問題文15頁【新規要件】からスキーマを決めていきます。
![](https://assets.st-note.com/img/1724818117200-g1KEx88dkV.png?width=1200)
(1)より、会員Eに会員ランクコードが追加され、新たに会員ランクEが親切され、主キーは会員ランクコード、あと必要累計泊数とポイント付与率があるだろうと推測。
図4を確認すると予想通り。会員ランクEに会員ランク名があるのも良いですね。ゴールドやシルバーなどを入れますから。
よって空欄オは、必要累計泊数, ポイント付与率。
(2)は計算処理なので、DB設計には無関係。後で使うかもなので、とりあえず▼印をしておきます。
(3)は計算処理なので、DB設計には無関係。ただし、有効期限年月日をどこかに設ける必要がありそう。未解決なので▼しておきます。
(4)も有効期限の話。期限は1年以外もあるので、ますます「有効期限年月日」をどこかに設ける必要があります。未解決なので▼印。
(5)で来ました。「有効期限年月日」「未利用ポイント数」の2項目を追加しそう。
ポイントについて情報溜まったので、一度図4を見ます。「有効期限年月日」と「未使用ポイント数」をどうするか。
ポイントに関わるエンティティは3つ。「ポイント増減」「ポイント付与」「ポイント失効」。「ポイント増減」か「ポイント付与」だと思うけど、たぶん「ポイント付与」かなぁ。
ポイント付与Eの空欄クは、「有効期限年月日」「未使用ポイント数」。
![](https://assets.st-note.com/img/1724818117200-g1KEx88dkV.png?width=1200)
(7)より、交換商品があるので交換商品E(商品コード, 商品名, 必要ポイント数)。ここで「商品名」の記述はありませんでしたが、商品コードだけでは人間には分かりにくいので追加。
商品交換実績として「商品と個数を記録する」が必要なので、商品交換実績E(会員番号, 交換年月日, 商品コード, 個数)かな。
図4を見て、商品E(商品コード, 空欄カ)。空欄カは「商品名, 必要ポイント数」。
![](https://assets.st-note.com/img/1724818117200-g1KEx88dkV.png?width=1200)
なお「商品名」は若干ファインプレイに見えますが、表1に「商品名」があるので気づけます。表1も載せてある以上は解答作りに関わります。「表1見てないで解けてるなぁ」と思ったときこそ罠があるので、一瞬でも見て確認しておきましょう。
商品交換E(会員番号, ポイント増減連番, 空欄サ)。空欄サは「商品コード, 個数」で良さそうです。交換年月日を想定していましたが、ポイント増減連番で紐づけたポイント増減Eあたりに日付を書くのでしょう。
(8)ではポイントでの支払い、商品交換による増減処理について。
(9)より「失効前メール送付日時」「失効後メール送付日時」が必要。これはポイント失効E(会員番号, ポイント増減連番, 空欄ケ)で良いでしょう。よって空欄ケは「失効後メール送付日時」。
![](https://assets.st-note.com/img/1724818117200-g1KEx88dkV.png?width=1200)
失効前メール送付日時は、ポイント付与Eにありました。
最後の(10)より、ポイントの増減が発生したら、「ポイントの増減区分」「(ポイントの増減数)」「(ポイントの)増減時刻」を記録するとのこと。
ポイント増減Eの空欄キに「ポイントの増減区分」「ポイントの増減数」「ポイントの増減時刻」。
模範解答は「の」をカットして、「ポイント増減区分」「ポイント増減数」「ポイント増減時刻」でした。「の」が入っても大丈夫でしょう。
最後に、支払充当の空欄コが残りました。ポイントを予約時(予約番号)や清算時(宿泊番号)や商品交換(ポイント増減連番)で使った時の記録です。
何に使われたか明記したいので「支払充当区分」を追加。ファインプレイに見えるかもですが、慣れると自然に閃くレベルです。頑張って過去問演習してくださいね。
![](https://assets.st-note.com/img/1724818117200-g1KEx88dkV.png?width=1200)
設問3(1) | スキーマからER図を完成させる
設問1(1)と同じように、完成させたスキーマを参考に、各エンティティを1つずつ見てER図を完成させていきます。
![](https://assets.st-note.com/img/1724987234149-5cbXYoEKkc.png?width=1200)
「ポイント増減区分」について。「区分」なのでさらにER図で枝分かれをさせねばと思うかもですが、今回不要です。
表1を見ると、ポイント増減区分には「付与」「支払充当」「商品交換」などの処理結果を書き込む項目です。更に付与Eや支払充当Eなどエンティティを新設する必要はありません。
![](https://assets.st-note.com/img/1724987241454-3FVbdBotKT.png?width=1200)
![](https://assets.st-note.com/img/1724987245003-HwB5xEE0ow.png?width=1200)
「支払充当区分」もポイント増減区分と同じで、ER図設計とは無関係です。
16頁(6)より、支払充当区分は「予約時」「チェックイン時」「チェックアウト時」など、いつ使ったかを記録する項目だからです。
![](https://assets.st-note.com/img/1724987249809-faNhY5KDkb.png?width=1200)
まとめ
お疲れ様でした!
データベース設計の基礎である「問題文仕様→スキーマ→ER図」を2回もできる良い過去問でした。
予約Eと宿泊Eは複雑でしたが、他のエンティティやリレーションはとても解き易かったです。
若干個数対応(1対1や1対多)の記述が明確でない点がありましたし、私の解答でも少し足りないかもしれません。
ぜひ何度も、たとえ答えを覚えていても、演習を繰り返す価値ある問題でした。
このNoteが、デスペ合格にお役に立ったら嬉しいです。
\私の4ヶ月の学習履歴/
p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。
でわでわ(・ω・▼)ノシ
いいなと思ったら応援しよう!
![せんない](https://d2l930y2yx77uc.cloudfront.net/assets/default/default_profile_5-043439195e40e86fd7641a3a1daf982637d77ec6f14b67d3fc98ab92374404ac.png?width=600&crop=1:1,smart)