DBデータベーススペシャリスト試験 午後Ⅰ

令和2年度10月 データベーススペシャリスト 午後Ⅰ 問3

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問3 データウェアハウスに関する次の記述を読んで,設問1~3に答えよ。 A社は,家庭日用品,DIY用品などを販売するホームセンタを,全国の主要都市に展開している。A社では,RDBMSの機能を用いた販売情報分析システムを運用しており,Fさんがテーブルの設計を見直すことになった。 〔業務の概要〕 (1) A社の営業本部は,全国を10地域に分けて販売情報を分析している。 (2) A社の店舗は,全部で300店あり,店舗が一つもない地域はない。 (3) 分析対象の商品は100、000点あり,商品分類によって分類される。商品には,時期と地域によってよく売れるものもあれば,全く売れないものもある。 (4) 商品分類には10個の大分類と200個の小分類がある。大分類が家庭日用品ならば,小分類の一つは鍋である。小分類が一つもない大分類,商品が一つもない小分類はない。商品は,小分類に分類後,その分類が変更されることはない。 (5) 会員には個人会員と法人会員があり,会員地域コードが設定される。法人会員には,担当する社員が登録後に1名決められる。分析対象は10、000会員である。 〔見直し前の主なテーブル〕 見直し前の主なテーブル構造を図1に,主な列の意味・制約を表1に示す。 図1 見直し前の主なテーブル構造(一部省略) 表1 主な列の意味・制約 〔見直しの方針〕 1. テーブルの統合 これまで個人会員及び法人会員に関する情報をそれぞれ別テーブルに記録していたが,販売情報を分析するSQL文を簡素にするため,次のように統合する。 ・“個人会員”,“法人会員”テーブルを“会員”テーブルに統合する。 ・“個人売上”,“法人売上”テーブルを“売上”テーブルに統合する。 なお,会員番号の付与方法は変えないものとし,また,統合に伴うテーブルの定義(列名,データ型,制約など)の変更は必要最小限とする。 2. サマリテーブルの作成 これまで分析用SQL文は,図1中のテーブルを直接アクセスしていたが,処理時間を改善するため,“売上”テーブルを集計したサマリテーブルを作成する。 〔テーブルの統合〕 “個人会員”,“法人会員”テーブルに定義されていた制約は,それぞれ表2,3のとおりであった。 表2 “個人会員”テーブルの制約の定義(未完成) 表3 “法人会員”テーブルの制約の定義(未完成) 見直し後の“会員”,“売上”テーブルのテーブル構造を,図2に示す。 Fさんが調べたところ,既存の会員番号をそのまま移行したのでは不都合が起きることが分かったので,“会員”テーブルに会員区分を追加し,個人会員には‘A’の値を,法人会員には‘B’の値をそれぞれ設定することにした。 図2 見直し後の“会員”,“売上”テーブルのテーブル構造(一部省略) Fさんは,次の規則に基づいてテーブル定義表を作成し,テーブルを定義した。 (1) データ型欄には,データ型を記入する。 (2) NOT NULL欄には,NOT NULL制約を設定する場合にYを記入し,そうでなければNを記入する。 (3) 格納長欄には,RDBMSの仕様に従って格納長を記入する。 (4) 索引の種類と構成列欄には,作成する索引を記入する。 ・索引の種類には,P(主キー索引),U(ユニーク索引),NU(非ユニーク索引)のいずれかを記入し,各索引の構成列には構成列の順番に1からの連番を記入する。 ・制約欄には,参照制約,検査制約を,SQLの構文で記入する。 Fさんが作成した見直し後の“会員”テーブルのテーブル定義表を,表4に示す。 表4 見直し後の“会員”テーブルのテーブル定義表(未完成・一部省略) 〔見直し後の販売情報の分析〕 販売情報の分析では,例えば,販売実績が非常に少なかったケースを調べる目的で,次のような分析(分析B1)を行っている。テーブルの設計を見直した後の分析B1用SQL文の構文を図3に,実行結果を表5に示す。 分析B1 2020年3月の店舗コード別商品コード別売上額を調べる。ただし,店舗コードはM1,M2及びM3に,商品コードはP1及びP2に限定する。 図3 分析B1用SQL文の構文(未完成) 表5 分析B1用SQL文の実行結果 〔サマリテーブルの作成〕 Fさんが,処理時間の改善を要望された分析用SQL文の目的を調べ,最大結果行数を見積もった結果を,表6に示す。また,表6中の分析のうち,分析B2用SQL文の構文を,図4に示す。 表6 処理時間の改善を要望された分析用SQL文を調べた結果(未完成) 図4 分析B2用SQL文の構文 設問1 〔テーブルの統合〕について,(1)~(3)に答えよ。 (1) 表2,3中の[a],[b]に入れる適切な字句を答えよ。 (2) 会員区分を追加することなく既存の会員番号をそのまま移行すれば,どのような場合にどのような不都合が起きると考えられるか,それぞれ25字以内で述べよ。 (3) 表4に示したNOT NULL欄中の[c]~[g],及び制約欄中の[h]~[m]に入れる適切な字句を答えよ。 設問2 〔見直し後の販売情報の分析〕について,(1),(2)に答えよ。 (1) 図3中の[あ]~[く]に入れる適切な字句を,解答群の中から選び,記号で答えよ。 解答群 ① 売上 U ② 店舗 M ③ 商品 S ④ U.店舗コード ⑤ U.商品コード ⑥ M.店舗コード ⑦ S.商品コード ⑧ U.年='2020' ⑨ U.月='03' ⑩ U.商品コード IN('P1'、'P2') ⑪ U.店舗コード IN('M1'、'M2'、'M3') ⑫ M.店舗コード IN('M1'、'M2'、'M3') (2) COALESCE関数は,1番目の引数がNULLでないときはその値,NULLのときは2番目の引数を返す関数である。図3中の選択リスト中の販売額又はクーポン額がNULLになるのはどのような場合か,本文中の用語を用いて,それぞれ25字以内で述べよ。 設問3 〔サマリテーブルの作成〕について,(1),(2)に答えよ。 (1) 表6中の[イ]~[ハ]に入れる適切な字句を答えよ。なお,結果行数を見積もるとき,分析対象の期間中,現在の店舗コード,店舗地域コード,小分類コード,大分類コード,商品コード,会員番号及び会員地域コードの数に変動がなかったと仮定すること。 (2) 図1中の“個人売上”,“法人売上”テーブル以外のテーブルを総称して,次元テーブルという。表6中の全ての分析について,次元テーブルと一つのサマリテーブルだけから売上額を集計できるようにしたい。Fさんは,サマリテーブルの候補のうち,最小列数かつ最小行数となるサマリテーブル“S”のテーブル構造を,次のように設計した。[A]に入れる複数の列名を答えよ。ただし,列名は次元テーブルから選ぶこと。 S(年,月,店舗コード,会員区分,会員地域コード,[A],売上額)
図1 見直し前の主なテーブル構造(一部省略)。見直し前のカレンダ,地域,店舗,社員,商品分類,会員,売上などのテーブル構造を示す図。
図1 見直し前の主なテーブル構造(一部省略)。見直し前のカレンダ,地域,店舗,社員,商品分類,会員,売上などのテーブル構造を示す図。
表1 主な列の意味・制約。日付,会員番号,性別,年代,販売額,クーポン額などの列の意味と制約を示す表。
表1 主な列の意味・制約。日付,会員番号,性別,年代,販売額,クーポン額などの列の意味と制約を示す表。
表2 “個人会員”テーブルの制約の定義(未完成)。個人会員テーブルの会員地域コードと年代の参照制約,性別の検査制約を示す表。
表2 “個人会員”テーブルの制約の定義(未完成)。個人会員テーブルの会員地域コードと年代の参照制約,性別の検査制約を示す表。
表3 “法人会員”テーブルの制約の定義(未完成)。法人会員テーブルの会員地域コードと担当社員IDに関する参照制約を示す表。
表3 “法人会員”テーブルの制約の定義(未完成)。法人会員テーブルの会員地域コードと担当社員IDに関する参照制約を示す表。
図2 見直し後の“会員”,“売上”テーブルのテーブル構造(一部省略)。会員区分を追加した会員テーブルと,個人売上・法人売上を統合した売上テーブルの構造を示す図。
図2 見直し後の“会員”,“売上”テーブルのテーブル構造(一部省略)。会員区分を追加した会員テーブルと,個人売上・法人売上を統合した売上テーブルの構造を示す図。
表4 見直し後の“会員”テーブルのテーブル定義表(未完成・一部省略)。会員テーブルの列名,データ型,NOT NULL,索引,参照制約,検査制約を示す未完成の定義表。
表4 見直し後の“会員”テーブルのテーブル定義表(未完成・一部省略)。会員テーブルの列名,データ型,NOT NULL,索引,参照制約,検査制約を示す未完成の定義表。
図3 分析B1用SQL文の構文(未完成)。店舗と売上を左外部結合し,2020年3月の店舗別商品別売上額を集計するSQL文の空欄付き構文。
図3 分析B1用SQL文の構文(未完成)。店舗と売上を左外部結合し,2020年3月の店舗別商品別売上額を集計するSQL文の空欄付き構文。
表5 分析B1用SQL文の実行結果。店舗M1,M2,M3と商品P1,P2の売上額集計結果を示す表。
表5 分析B1用SQL文の実行結果。店舗M1,M2,M3と商品P1,P2の売上額集計結果を示す表。
表6 処理時間の改善を要望された分析用SQL文を調べた結果(未完成)。分析B2からB6までの分析目的と最大結果行数を示す未完成の表。
表6 処理時間の改善を要望された分析用SQL文を調べた結果(未完成)。分析B2からB6までの分析目的と最大結果行数を示す未完成の表。
図4 分析B2用SQL文の構文。売上,カレンダ,会員を結合し,2019年の四半期別会員区分別地域別売上額を集計するSQL文。
図4 分析B2用SQL文の構文。売上,カレンダ,会員を結合し,2019年の四半期別会員区分別地域別売上額を集計するSQL文。
解き方のヒントを見る

