1年目新人がデータベーススペシャリスト(DB)に一発合格した話

# この記事で読めること
- 私の略歴
- 私が実施した勉強法
- 令和５年度秋期試験を受けた感想

# 私の略歴
初めまして、えのきと申します。

ついこの前、IPA主催の令和5年度データベーススペシャリスト試験に無事合格しました。ので、これからはDBスペシャリストえのきとして活動して行きます。（半分冗談、半分ほんと）

【**私の簡単な経歴（DBスペシャリストを受ける前）**】
- AI題材の卒論やって、某大学情報系学部を卒業
  - データベースに関する授業は必修だったので、トランザクションなどの基礎知識はあった
  - Pythonでめっちゃ分析した
- 某事業会社のIT部門で、Webエンジニアっぽいことをやっている
  - 1年目なのでほぼ研修
  - JDBC（Java DataBase Connectivity）をかじったので、SQLは少し書ける

技術に触れてこなかった系人間ではないので、基礎的な部分はできていた方だったのではないかと思います。特に、会社の研修でSQLだけでなく、ER図の書き方や正規化、インデックスについて、近い先輩から教えてもらいつつ触れられたのはかなりアドバンテージだったと思います。

# 実践した勉強法
受験を決めたのは７月後半だったので、およそ2-3ヶ月の戦いでした。研修ばかりとはいえ、仕事もあったのでその中でいかに勉強時間を確保するかというのが難しく、学生時代にとっておけばよかった・・・と何度も思いました。その結果、勉強のスケジュールは以下のノリになりました。

- 7/16: 勉強の計画を立てる
- 7/17~7/31: インプットしてNotionにまとめ続ける日々
    - SQLいろいろ
    - 重要語句とされている部分の調査
    - インデックス
    - アンチパターン設計
    - 表領域
    - 概念データモデル
    - トランザクション
    - 障害回復機能
    - 関数従属性
    - キー
    - 正規化
    - 分散DB
- 8/1~9/30: 応用情報の勉強（午前I、午前II対策）
    - 応用情報の過去問道場を通勤時間にやる
        - DBの出題範囲は100%仕上げる
