問題形式仕様書¶
このドキュメントでは、アプリで対応する問題形式とそのDB設計について説明します。
対応する問題形式¶
| 形式 | 説明 |
|---|---|
| 単一選択 | 複数の選択肢から1つを選ぶ |
単一選択 (single_choice)¶
複数の選択肢から正解を1つ選ぶ形式。
例:
Q: 日本の首都はどこですか?
- [ ] 大阪
- [x] 東京
- [ ] 京都
- [ ] 名古屋
特徴: - 選択肢は2〜10個程度 - 正解は必ず1つ
YAMLサンプル(画像なし):
# 令和7年度 ITパスポート 公開問題 問1
id: 18477eaa-639a-4515-b21c-90b924341c16
type: single_choice
text: |
A社がB社に作業の一部を請負契約で委託している。
作業形態a〜cのうち、いわゆる偽装請負とみなされる状態だけを全て挙げたものはどれか。
a B社の従業員が、A社内において、A社の責任者の指揮命令の下で、請負契約で取り決めた作業を行っている。
b B社の従業員が、A社内において、B社の責任者の指揮命令の下で、請負契約で取り決めた作業を行っている。
c B社の従業員が、B社内において、A社の責任者の指揮命令の下で、請負契約で取り決めた作業を行っている。
choices:
- "a"
- "a, b"
- "a, c"
- "b, c"
correct: 2
explanation: |
偽装請負とは、請負契約でありながら発注元が直接指揮命令を行う状態。
a と c は A社が指揮命令しているため偽装請負に該当する。
YAMLサンプル(画像あり):
# 画像を含む問題の例
id: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
type: single_choice
text: |
次の図に示すネットワーク構成において、適切なサブネットマスクはどれか。
images:
- 908539e6-441c-4a9f-b215-9ddf931bcc12
- 1e288534-47ff-4f1b-aa5d-31cdb0c9c022
choices:
- "255.255.255.0"
- "255.255.0.0"
- "255.0.0.0"
- "255.255.255.128"
correct: 0
explanation: |
図から必要なホスト数を計算し、適切なサブネットマスクを選択します。
DB設計¶
テーブル一覧¶
questions # 問題(共通)
├── question_images # 問題と画像の中間テーブル(N:N)
│ └── images # 画像マスター
└── questions_single_choice # 単一選択問題
└── questions_single_choice_choices # 選択肢
workbooks # 問題集
└── workbook_questions # 問題集と問題の紐付け
questions(共通)¶
| カラム | 型 | 説明 |
|---|---|---|
| id | BIGSERIAL | 主キー |
| type | VARCHAR(50) | 問題形式(single_choice など) |
| created_at | TIMESTAMP | 作成日時 |
| updated_at | TIMESTAMP | 更新日時 |
images(画像マスター)¶
| カラム | 型 | 説明 |
|---|---|---|
| id | BIGSERIAL | 主キー |
| path | VARCHAR(512) | 画像ファイルのパス(UNIQUE) |
| created_at | TIMESTAMP | 作成日時 |
特徴:
- 画像ファイルはdata/images/に配置
- 1つの画像を複数の問題で使い回すことが可能
question_images(問題と画像の中間テーブル)¶
| カラム | 型 | 説明 |
|---|---|---|
| question_id | BIGINT | 問題ID(FK) |
| image_id | BIGINT | 画像ID(FK) |
| order_index | INT | 画像の表示順 |
主キー: (question_id, image_id)
特徴: - 問題と画像の多対多(N:N)の関係を管理 - order_indexで問題ごとの画像表示順を管理
questions_single_choice(単一選択問題)¶
| カラム | 型 | 説明 |
|---|---|---|
| id | BIGSERIAL | 主キー |
| question_id | BIGINT | 問題ID(FK, UNIQUE) |
| text | TEXT | 問題文 |
| explanation | TEXT | 解説 |
| created_at | TIMESTAMP | 作成日時 |
| updated_at | TIMESTAMP | 更新日時 |
questions_single_choice_choices(選択肢)¶
| カラム | 型 | 説明 |
|---|---|---|
| id | BIGSERIAL | 主キー |
| single_choice_id | BIGINT | 単一選択問題ID(FK) |
| choice_index | INT | 選択肢の順番 |
| text | TEXT | 選択肢テキスト |
| is_correct | BOOLEAN | 正解かどうか |
workbooks(問題集)¶
| カラム | 型 | 説明 |
|---|---|---|
| id | BIGSERIAL | 主キー |
| title | VARCHAR(255) | 問題集タイトル |
| description | TEXT | 問題集の説明 |
| created_at | TIMESTAMP | 作成日時 |
| updated_at | TIMESTAMP | 更新日時 |
workbook_questions(問題集と問題の紐付け)¶
| カラム | 型 | 説明 |
|---|---|---|
| workbook_id | BIGINT | 問題集ID(FK) |
| question_id | BIGINT | 問題ID(FK) |
| order_index | INT | 問題の順番 |
主キー: (workbook_id, question_id)
問題集(Workbooks)¶
問題集は複数の問題をグループ化したもので、問題との間に多対多の関係を持ちます。
特徴: - 1つの問題集に複数の問題を含めることができる - 1つの問題を複数の問題集に含めることができる - order_indexで問題集内の問題の順番を管理
YAMLサンプル:
id: e5a7c8d2-1234-5678-9abc-def012345678
title: 令和7年度 ITパスポート 公開問題
description: 令和7年度のITパスポート試験公開問題です。全100問。
questions:
- 18477eaa-639a-4515-b21c-90b924341c16 # 問1
- b74a5c68-3f04-448f-b75d-7be751284d9e # 問2
- b2a33757-de17-4fb4-9c4f-7ad52860d75c # 問3
# ... 以下100問まで
今後の拡張予定¶
- 複数選択
- 記述式
- 穴埋め
- 並べ替え
- マッチング