統合設計は前提条件との対応で考える

テーブルを統合したり集計用の表を用意したりする場面では、設計の良し悪しは記述された業務上の前提条件に照らして初めて判断できます。自分の一般知識で補わず、問題に示された条件を根拠として一つずつ対応付ける姿勢で読み進めましょう。

この問題で問われていること

確認すべき観点は一つ、「設計判断の根拠が問題中に示された前提条件のどこにあるか」です。統合や集計の手段そのものより、その手段を選ぶ理由となる条件がどれかを先に特定し、そのうえで各判断が条件と矛盾しないかを照らし合わせてください。

視点

データウェアハウスでは、複数の業務システムに由来するデータを分析目的で一か所に集めます。その際の設計上の選択には何らかの理由があり、その理由は業務ルールやデータの性質として問題側に与えられるのが一般的です。まず条件を拾い出し、次にそれがどの判断に結びつくかという順で頭の中に対応関係を作ると、根拠のない推測に頼らずに検討できます。

確認ポイント

  • 問題中に示された業務上の前提条件やデータの性質を、判断の前にすべて拾い出したか
  • 検討している各判断について、それを支える前提条件がどこに書かれているかを指し示せるか
  • 問題に書かれていない事情を自分の経験や一般論で補って判断していないか
正解と解説を見る