- 10/1~10/7: 午後の過去問とかなきゃなーと思いながら怠惰な日々を過ごす
- 10/8 午前試験終了後~午後試験終了前まで: 午後試験の過去問を解説しているYouTubeの動画を見ながら昼ご飯を食べる
    - [YouTube - データベーススペシャリスト試験　８０点超の解答テクニック　E-R図⇔関係スキーマ－【令和２年度向け　H31年春午後Ⅰ問１過去問解説】](https://youtu.be/LXjF7m_BXaA?si=ik4U5IL9RzZ2qp5L)

![当時のスケジュール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518330/b1ec5613-e018-baf9-9d23-c22bc69b7fe1.png)

あれ？なんか、記述の過去問は結局一度も解いてない気がするんですが？
→ はい、**怠惰**が原因で解きませんでした。（泣）

が、解説を見てその内容を理解しておくことは大事だと感じましたし、午前試験の過去問は4択で気軽にやれるのもあるので、しっかりやって応用情報レベルの知識も入れておくことが合格への近道だったのかもなーと感じています。

使った参考書はこれです。超無難な選択。

- [情報処理教科書 データベーススペシャリスト 2024年版](https://amzn.asia/d/aZpvRq5)の23年版
- [情報処理教科書 高度試験午前Ⅰ・Ⅱ 2024年版](https://amzn.asia/d/6SK2Ugx)の23年版

この中から特に効果的だったと感じた勉強法を下にいくつかピックアップします。

## まず勉強しないといけないことを洗い出す

> - 7/16: 勉強の計画を立てる

上記でもスケジュールの中にこういうものがありましたが、初手、何をやるか決めちゃったことが、結果につながったように感じています。

具体的にはこのように決めました。当時のメモを抜粋します。

### 知識範囲で捉える

- 概念データモデルと関係スキーマ
    - ER図
    - 関数従属性
    - キー
    - 正規化
    - 基本の業務知識
- SQL
- 物理設計
    - データ所要量
    - 性能
    - インデックス
    - 制約

### 試験日程で捉える

- 午前対策
    - 応用情報の問題
- 午後I対策
    - データベースの基礎知識
        - 関数従属性
        - 候補キー
        - 主キーと外部キー
        - 第○正規形である根拠
        - 第3正規形まで正規化
        - 更新時異状
    - SQL
    - 物理設計
        - インデックス
        - アクセスパス
        - オプティマイザ
        - トランザクションの同時実行制御
        - デッドロック
- 午後II対策
    - 概念データモデル
    - 関係スキーマ
    - 物理設計
    - データベース運用
    - 業務知識
        - 販売管理
        - 生産管理

## ひとまず重要キーワードだけ！(午後I対策）

当時のスケジュールを参考にしながら、何を勉強したのかを書いていきます。

### SQL

当たり前ですがSQLは当然のように出てきます。元から知ってはいたのですが、改めて知識を入れ直しました。知らなかったこともあったので、その辺については勉強用のNotionでまとめながら理解を深めました。

![当時のNotion](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518330/e03e1fa0-55b4-01fb-8669-29f6da464b19.png)

### インデックス

インデックスの概要から、具体的なインデックスの種類まで一通り自分でまとめるなどして勉強しました。

- B木
- B+木
- ビットマップ
- ハッシュ

### SQLアンチパターン

https://zenn.dev/yukito0616/articles/00ccc30b58e458

https://www.ketancho.net/entry/2018/03/07/080000

この辺の記事の内容を読んでまとめました。用語として試験に出てくるわけではないけれども、データモデルを作成する際の定石的なのがだんだん身についてくるような感覚がありました。

- ジェイウォーク
- ナイーブツリー

### 表領域

ディスク上の物理的なデータ格納領域のことです。どんな表領域の種類があるのか、特にユーザ表領域とはどんなものかをメインで学習しました。

- システム表領域
- 一時領域
- ログ表領域
- ユーザ表領域
    - テーブル用のユーザ表領域とインデックス用のユーザ表領域の違い

### 概念データモデル

書く際のルールについて勉強しました。

- スーパタイプとサブタイプ
- 自己参照リレーションシップ
- 強エンティティと弱エンティティ
- 多重度（カーディナリティ）

### トランザクション

元からある程度知っていたので、復習程度にやりました。特に、複数のトランザクションが走る際の排他制御周りの話は忘れていたので、重点的に復習しました。

- ACID
- 排他制御
    - ロック
    - デッドロック
    - 時刻印アルゴリズム
    - 隔離性水準

### 障害回復機能

障害の種類をまずは勉強し、障害の回復に必要な機能やファイル、そして具体的なロールバック・ロールフォワードの仕組みを学びました。また、ディザスタリカバリ（自然災害などによって発生するシステム障害）についても学びました。

- ログ
- バックアップ
- チェックポイント
- ロールバック
- ロールフォワード
- ディザスタリカバリ
    - RTO
    - RPO

## 過去問道場(午前I・午前II対策)

https://www.db-siken.com/dbkakomon.php

これをひたすらやります。通勤時間とか暇な時に。

応用情報相当の知識を蓄えつつ、特に、DBの出題範囲のところに関しては100%正解を目指せるように何度もやりました。

# 試験の感想
遅くなりましたが、試験の結果はこれです。

![DBSP結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518330/b1cec361-5662-4138-8d5e-51c1319fd103.jpeg)

ギリギリです。
というか、正直今でも受かったことが驚きくらいで、このような記事を書くのも若干おこがましいのですが、試験の感想を下に書いてみます。

実際の問題はこちら

https://www.ipa.go.jp/shiken/mondai-kaiotu/2023r05.html

## 午前I

マジで危なかった。

5割の自信でなんとか乗り切った感。DB系の問題は普通に余裕だったものの、大学時代に習ったような内容すらも忘れかけていたので、ギリギリでした。焦りすぎて真理値表の問題に関しては、勘違いで10min溶かし、試験中に汗だくになりました。

あとは、VRの問題が出ていたのが印象的でした。VRではないものの、以前、動画編集を趣味でやっていたのもあって、余裕で回答できちゃいました。経験が生きましたね。

## 午前II

逆にこっちはすらすら解けちゃいました。

DB問題を対策しまくっていたこともあって、その辺はOK。問題はセキュリティ分野のところでした。ただ、インシデントハンドルなんかは、知識というよりも当たり前のことを答えれば良いような内容だったので、技術の聖人となって正しく処理できたと思います。

## 午後I

過去問解いていないので、もちろん間に合わないです。

問1と問2を選択しましたが、問2はほぼ流し目でみて解けそうなところだけ時間いっぱい解くみたいな感じでした。それでも受かったのは問1を一生懸命解いたからですかね。

第○正規形かを理由とともに答える問題については、大学3年生のときに、データベースの講義でひたすらそういう旨のレポートを出されていたのを思い出して、答えることができました。

また、図の書き方についても、一度業務でER図を描く経験をしたことがあったのもあって、そんなに大変な作業ではなかったです。これは中間テーブルだなーとか思いながら描いた記憶があります。

## 午後II

午後Iと同様に、概念データモデルを完成させていく系問題の問2を選びました。

とにかく集中して問題を読み進め、虫食いになっているカラムを埋めて関係スキーマを完成させていった記憶があります。午後Iとは打って変わって、この1題に全力を注げば良かったので、時間的にはむしろ余裕がありました。

(余談) BPというハンドルネームの友達がいたのを思い出して、「BPコードwww」ってなりながら中学生みたいに問題を解いていました。

# まとめ

受かって良かったー。過去問は最悪解けなくても、基礎知識をちゃんと固めておいて、あとは解いている人の動画を見て解き方だけ。