データベーススペシャリスト平成27年午後Ⅰ問1を
どこよりもくわしく解説をします。
問題の1行1行を着目して解説しているので
午後問題が苦手な人でも必ず
理解できるようになります。
大船に乗った気持ちで読み進めてください。
問題文と解答は以下よりダウンロードしてください。
一度自分で解いてからのほうが身に付きますが
自信のない方は解説を読みながら理解しましょう。
解き方のコツ
最初に設問を見る
全体としてはP6からP10の途中までが問題で,
P10の最後とP11が設問になっていますね。
P6から軽く見ながらP10まで進みます。
設問1
(1)は書籍作品について問われていることを確認します。
あとは候補キーを探す,
部分関係従属性,推移的関数従属性があるかどうか,
(2)は第何正規形なのか?,
第3正規形でなければ第3正規形に直す必要あり。
設問2
図2中のaからdを埋める。
図1のリレーションを書く
表2のアとイを埋める
設問3
出荷と出荷明細に関して不具合があるとのこと。
出荷の説明を読めば何かしら不具合があるんだろうなーと
思っておく。
といった感じで,ざっと何を問われているかをまず
感じておきましょう。
解説
解き方としては,定番の関係スキーマ(図2)と
概念データモデル(図1)を埋める必要があるので
まず問題を読みながら,図2を完成させます。
図2が出来れば図1はおのずと埋めることが出来る。
要するにまず次の図2を埋めることを考えて...
その後に次の図1を回答する。設問2の(2)の通り,
解答の仕方は1対1,1対多,多対多の直線(1の時)または矢印(多の時)
で示すのみでよい。エンティティの追加も不要。
問題文は小さなかたまりで
図2の表(関係)と対になっているので
問題文と図2を交互にみて,
虫食い部分を埋めていきましょう。
問題を最初から読んでいく
それでは問題文を読んでいきましょう。
まず最初。
ふーんなるほど。と思う程度。
形態というものの説明。
書籍作品とは形態にかかわらず作品そのもの。
「DBのこころ」という書籍作品のタイトルにたいして
形態が「単行本」「文庫本」などがある。
「形態別書籍とは」とかいてるので図2で確認。
問題文にある出版社名,ページ数も図2にあり
とくに問題ないことを確認する。
書籍作品に関する記述です。これは設問の1で
問われています。
設問1(1)
設問1では...
- 「書籍作品」の候補キーを探す,
- 部分関係従属性,推移的関数従属性があるかどうかを答える。
- 第何正規形なのか?
- 第3正規形でなければ第3正規形に直す。
という問題です。
図2を見ると...
候補キーを探します。
書籍作品IDがありますが,これだけでキーかどうかを考えます。
書籍作品には複数の著者が存在すると書いているので
書籍作品IDだけがキーにはなりません。
それだと複数の著者IDが登録できません。
書籍作品IDと著者IDの複合キーならOKですね。
あとは著者役割コードがありますがこれは
「主要な著者役割が一つ定められている」となっているため
書籍作品に対して複数は存在しません。
よってこれを候補キーに含める必要はないと分かります。
よって候補キーは
{書籍作品ID,著者ID}となります。
問題にはあるだけ書けと書いていますが
1つしかないので1つでOKです。
この流れで設問1の続きを答えていきましょう。
- 部分関数従属性,推移的関数従属性があるかどうかを答える。
部分関数従属性があるか?
候補キーは書籍作品IDと著者IDなのでそのどちらか一方がきまるだけで
決まるものはあるかを考える。
まず書籍作品IDが決まればタイトルが決まる
著者IDが決まれば著者名が決まります。
よって部分関数従属性は「あり」 書籍作品ID→タイトル 著者ID→著者名
となります。
推移的関数従属性があるかも見ましょう。
候補キー以外の項目でそれが決まれば何かが決まる関係の物を探します。
著者役割コードがありますね。
これは書籍作品IDと著者IDが決まれば著者役割コードが決まり,
著者役割コードが決まれば著者役割名が決まりますね。
よってAが決まればBが決まる,Bが決まればCが決まるの関係になっているので
推移的関数従属しています。
よって推移的関数従属性は「あり」 {著者作品ID,著者ID}→著者役割コード→著者役割名 となります。
部分関数従属,推移的関数従属に自信がない人は
こちらをご覧ください。
設問1(1)の続き
設問1(1)の問題はまだあります
- 第何正規形なのか?
- 第3正規形でなければ第3正規形に直す。
部分関数従属が含まれていた為, 第1正規形 となります。
そして第3正規形になるように表を分解しましょう。
分解方法はいままで見てきた通りです。
ここまでで設問1はすべて解答できました。
問題の続きに戻りましょう。
著者役割とは著作者や共著者などのようです。
カテゴリについて書いてます。図2のカテゴリもみましょう。
カテゴリは階層構造になっていると書いてます。
図2には(カテゴリコード,カテゴリ名)があります。
空欄bがありますが,ここには階層構造のための
項目が必要であることがわかります。
階層構造を作るには親子関係が必要です。
その場合は親のカテゴリコードがあれば
親があればたどっていくことができます。
空欄bの解答は「上位カテゴリコード」となります。 「親カテゴリコード」でもおそらく正解でしょう。
販売書籍は新品書籍と中古書籍に分類されると書いています。
このような書き方の場合はスーパータイプとサブタイプに
分かれます。
図1のレイアウトからも想像できますね。
販売書籍と中古書籍,新品書籍がトライアングル上にあります。
こういう場合はたいていスーパータイプとサブタイプに
分けさせることを狙っています。
図2を見ても販売書籍がスーパータイプ
新品書籍と中古書籍がサブタイプになるように描かれています。
図1も並行して書き込んでいきましょう。
図2の新品書籍を確認します。
販売価格,実在庫数,受注残数を記録する必要がありますが
販売価格が「新品書籍」にありませんね。
でも新品書籍に追加するエリアはありません。
そこで販売書籍との親子関係を見てみます。
販売書籍はスーパータイプなので,新品書籍と中古書籍の
両方に共通する項目が入るはずです。
問題文の中古書籍欄を見ても販売価格はある為
図2のcは販売価格になります。
問題文の中古書籍と図2の中古書籍を見比べます。
品質ランク,品質コメント,ステータスとすべて図2にありますね。
販売価格はないですが,cが販売価格とすれば
dに販売価格というのはおかしいです。
この時点ではdの判別はまだできません。
置いておきましょう。
分からないところは別の文章で判明するため
無理に埋めないでおきましょう。
ここまでで販売書籍,新品書籍,中古書籍の
リレーションを考えましょう。
形態別書籍IDが破線になっているため
外部キーとわかります。
外部キーという事は,他の表に主キーがあり
その表と1対多または1対1でつながります。
そして1対多の場合は必ず
外部キーを持つ表が「多」になります。
答えを先にお見せすると
こうなります。
形態別書籍と新品書籍は1対1になります。
なぜでしょうか?
新品書籍は形態別書籍ごとに記録するとなっているので
新品書籍1つに対して形態別書籍は1つという事がわかります。
よって1対1になります。
一方中古書籍は
1冊ごとに品質ランクなどが決まるので
同じ形態別書籍IDの中古本が複数冊存在しうるという事になります。
中古書籍
商品番号 | 形態別書籍ID | d | 品質ランク | 品質コメント | ステータス |
1 | 単行本 | 1 | good | 引当済 | |
2 | 単行本 | 1 | bad | 引当済 | |
3 | 文庫本 | 2 | bad | 引当済 |
新品書籍
商品番号 | 形態別書籍ID | 実在庫数 | 受注残数 | 受注制限フラグ |
1 | 単行本 | 10 | 1 | 0 |
2 | 文庫本 | 29 | 2 | 0 |
こんな感じのイメージです。
新品書籍の単行本は1行しかない。
中古書籍は本ごとに値段が違うので同じ本の単行本でも
複数の行が出来ることとなります。
ここはそんな仕様なんだなーというくらい。
図2の会員を確認
特に問題ないですね。
図2の出品会員を確認
会員には出品会員という特別な状態があるという事になり
どちらも主キーが会員ID。
親子関係にあると判断できます。
こんな感じになります。
品質ランク,品質コメントを登録となっているが,
それらのデータがどこに登録されているかを
図2で確認する。
中古書籍に同じ項目があることがわかります。
中古書籍は出品会員が出品するので
誰の出品なのかを識別する必要がありますね。
だから保留にしていた dの答えは「出品会員会員ID」となります。 出品会員に紐づくので外部キーとなります。
図1は出品会員と中古書籍が1対多でリレーションを持ちます。
図2を確認します。
問題には会員ごと,出品会員ごとと書いているので
この2つでキーになるという事を示しています。
よって空欄aは会員IDとなります。
会員IDと出品会員会員IDは主キーであり
会員と出品会員の外部キーになるので
図1にリレーションを書きます
ここまでで図1と図2は完成しました。
設問1と設問2の(1)(2)まで完成です。
設問2の(3)を考えましょう。
「ア」は中古書籍が受注したときにどうなるかを考えます。
中古書籍は
こんな感じですよね。
ステータスという項目があるので
表1で意味を調べます。
受注時は引当済になることがわかります。
なので「引当済になる」が答えですが,
答え方は他の例と合わせましょう。
中古書籍が入庫した時の表現が
となっているので
答えは
となります。
空欄イは出荷したときの新品書籍の更新項目です。
実在在庫数と受注残数があるのでそれぞれ減らす必要があります。
が答えになります。
設問3
設問3は出荷に関して何か不具合があるといっています。
出荷業務の箇所を読みます。
同一会員からの複数注文を1つにまとめるなんて
考慮してませんよね。
それに在庫が足りない場合にあるだけ出荷して
出荷残数を管理なんてしてませんよね。
だからこの2つが答えとなります。
そして,設問3の(2)では
不具合解消版のスキーマを示せとなっています。
図2
出荷数を記録できるようにする必要があるので
出荷(出荷番号,出荷日時) 出荷明細(出荷番号,商品番号,注文番号,出荷数)
出荷明細に注文番号も主キーにして出荷数を
管理できるようにすれば,複数の注文を
一度に出荷でき,未出荷の個数もわかるようになります。
以上で平成27年午後Ⅰ問1の解説は終わりです。
最後までお読みいただきありがとうございました。
SQLやデータベースについてもっと学びたい方は次の記事でおすすめの書籍を紹介しています↓
<< 1 2 3 4 5 6 7 8 9 10 11 12 >>
#01_はじめに
#02_VisualStudio2022のインストール
#03_SQLServerのインストール
#04_データベースとテーブルの作成
#05_プロジェクトの作成
#06_接続先文字列の作成
#07_データテーブルでのデータの取得
#08_Sqlアクセスクラスの作成
#09_SqlDataReaderでのデータ取得
#10_SqlDataReaderの結果をカスタムクラスに入れる方法
#11_SqlCommandでInsert文を発行する方法
#12_SqlCommandでUpdate文を発行する方法
#13_Update対象がなかったらInsertする方法
#14_SqlCommandでDelete文を発行する方法
#15_Dapperでデータを取得する方法
#16_DapperでInsert文を発行する方法
#17_EntityFrameworkをインストールしてDbContextを作成する方法
#18_EntityFrameworkでデータを取得する方法
#19_EntityFrameworkでInsert文を発行する方法
#20_EntityFrameworkでUpdate文を発行する方法
#21_EntityFrameworkでDelete文を発行する方法
#22_Helperクラスを作ってSqlCommand操作を共通化する方法
#23_パフォーマンスチェックの方法
#24_4つのデータのとり方のパフォーマンスチェック
#25_4つの結果を踏まえて講評
#26_さいごに
下記URLは、ベネッセが提供する教育用プラットフォームにて
私が公開しているプログラミング学習コースです。
無料コースもあるので、よかったらご覧になってみてください。
【無料動画】「C#を勉強する順番」