東大入試のノリで解いてデータベーススペシャリストを攻略した話（応用情報よりコスパいいよ）

:::note warn
筆者は論理設計の問題を選択したので、物理設計のお話は出てきません。
:::

## はじめに
[IT資格の王、IT資格キング](https://qiita.com/uts1_6/items/11e348ead4bae71571b8)になりたいですよね。

今日IPAの高度情報技術者試験にあたるデータベーススペシャリスト2023の合格を観測しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/8c169168-0fee-c3f2-3234-72aa01769e99.png)

午後2思ったより低くて涙。

応用情報を飛ばしてこちらを受験したのですが、個人的な主観としては、 **過去問ゲー的で攻略しやすい** と感じました。

しかし、世の中の試験対策系の記事は「過去問をやろう！」と抽象的に言いながら、過去問に取り組んだことで何が良かったのか具体化してないのが大半ですよね、受験産業も含めて。

この記事では、対策プロセス、そして試験の戦略についてお話しします。

## データベーススペシャリストの試験内容
一日に4つ試験があり、全て **60点以上** を獲得する必要があります。

### 午前1試験
当日当時開催の **応用情報技術者試験と同一** です。(問題数はちょっと少なくなる)

応用情報技術者試験を過去数年内に取得したとか、免除制度がありますが、筆者は初受験なのでちゃんとこちらも合格しました。

こちらはちゃんと対策しないと合格点はとれませんが、 **対策はけっこう単純で簡単です。**

### 午前2試験
データベース分野、セキュリティ分野のマーク試験。
基本知識問題、SQLの選択問題などが出題される。

**難易度は低め。** 対策しなくとも合格点取れる場合は取れる。

### 午後1試験
#### 全体構成
3問出題されるうち、2題選択。記述式。

例年
* **論理設計**
  **実装を気にせず** 、対象の要件をとりあえず関係リレーション(いくつかの表)に整理する
* **物理設計**
  どのような型・DB設定で **実装する** かを設計する
* **SQL設計**
  SQLの手書き穴埋め、選択問題、行数に関する簡単な手計算問題

の3題が出題される傾向があります。

:::note
データベース文脈における「物理」「論理」は特殊な意味があります。

あえて不正確にいうと、
* 「論理」は「実装に囚われない」
* 「物理」は「実装上」

