データベーススペシャリスト試験を振り返って　～早く理解していれば良かったと思うこと～

今年から、弊社の新入社員はデータベーススペシャリストを受験することになりました。
これを機に私も新入社員と一緒に受験し、令和5年度のデータベーススペシャリスト試験に合格できました！
この経験を基に、「早めに認識・理解しておけばよかった」と個人的に感じた上位3つのことを紹介しようと思います。
これからデータベーススペシャリスト試験受験をする方の一助になれば幸いです。

# 勉強を始めた2023年6月の状態
・2022年4月から株式会社ジールのSIerとして、Google Cloud基盤の保守運用案件に従事。
・2022年10月に応用情報技術者を取得。（午後試験でデータベースは非選択）
・普段の業務で、簡単なSQL文（SELECT文をUNION ALLする程度）を作成。
・テーブル設計の経験なし

# 1つ目：午後Ⅰ試験はとにかく試験時間がない

データベーススペシャリストは午前Ⅰ/午前Ⅱ/午後Ⅰ/午後Ⅱ の全試験で6割以上取得すると合格です。
午前Ⅰ及び午前Ⅱは一問一答形式の選択問題なのですが、午後Ⅰ及び午後Ⅱは関係スキーマを記述したりする筆記問題になります。
筆記である午後試験の各問に対して、1ページにかけられる時間を評価してみました。（令和5年度）
|試験区分|試験時間|ページ数|1ページ当たりの時間|
|:-:|:-:|:-:|:-:|
|午後Ⅰ問1|45分|6ページ| 7.5分|
|午後Ⅰ問2|45分|7ページ| 6.4分|
|午後Ⅰ問3|45分|7ページ| 6.4分|
|午後Ⅱ問1|120分|13ページ| 9.3分|
|午後Ⅱ問2|120分|9ページ| 13.3分|

※午後Ⅰ試験は3問から2問選択で90分の試験時間のため、1問当たり45分を割り当てました。
ページ数だけでは一概に評価できないですが、午後Ⅰは午後Ⅱに比べ1ページに対する時間が少ないです。
実際私も、午後Ⅱより午後Ⅰの方が時間に余裕がありませんでした。

#### 対策
- 何を解くか決めておく
　午後Ⅰは選択問題のため試験時間内にどの問題を解くか判断しなければなりません。
　この判断時間を短くできるように、予めどの分野の問題を解くか決めておきましょう。
- 問題を解くときは、必ず時間を計る
　現状の力で解き時間がどの程度足りないのかを知るために、必ず時間を計って問題を解きましょう。
- 設問を先に読む
　設問内容が分からない状態で問題文を読むと、戻って読む回数が多くなります。
　問題文を読んだときに設問と関連があると気づけるように、設問を先に読みましょう。

 # 2つ目：関係スキーマの読み取り方
概念データモデルや関係スキーマを作成する問題を解く際に、文章から情報をとれずに苦戦しました。（国語力がないといえばそれまでですが。。。）
私は対策に記載したことを意識してから少しずつ解けるようになりました。

#### 対策
- 文章の主語はエンティティタイプ、目的語は属性であることが多い
>文章例
>BPは、BPコードで識別し、BP名を持つ。

　上記の文章例の主語であるBPはエンティティタイプであり、目的語であるBP名は属性と読み取れます。
　また「～で識別し」と書いてあれば、主キーとなります。　
　従って、上記文章例から下記の様な関係スキーマが読み取れます。
>関係スキーマ
>BP (<INS>BPコード</INS>, BP名)

- 「～区分で分類する」ときたら、クラスを考える
>文章例
>問合せの媒体は、Web上の問合せフォームか電話による通話である。
>いずれであるか媒体区分で分類する。

「いずれであるか媒体区分で分類する」と記載されているので、"Web上の問合せフォーム"と"電話による通話"がサブタイプになります。
またスーパータイプは、最初の文書の主語である”問合せ”になります。

- 関係スキーマの図も大きなヒントになっている
>文章例
>予約（<INS>施設コード</INS>, <INS>予約番号</INS>, ・・・）
>　会員予約（<INS>施設コード</INS>, <INS>予約番号</INS>, 会員番号）
>　非会員予約（<INS>施設コード</INS>, <INS>予約番号</INS>, 名前・・・）

上記の様に、関係スキーマの図中にはインデントが記載されているパターンがあります。
インデントを見つけたらサブタイプになっていると判断して良いと思います。

また、問題文中には明記していない（or 見つけられらない）けど関係スキーマに外部キーとして記載されているケースもあります。この時は概念データモデルにリレーショナルがあるかを確認しましょう。実は、問題文を見なくても関係スキーマ図から概念データモデルにリレーションを引け、得点が稼げるパターンもあります。

 # 3つ目：トランザクションで問題発生するポイント
 私はトランザクションの問題がとても苦手でした。処理が並列で実行されるため、文章もわかりにくく、イメージも難しかったです。
手間ですが下記対策の様にトランザクションをメモ用紙に書き出して、共有ロックから専有ロックに変わる箇所と処理の順番に注目しながら解き慣れていきました。

#### 対策
- 一連の処理の流れ（トランザクション）を並べて書く
記述例（今回は同じトランザクション処理が並列に実行されることを想定します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580760/f00e55f6-4e1c-ea68-8c09-e52eb7a46192.png)

- トランザクションに共有ロック中なのか専有ロック中なのかを書く
基本的にはSELECT文は共有ロックになり、UPDATE文は専有ロックになります。
記述例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580760/b4405fa4-a016-89dd-2265-aa6f5ba6969f.png)

- トランザクションまたは専有ロックする場合の順番を書く
トランザクションでは、処理する順番や更新する順番は重要な情報になります。
記述例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3580760/d9d49368-47fd-0eca-ed41-7b0f662fafc0.png)

- トランザクションをずらして実行する場合と処理の順番に注目して、課題点を探す
トランザクション問題の多くは、下記2点の課題が多い印象です。
・共有ロック中に別のトランザクションが同じデータを参照して、別の処理を実行する
・処理の順番が異なるため、デットロックが発生する

上記記述例では、トランザクションT1の後に同じ商品に対してトランザクションT2が実行されると、「在庫数が不正になる場合がある」という課題がでます。
加えて、注文される商品順がトランザクションT1とT2で逆順となっていればデットロックが発生します。

# 最後に
テーブル設計等の経験がないため勉強にかなりの労力をかけましたが、データベースについての知識を網羅的に勉強できる良い機会でした。
データベーススペシャリストは、経験が少ない中でも対策をしっかりしておけば合格できる試験だと思います。
これから受験をする方は、頑張ってください！
ご拝読頂き、ありがとうございました。