こんにちは。九条です
教材の開発はあまり順調とは言えませんが、進んでおります。
開発において最も重要となるテーブル定義ができたため、今回はそれを公開します。
リレーショナルデータベースが分かる方であれば、これを見れば何となく動作のイメージが掴めるかもしれません。
個人的に、この記事を書く作業は、読んで理解できる方がいないとしても無駄ではなく、記事を書く過程でテーブル定義の誤りに気付くことができたので役に立ちました。
<2020/10/06>修正を行いました。
決まり事
プリフィックス「master_」のテーブルは、ユーザが更新することを想定していないテーブルです。
プリフィックス「save_」のテーブルは、ユーザが更新することを想定したテーブルです。
master_kamoku(科目マスタ)テーブル
科目を表します。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
_id | INTEGER | (Primary Key) | 科目ID |
kamoku_name | TEXT | 〇/×/NULL | 科目名 |
implemented_flag | BOOLEAN | ×/×/FALSE | 実装済みフラグ(*1) |
exists_taikenban | BOOLEAN | ×/×/FALSE | 体験版の有無(*2) |
price | INTEGER | ×/〇/NULL | 価格:円/月(*3) |
AUTO INCREMENT: _id
(*1)その科目の問題が完成しているかどうかを表します。完成していない科目はグレイアウトして表示されます。
(*2)その科目を体験版として実行できるかを表します。体験版として実行した場合は広告が付きます。FALSE の場合は、課金しない限り実行自体できません。
(*3)価格が NULL の場合は「未定」を表し、0の場合は「無料」を表します。
master_attribute(属性マスタ)テーブル
問題に付与する属性を表します。例えば、司法書士試験の問題なのか、行政書士試験の問題なのか、宅建の問題なのか、です。今のところ管理人は司法書士試験以外の法律系資格資格に合格していませんが、将来合格した場合に、それらに対応するために存在するテーブルです。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
_id | INTEGER | (Primary Key) | 属性ID |
attribute_name | TEXT | 〇/×/NULL | 属性名 |
AUTO INCREMENT: _id
master_question (問題マスタ)テーブル
問題を表します。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
_id | INTEGER | (Primary Key) | 問題ID |
kamoku_id | INTEGER | 〇1/×/NULL | 科目ID |
sortkey | INTEGER | 〇1/×/NULL | 整列用 |
kubun | INTEGER | ×/×/NULL | 問題区分(*1) |
title | TEXT | ×/×/NULL | タイトル |
statement | TEXT | ×/〇/NULL | 問題文(*2) |
comment | TEXT | ×/〇/NULL | 解説文 |
hint | TEXT | ×/〇/NULL | ヒント(*3) |
time_limit | INTEGER | ×/〇/NULL | 目標時間(秒)(*4) |
rank | VARCHAR(1) | ×/〇/NULL | 問題ランク(*5) |
random_flag | BOOLEAN | ×/×/TRUE | 肢の順序をランダムにするフラグ(*6) |
pf_flag | BOOLEAN | ×/×/TRUE | 改ページフラグ(*7) |
deleted_flag | BOOLEAN | ×/×/FALSE | 削除済みフラグ(*8) |
Foreign Key 制約:kamoku_id ⇒ master_kamoku._id
Index:kamoku_id, sortkey の複合(名称:index1)
AUTO INCREMENT: _id
(*1)1:単純正誤、2:単一選択、3:複数選択、4:列挙、5:列挙(ヒント有り)、6:本番形式の過去問
単純正誤とは肢1個が提示され、正誤を判定する問題です。
単一選択とは、例えば次のような問題です。
意思無能力者の行為は(①取り消すことができる。②無効である。)①と②をラジオボタンで表示し、いずれかひとつだけを選択できます。
複数選択とは、選択肢がチェックボックスで複数提示され、複数選択可能な問題です。
列挙とは、「○○をすべて挙げなさい。」という問題です。例えば次のような問題です。
会社の解散原因をすべて挙げなさい。
列挙(ヒント有り)とは、列挙の問題にヒントを表示するボタンを追加した問題です。このボタンを押すと複数選択の問題になります。ヒントを利用した場合、その問題は正解扱いになりません。
本番形式の過去問はそのままの意味です。複数選択と動作は同じになりますが、念のために用意した区分です。
(*2)区分が単純正誤の場合は、肢が問題文そのものとなるため、問題文は NULL となります。
(*3)ボタンを押すとヒントが表示されます。ヒントを利用した場合は正解扱いになりません。
(*4)NULL の場合は目標時間(制限時間)が無いことを表します。
(*5)A, B, C のいずれかの値を取ります。A に近い程、優先して学習すべき問題であることを表します。目安としては次の通りです。
A:択一基準点突破レベル
B:択一 30/30 レベル
C:択一 33/33 レベル
NULL は、ユーザがランクで絞り込みをかけたとき、常にヒットすることを表します。
(*6)区分が、単一選択、複数選択、列挙(ヒント有り)、本番形式の過去問の場合、肢の表示順序をランダムにするかどうかを表します。
(*7)今のところ実装予定はありませんが、このフラグが TRUE の問題を提示したら、改ページします。FALSE の問題を提示したら、次の問題はその問題に引き続き表示されます。
(*8)問題が仮削除済みであるかどうかを表します。仮削除済みである場合は、アプリには表示されません。
master_choice(肢マスタ)テーブル
問題の肢を表します。問題マスタの区分が単純正誤の場合に、肢が複数存在する場合は、いずれかひとつをランダムに提示します。
例えば、同じ問題でも表示する度に次のように肢がランダムに切り替わります。
意思無能力者の行為は取り消すことができる。⇒×
意思無能力者の行為は無効である。⇒〇
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
question_id | INTEGER | (Primary Key) Unique:〇1 | 問題ID |
choice_id | INTEGER | (Primary Key) | 肢ID |
statement | TEXT | 〇1/×/NULL | 選択肢文 |
answer | BOOLEAN | ×/〇/NULL | 正誤(*1) |
Foreign Key 制約:question_id ⇒ master_question._id
(*1)NULL の場合は、出題疑義により正誤を判定できない問題です。ユーザが正誤どちらを選択しても正解扱いになります。
master_link(リンクマスタ)テーブル
問題の解説とともに表示するインターネット上のコンテンツへのリンクを表します。例えば、問題の解説から Wikibooks の条文解説にリンクを張りたいときに使用します。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
question_id | INTEGER | (Primary Key) | 問題ID |
link_id | INTEGER | (Primary Key) | リンクID |
link_text | TEXT | ×/×/NULL | リンクテキスト |
link_url | TEXT | ×/〇/NULL | リンク先 URL |
Foreign Key 制約:question_id ⇒ master_question._id
master_question_attribute(問題属性関連付け)テーブル
問題と属性の関連付けを表します。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
question_id | INTEGER | (Primary Key) | 問題ID |
attribute_id | INTEGER | (Primary Key) | 属性ID |
rank | VARCHAR(1) | ×/〇/NULL | 問題ランク(*1) |
Foreign Key 制約:question_id ⇒ master_question._id
Foreign Key 制約:attribute_id ⇒ master_attribute._id
(*1)問題マスタの問題ランクと重複しますが、重ねて設定することができます。
例えば、問題マスタの問題ランクが A であれば、司法書士試験の問題としては A ランクであることを表しますが、このテーブルで、行政書士試験の問題としては B ランクと言うように追加の設定をすることができます。
save_kamoku(科目セーブ)テーブル
ユーザがどこまで問題を解いたかを表します。
科目マスタと1対1のリレーションになりますが、科目マスタはアプリのアップデートの際にテーブルがドロップされることになります。その場合でも保存し続けなければならないため、テーブルを分けています。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
kamoku_id | INTEGER | (Primary Key) | 科目ID |
question_id | INTEGER | ×/×/NULL | 問題ID |
Foreign Key 制約:kamoku_id ⇒ master_kamoku._id
Foreign Key 制約:question_id ⇒ master_question._id
save_history(解答履歴セーブ)テーブル
ユーザの問題に対する正解と不正解の履歴を表します。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
question_id | INTEGER | (Primary Key) | 問題ID |
result_date_time | DATETIME | (Primary Key) | 解答日付 |
result_kubun | INTEGER | ×/×/NULL | 正誤(*1) |
Foreign Key 制約:question_id ⇒ master_question._id
(*1)1:正解、2:不正解、3:時間切れ
save_question(問題セーブ)テーブル
ユーザの「お気に入り」の問題を表します。
問題マスタと1対1のリレーションになりますが、問題マスタはアプリのアップデートの際にテーブルがドロップされることになります。その場合でも保存し続けなければならないため、テーブルを分けています。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
question_id | INTEGER | (Primary Key) | 問題ID |
star_flag | BOOLEAN | ×/×/TRUE | お気に入りフラグ |
Foreign Key 制約:question_id ⇒ master_question._id
save_tag(付箋セーブ)テーブル
ユーザが問題に付けた付箋を表します。
フィールド名 | データ型 | Unique/Nullable/Default | 備考 |
question_id | INTEGER | (Primary Key) | 問題ID |
tag_id | INTEGER | (Primary Key) | 付箋ID |
statement | TEXT | ×/×/(空文字列) | 付箋文 |
Foreign Key 制約:question_id ⇒ master_question._id
今回は以上です。
設計ミス等あれば、コメントか「お問い合わせ」からご指摘お願いいたします。
コメント