解説

ホームセンタの販売情報分析システムで、個人と法人に分かれた会員表・売上表を統合し、サマリテーブルを作る事例です。統合時の主キーの一意性、会員区分ごとのNOT NULLと検査制約、店舗を基準にした外結合の書き方、集計行数の見積り、最小構成のサマリテーブル設計が問われています。公式解答例では、会員区分を主キーに加える理由、ON句とWHERE句の使い分け、次元テーブルからたどれる列はサマリに持たないことが要点になっています。

問題の全体像

A社は、RDBMSで販売情報分析システムを運用しています。見直しの内容は次の二つです。一つ目は、分析用SQLを簡素にするため、個人会員・法人会員の表を“会員”に、個人売上・法人売上の表を“売上”に統合することです。二つ目は、処理時間を改善するため、売上を集計したサマリテーブルを作ることです。条件として、会員番号の付与方法は変えず、表定義の変更は必要最小限とされています。出題趣旨では、次元テーブルを統合するときの考慮点、分析用SQL構文の基本的な特徴と考慮点、データマート設計に必要な性能見積りの理解を問うとされています。採点講評では、全体として正答率は高かったと述べられています。

設問1(1)

図1では、個人会員・法人会員の会員地域コードと、法人会員の担当社員IDが外部キー(点線の下線)になっています。会員地域コードは地域を表すので、参照先は“地域”テーブルの主キーである地域コードです。担当社員IDの参照先は“社員”テーブルの社員IDです。表2の「年代(年代)」と同じく「表名(列名)」の形で書くので、公式解答例では、aは地域(地域コード)、bは社員(社員ID)です。

設問1(2)(場合)

着目するのは表1の記述です。個人会員番号と法人会員番号は、どちらも8桁で、互いに無関係にそれぞれ独自に付与されています。このため、同じ番号の個人会員と法人会員が存在し得ます。公式解答例では、不都合が起きる場合を「個人会員番号と法人会員番号が重複する場合」としています。答案では「両者の番号が同じ値になる」ことを25字以内で示します。

設問1(2)(不都合)

会員区分を加えずに統合すると、“会員”テーブルの主キーは会員番号だけになります。そこに既存の個人会員と法人会員の番号をそのまま登録すると、重複する番号で主キーの一意性に違反し、登録できません。公式解答例では「会員番号の登録が主キー重複違反で失敗する」としています。このため、Fさんは会員区分(個人は‘A’、法人は‘B’)を追加し、図2では{会員区分、 会員番号}を主キーにしています。答案では、主キー重複で登録に失敗することを押さえます。

