【教材開発】テーブル定義ができました。

プログラミング
この記事は約10分で読めます。

こんにちは。九条です

教材の開発はあまり順調とは言えませんが、進んでおります。

開発において最も重要となるテーブル定義ができたため、今回はそれを公開します。

リレーショナルデータベースが分かる方であれば、これを見れば何となく動作のイメージが掴めるかもしれません。

個人的に、この記事を書く作業は、読んで理解できる方がいないとしても無駄ではなく、記事を書く過程でテーブル定義の誤りに気付くことができたので役に立ちました。

<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


 

今回は以上です。

設計ミス等あれば、コメントか「お問い合わせ」からご指摘お願いいたします。

⇐管理人の Twitter を Follow したい方はこちら。

コメント

タイトルとURLをコピーしました