というニュアンスがあります。[詳細はこちら](https://rainbow-engine.com/table-design-logical-pysical/)

よって、「物理設計」というのは「スペックからデータベース機器を選択してセッティングして物理的に配線する──」という意味ではありません。(筆者は当初そういう意味だと思っていました。)
:::

しかし、2023試験(筆者受験)は、
論理設計が **2題** 、物理設計とSQL設計の融合が1題という構成でした。

#### 論理設計

筆者は最初から論理設計、SQL設計の狙いを定めていましたが、
**論理設計問題は午後2試験の完全下位互換です**
すなわち、
* 午後1論理設計によって午後2の基礎能力を育む
* 午後2論理設計だけ極めていたら必然的に午後1もできるようになる

という2通りの対策が考えられます。

具体的な問題内容は午後2試験の節で解説します。

#### SQL設計

**SQL問題** は、少なくとも対策書に書いてある命令を把握する必要があり(命令に関する知識問題が出題される)、手書きで穴埋めできるようにする必要があります。

筆者はSELECT, WHEREだけを主に使うだけの実装経験はありましたが、SQLのコンセプトは事前に把握していたので、あとは命令を覚えるだけという形でした。
しかしSQL全く書いたことないという場合は、一回SELECT, WHEREだけでも実装してみないとイメージしにくいまま勉強するハメになるかもしれません。

#### 解答速度

重要なこととして、IT資格には珍しく、 **午後1試験は速解きが必要です**
2023は論理設計2題選択者は最後まで解き終わらなかったという受験者がツイッター上に大量発生しました。

しかし、過去問を通じて真面目に解答戦略を練れば(後述)、しっかり速解きできます。

### 午後2試験
人々によると難所、ほとんどの人はここで落ちるとのことです。
まあ、 **本試験のメインディッシュ** であるという認識で間違いないです。

例年、物理設計・論理設計の2題が出題され、その内1題を選択する形になります。

#### 論理設計
最初に10ページ程度の要件が文章で書かれ、最後に
* 関係スキーマ
* 概念データモデル

の **補完** がメインです。

例年これに加え、 **後半** で、例えば要件の欠陥(このような条件に遭遇したらポイントが正常に付加されない)を指摘するなど、 **ちょっとした記述** もあります。

ただし2023試験は、 関係スキーマ・概念データモデル補完 **のみ** のストロングスタイルでした。

#### 概念データモデル
![IMG_2647.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/067fce16-29fa-2fb9-77e5-a440e7322b9f.jpeg)
2023年試験午後2問題ページ26から引用、手書きは筆者受験時の書き込み。

**概念データモデル** とは、それぞれの **概念** の関係を線・矢印( **リレーション** )で繋げる、という設計です。

実際に解答用紙に同様の図が書いてあり、それに矢印や線を書き加えるという方式です。(採点者も大変)

線・矢印の種類には記法がありますが、それはご自身の勉強で把握してください。

#### 関係スキーマ
![IMG_2648.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/e9135abc-9758-8bfd-3878-64dc505a8ae1.jpeg)
2023年試験午後2問題ページ27から引用、手書きは筆者受験時の書き込み。

関係スキーマは、厳密にいうとちょっと違いますが、イメージとしては型やインデックスを決めない **テーブル設計** です。

図にあるような穴埋めを手書きで入れていきます。
下線は主キー、点線は外部キーを表現していますが、自分で主キー外部キーの選択をする必要もあります。

## 対策プロセス
大学受験時代、価値判断と事実認識がぐちゃぐちゃになっている合格体験記というものがあまり好きでなかったので、筆者の **実際の経験** と、そこから推論した **筆者の推奨** を明確に分けて書きたいと思います。

### 実際の経験
事実だけを客観的に書きます

#### 対策前筆者の状況
中高6年間はずっとゲームのプログラマーをしており、大学1、2回生になってサーバーサイドも少しやるようになりました。

フリーランス的に公式Discord Botの作成を受託し、Herokuのデータベースを用いてSQLも扱ったこともあります。(というよりも、ちゃんとSQLを使った機会はこれしかありません)
ただ、データベース設計には全く無頓着で、正規化など全く存在すら知らない、とううところでした。
(ちなみに、データベースへの問い合わせを並列処理化しなかったために、大規模遅延が発生し、数千人規模のエラーを起こしました。あの震えが忘れられません)

IT資格に関しては、大学2回生上旬に **基本情報技術者試験**の(当時)午前問題に **合格** し、(当時の)午後試験に **寝坊** しました。

文面だけ見ると意味が分からないかもしれません。、CBT方式で午前試験、午後試験をそれぞれ指定時刻に受験することができましたが、午後試験を朝早くに指定してしまったためスヤスヤ逃しました。

によって、**午前1試験に関しては、全くの初見というわけではありません**

それと、ペーパーテストそのもののテクニックに関しては、東大入試の理科・英語（時間に対して作業量が多い！！）を通じて **速解きの心得** を身に着けています。

#### 戦略確定
インターネッツの情報をもとに戦略を立てます。

ブラウザの履歴にあった参考サイト
* [データベーススペシャリスト試験に3週間でギリギリ一発合格しました！【勉強方法と教材まとめ】](https://qiita.com/shiva_it/items/b4661d479eb1dbfd3692)
* [王道の解き方シリーズ](https://www.seplus.jp/it-exam-guide/guide/prep4pm2_db/)
 これはかなり詳しく回答プロセスに言及しています
* [データベーススペシャリスト試験についてまとめてみた](https://note.com/bunsekiya_tech/n/nbd0f552daafd#8c011c65-b2fc-4c25-8a31-870e1eb25caf)
* [DBスペシャリストに受かったんで勉強法を書きます（#50）](https://oguemon.com/blog/2021-12-17/)
* [応用情報技術者試験に合格する勉強方法・対策](https://qiita.com/drken/items/42e54d5c43d4d7815ed4)

これらを総合して、
* なんかよくわからない概念（設計図のこと）がメインに出されるので、とりあえず基礎からやろう
* [(全文PDF・単語帳アプリ付)徹底攻略 データベーススペシャリスト教科書 令和5年度](https://book.impress.co.jp/books/1122101156)がいいらしい
* 午前1, 2は過去問道場を暗記すればいい
* **物理設計はやらなくていい**、**論理設計とSQLに絞る**
* **論理設計頑張る**
* 過去問やる

という方針でいいのかなと思い立ちます。

#### 基礎学習
通っている大学の夏休みが2か月、8月+9月で、8月初旬より学習を開始しましたが、実は8月中某国へ旅行していたため、実質夏休み期間を利用したのは **9月の一か月間だけ** でした。

ネットで定番とされているこの本を、単純に頭から読み始めました：[(全文PDF・単語帳アプリ付)徹底攻略 データベーススペシャリスト教科書 令和5年度](https://book.impress.co.jp/books/1122101156)

この本は基礎理論から始まり、初見でもちゃんと学習できる構成になっています。

**最初の2章は頑張って覚えようとしましたが、3章の「データベース設計」の演習問題で実は暗記はいらないということに気づき、以降スラーっと読むだけにしました。**

章末の演習問題の論理設計では、基本的な問題の雰囲気を掴めたものの、 **ちゃんと正答するプロセスがわからないまま本書が終わってしまいました。**

#### 午前1, 2対策
午前1対策として、 **事前準備なし** に、[応用情報の過去問道場](![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/f48d66b5-b63e-91c4-99a5-642509c7df28.png)
)は9月初旬から開始しました。
[けんちょんさんによると](https://qiita.com/drken/items/42e54d5c43d4d7815ed4)、直近2回は使われず、その前の8回からの **使いまわし問題** で40%を占めるとのことなので、

このような設定にして、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2602537/cc688a41-7874-df4b-46c3-4a1876f55d81.png)
**解答の選択肢を暗記しました**

**アカウント登録すると過去に間違えた問題だけに絞って繰り返す** ことができますが、これが0問になるまで、すなわち **全問を正答できるまで** 行いました。

なお、一周目完了時には正答率40％で、2週目以降は残りの60%に取り組みます。

問題数自体は多いですが、この中にも使いまわしにより重複している問題、あるいは他の問題の解説を読んでいれば解ける問題などもあるため、実質的な暗記量は見た目よりいくらか少ないです。

前述の通り1年前に基本情報午前合格できる程度の知恵はあったので、正答できなくとも、特に解説を読む段階で理解できないことはありませんでした。

**午前2試験** は、午前1と同様に [過去問道場](https://www.db-siken.com/dbkakomon.php)で対策しました。

時期的には、[(全文PDF・単語帳アプリ付)徹底攻略 データベーススペシャリスト教科書 令和5年度](https://book.impress.co.jp/books/1122101156)
の通読


#### 試験2週間前
試験2週間前の10月。もちろん大学は始まり、講義中の内職により試験対策時間が増えます（良くない）

[(全文PDF・単語帳アプリ付)徹底攻略 データベーススペシャリスト教科書 令和5年度](https://book.impress.co.jp/books/1122101156) の最後にある過去問を解きましたが、なかなかうまくいかない。特に概念データモデルの繋げ方がよく理解できず、解説にもあまり納得できませんでした。（関係スキーマは文章をちゃんと読めば時間をかけて埋められます）

当時の悩みとしては、「これとこれは関係ないとは言い難いのに、線が引かれていないのはどうしてだろう？」というものが多発しました。

このままの認識では正答に辿り着けないと痛感し、さらに解答テクニックについてインターネッツで調査しました。

その結果、こちらの2点に遭遇
* [王道の解き方シリーズ](https://www.seplus.jp/it-exam-guide/guide/prep4pm2_db/)
 先述にも紹介。
* [情報処理試験まとめwiki　データベーススペシャリスト試験の勉強法まとめ](https://shiken.wiki.fc2.com/wiki/DB)

特に後者のサイト、まだまだ知らない解答テクニックが存在することに気づきました。（[上記サイト](https://shiken.wiki.fc2.com/wiki/DB)「勉強テクニック　午後1＆午後2」の節を参照）

独特の言い回しを暗記しろ、などという。

そのサイトで参照されていた[情報処理教科書 データベーススペシャリスト 2023年版](https://www.shoeisha.co.jp/book/detail/9784798179919)を購入。

こちらはなかなか妙な構成で、序章でいきなり解答テクニックから始まり、その後に、基礎理論、物理設計を飛ばしてSQL, 概念データモデル, 関係スキーマの基本説明の3章立てです。

よって構成的には **初学者向けではありません**。　その代わり、 **解答テクニックに関してはどの情報リソースよりは多い** です。

この参考書を、目的であった序章だけを読んだので、2時間ほどで用済みになりました。

また、概念スキーマの先述の疑問に関しては、[データベーススペシャリストドットコム掲示板](https://www.db-siken.com/dbbbs.php?display=sp)に質問したところ、解決しました。

解答戦略に関してまとめて後述します。

これらの追加学習をもとに、過去問計4年分に取り組みました。解説は比較して良いと判断した[情報処理教科書 データベーススペシャリスト 2023年版](https://www.shoeisha.co.jp/book/detail/9784798179919)の過去問解説を利用。

**初回は時間が足りませんでした** が、その際に出題形式を把握し、東大入試攻略の要領でその後の3年分を間に合って解きることができるようになりました。

#### 試験本番

先述のとおり、午前1試験の問題量が多く、時間切れ受験生が多かった年ですが、時間に困らず突破、そのまま合格しました。

解答テクニックに関しては後述します。

### 主観的な推奨勉強法
:::note warn
主観的なお話であり、再生産性は保証できません
:::

#### 午前1
ある程度IT知識を持っていれば、 **事前準備なしに過去問道場を暗記** すればよろしいかと思います。

本番も過去問道場と全く同じ問題がほぼ半分を占め、残りも **過去問道場の解説を読んでいれば** (≠暗記)、その断片的な知識で解けます。

IT知識を持っていない場合、問題文そのものが理解できない可能性は十分にありえます。腐っても「応用情報技術者」の問題ですからね。
その場合は、基本情報ないし応用情報の教科書を一通り理解(≠暗記)すればよいかと思います。

範囲自体が広いので応用情報の教科書の方が分量が多いのですが、 **問題文・解説を読めるようにする** という目的で基本情報の教科書で大丈夫であると考えています。
**どちらにせよどうせ過去問道場を暗記する** ので。

#### 午前2
こちらも [(全文PDF・単語帳アプリ付)徹底攻略 データベーススペシャリスト教科書 令和5年度](https://book.impress.co.jp/books/1122101156) を通読（≠暗記）して基礎素養を作ってからから、 **過去問道場暗記** すればよろしいかと思います。

ここにおける基礎素養とは、データベースの基礎理論から実用も含まれます。
例えば関係演算（テーブル同士の和差積商など）や、分散DBの扱い方などですね。

ちょっとした実装経験（DBサーバーを借りてきてSQLで操作）ぐらい知識では、午前2をカバーできないかと思います。

#### 午後2; 論理設計
午後2は午後1論理設計を内包するので、 **先に午後2からお話します。**

午後2論理設計問題は **速解き** が重要になります。
によって、
* **時間を考慮した 解答戦略**
* **時間を意識した過去問練習**

が必要になります。

まず、 **正答に辿りつくプロセス** については[情報処理教科書 データベーススペシャリスト 2023年版](https://www.shoeisha.co.jp/book/detail/9784798179919)の **序章** が手厚いです。というか、これを読まないとあまり良く分からないかと思います。分かりませんでした。

そして、 **時間内に解き終わる戦略** を立ててください。
東大入試からの経験として、 **速解きは演習量でごまかせず、明確に戦略を立てて事前に計画する必要がある** ことを言いたいと思います。

僕個人の（~~高校生時代に担当されてしまった教師たちに反発して培った~~）勉強思想としては、なんでもかんでも「基礎力」という情報量の小さい曖昧な言葉に帰着させ、とりあえず基礎強化（これも曖昧）をすればいいという主張が嫌いです。

この試験の場合であれば、「過去問いっぱいやるとそのうち解答速度上がって間に合うでしょ！」という楽観視ではなく、「どうすれば間に合うか」を計画するべきだと考えています。

例えば、この試験の時間消費のボトルネックになっているのは、（ほとんどの場合） **要件文の長さ** であることは間違いないかと思います。
この10ページもある文章をもとに解答しないといけないわけですが、これを全部ゆっくり読んで解くか。僕は無理です。（実は、受験の文脈ではこれでも速く解けてしまう方もいて、試験対策は千差万別だと実感します）
高速に処理する手段として、
* 先に問題を読んで要件はその箇所だけ読む、他は飛ばし読みする
* 一度ざっと速読してパラグラフ構成を把握してから、問題をみて把握しておいた箇所から情報を抜き出す

いろいろあると思います。自分が間に合う戦略を立ててください。
筆者の戦略は次章で紹介します。

#### 午後1試験; SQL問題
[(全文PDF・単語帳アプリ付)徹底攻略 データベーススペシャリスト教科書 令和5年度](https://book.impress.co.jp/books/1122101156)に出てきた命令の動作を把握したら大丈夫です。
記述解答なので、自分で書けるようにしましょう。特に前置詞など2単語がセットになっているものはよく狙い撃ちされます。（基本的なところでいくとORDER **BY**など）

場合によっては、「このSQLの実行によって想定される行数（ただし一様分布にしたがうとして）」のような計算問題が出題される年がありますが、普通の割合の算数ができれば大丈夫でした。

## 論理設計問題の解答戦略
東大英語、理科対策を流用した僕個人の戦略をご紹介します。
皆様に適用できるかは分かりません。

東大受験生のみなさんは同様のことを東大理科や英語や共通テスト英語でやるといいかもしれません。

### 問題文を先に読む
僕は問題文（≠要件文）を先に読みます。
読むことで把握することは
* 要件文 **全て** 読むべきか、**部分的に済む** か
    年によって 
    * 関係スキーマの変数が全て空欄で、要件文全て読んで埋めていくことが要求されるとき
    * 関係スキーマのほんの一部だけが空欄で、そこ箇所だけピンポイントで取得できればよい

    などがあるかと思います。まずは要件文の情報の **全て** が必要か、 **断片** が必要か、その二択で全体戦略が二分されます。

* **エンティティ名** の穴埋めがあるか
 要するに宝探しをする必要があるかどうかですね。もし **関係（エンティティ）の属性名** であれば、その関係名を走査すればいいです。しかし、エンティティ名そのものが穴埋めだと、これを把握せずに要件文を処理して、なんと穴埋めが必要でした！もう一回読む！だとタイムロスです。 **最初の段階で宝探しする対象を把握して一度の要件文の処理で済ませたいです。**

### 関係スキーマを先に埋めて、その後に概念データモデルを埋める
先述の「これとこれは概念的・イメージ的には関係があるはずなのに、どうして線を引かないんだろう...」という疑問に対する答えでもあります。

概念データモデルは、 **DB上での関係があるときのみ** 線を引きます。

すなわち、**関係スキーマを先に埋める** と、外部キーなども書いているので、必然的に **DB上の関係** が明らかになります。
すると完成した **関係スキーマに従って線を引くだけ** です。

一つ注意点として、 **サブタイプ** に関しては関係スキーマからは分からない（特に多重継承）ので、そこは **要件文から取得** せねばらならないです。

### 要件文の処理
要件文を処理しますが、（問題文が許す限りにおいては）全て読むことは最初から考えていません。
文章は全て重要！！飛ばさない！！という意見を聞いたことがあるかもしれませんが、この試験は **無駄な（＝解答に利用しない）文が多いです。** 飛ばしましょう。 

今までの傾向からすると、たいてい **関係スキーマ表の関係名は登場順に並んでいます**
よって、穴埋めのある関係名だけを、 **表の上から順に** 見ます。
そして、 **ターゲットの関係名が見当たる段落だけを読んで属性名を埋め**、それ以外の段落は飛ばします。

一つテクニックというほどでもないですが、 **飛ばした段落は後から分かるように印をつけておく** と、情報の不足に気づいたときにその段落をまず参照してみればいいことが分かりますね。

この段階で
* 補完する属性名
* 属性名が主キーか外部キーか
* サブタイプ関係は存在するか

の3点をクリアにします。
これらを明示するキーワード・言い回しは[情報処理教科書 データベーススペシャリスト 2023年版](https://www.shoeisha.co.jp/book/detail/9784798179919)にある通りです。

## 合格してみて
データベーススペシャリストになりましたが、 [データベースの王、データベースキング](https://qiita.com/uts1_6/items/11e348ead4bae71571b8)になったかというと、そうでもありません。

データベースの保守や性能調整に関する知識は全くないです。スケーリングとか言われてもわかりません。
ちゃんと、大規模サービスの運用に耐えうるDBを設計しろと振られたら、少なくとも **僕には無理です**

しかし、 **上手な論理設計の知識** は間違いなくつきました。ちょっくら小規模プロジェクト用に使うようなSQL文で操作するだけで済む高級（エンジニア文脈）DBなら、 **テーブル設計は上手になるので** うまく使えるようになります。
プログラミングにおけるオブジェクト指向設計に似通っていますが、もしこのような設計に慣れていない **プログラマー** がいれば、是非とも推奨したいと感じました。

## 応用情報試験よりコスパはいい？
僕は応用情報を受験すらしていないので、主観的というよりも乱雑な判断になりますが、応用情報受けるぐらいならデータベーススペシャリストの方がいいと感じています。

午前1はどうせ同じだし、午前2はかなり簡単だし、午後1午後2は過去問ゲーで解き方覚えれば攻略できる──
と考えたら実は(午後試験で単語暗記をして複数分野勉強しないといけない)応用情報よりコストは同等かそれよりも低く、パフォーマンスはIPA定義のランク上では上位なので、かなりお得であるように思いますね。

オススメです。

## 最後に
動機は、データサイエンスやる上で自分でデータベース準備できないと実務的にダメだよね、という思いでしたが、やってよかったです。
履歴書の空欄である資格欄も埋まるし。

:::note
いいね頂けると泣きながら喜びます><
:::

[情報処理技術者の資格持ちを雇うのってどれだけ難しいんだろ？と調べてみたら東大生よりレアだった件](https://qiita.com/R_Tachigawa/items/fe634ad8be2721121720)という記事がありましたが、データベーススペシャリスト東大生の僕は [レアの王、レアキング](https://qiita.com/uts1_6/items/11e348ead4bae71571b8)ということですかね。