設問1(3)

NOT NULL欄は、個人会員と法人会員の両方で必ず値が入るかどうかで判断します。cの会員区分は主キーの構成列なのでY、dの会員地域コードは両方の会員に設定されるのでYです。eの性別とfの年代は個人会員だけの属性なので、法人会員ではNULLになります。このためe、fはNです。gの担当社員IDは法人会員だけの属性で、しかも登録後に決まるのでNです。参照制約は、変更を最小限にする方針に従い、表2・表3の定義を引き継ぎます。hはRESTRICT、iはSET NULLです。検査制約では、会員区分‘A’の行に性別 IN (‘M’、‘F’)、年代 IS NOT NULL、担当社員ID IS NULLを課します(j〜lは順不同)。会員区分‘B’の行には、性別 IS NULLに加えて年代 IS NULLを課すので、mは年代 IS NULLです。担当社員IDは登録後に決まるので、法人側では条件を付けません。採点講評によると、外部キーの年代にINやBETWEENを加えた誤答が散見されました。年代は参照制約で取り得る値が限られていますが、外部キーではない性別はIN述語で値を限定する必要があります。この違いを押さえてください。

設問2(1)

表5では、2020年3月に対象商品の売上がないM3も「なし」「0」として出力されています。したがって、店舗を基準にして売上を外結合します。公式解答例では、あは②店舗 M、いは①売上 Uです。結合条件は⑥M.店舗コード=④U.店舗コードです(う・えは順不同)。売上側の絞込みである⑧U.年='2020'、⑨U.月='03'、⑩U.商品コード IN('P1'、'P2')はON句に書きます(お〜きは順不同)。これらをWHERE句に書くと、売上がなくNULLになったM3の行が除かれてしまうからです。一方、店舗の絞込みは結合後の行に対して行うので、WHERE句にくの⑫M.店舗コード IN('M1'、'M2'、'M3')を書きます。採点講評によると、ON句とWHERE句の述語を逆にした誤答が散見されました。結合前の表に適用する述語はON句に、結合後の結果行に適用する述語はWHERE句に書きます。

設問2(2)(販売額)

外結合では、左側の店舗に一致する売上行がないと、売上側の列はすべてNULLになります。表5のM3の行がこれに当たります。公式解答例では、販売額がNULLになるのは「分析対象の商品が全く売れなかった店舗の場合」としています。業務の概要(3)の「全く売れない」という本文中の用語を使い、対象期間・対象商品の売上がない店舗であることを25字以内で示します。

設問2(2)(クーポン額)

表1によると、クーポン額には、会員がクーポンを提示して適用した金額が入り、適用しなかった場合はNULLが設定されます。公式解答例では「分析対象の商品にクーポンを適用しなかった場合」としています。売上行があってもクーポン額はNULLになり得るので、COALESCEで0に置き換えてから販売額との差を合計しています。答案では「クーポンを適用しなかった」ことを押さえます。

設問3(1)

最大結果行数は、集計キーごとの値の数を掛け合わせて求めます。B2の検算は、四半期4×会員区分2×会員地域10=80です。B6の検算は、60か月×小分類200=12、000です。同じ考え方で、イ(B3)は2か月×店舗地域10×大分類10=200、ロ(B4)は12か月×店舗300×大分類10=36、000、ハ(B5)は店舗300×性別2×年代7=4、200となります。店舗が一つもない地域はないので、店舗地域は10とします。公式解答例では、イは200、ロは36、000、ハは4、200です。

設問3(2)

B2〜B6の集計キーを、次元テーブルとの結合で導けるように並べます。四半期名は年・月からカレンダで、店舗地域コードは店舗コードから店舗で、大分類コードは小分類コードから小分類でたどれます。B5には性別と年代が必要で、B6には小分類コードが必要です。行数を最小にするため、会員番号や商品コードのような細かい列は持ちません。公式解答例では、Aは「性別,年代,小分類コード」です。採点講評によると、大分類コードを追加した誤答が散見されました。“小分類”テーブルが外部キーとして大分類コードを持つので、大分類コードは不要です。

学習のポイント

独自に採番された識別子を統合するときの主キー設計、サブタイプごとのNULL制約と検査制約の書き方、外結合で条件をON句とWHERE句のどちらに書くか、次元の値の数から集計行数を見積もる方法を重点的に練習してください。

出典:独立行政法人 情報処理推進機構(IPA)令和2年度10月 データベーススペシャリスト試験 午後Ⅰ 問3(公式資料:問題冊子(PDF) / 解答例 / 採点講評)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針