質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

リソース

効果的な演算のために必要となる、メモリ・ディスク容量・CPUの性能や環境のこと。

Q&A

1回答

2326閲覧

【DB設計】親モデルの条件によって子モデルに格納する情報が変わる場合のDB設計の仕方

sun_peace

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

リソース

効果的な演算のために必要となる、メモリ・ディスク容量・CPUの性能や環境のこと。

1グッド

0クリップ

投稿2020/03/13 05:19

前提・実現したいこと

現在、クイズアプリを作成しています。問題を表示して、ユーザーが回答し、その回答が合っているか間違っているか、また、正解は何かを表示するアプリをイメージしてください。

今回はそのアプリのなかで、複数の問題形式を持つquestionテーブルとその答えとなるanswerテーブルに関するDB設計のベストプラクティス/おすすめ方法を知りたいと思い質問しました。
アプリはPython/Djangoで作成していますが、DB設計に関することであり、他言語を扱う方であっても、ご教示いただけることがあれば回答いただけると幸いです。

Python:3.7.6
Django:3.0.4
データベース:mysql

発生している問題

(1)まず、クイズ自体(question)は、下記のような問題形式(question_type)を持っています。
(基本的にはクイズのデータ登録は運営サイドで行おうと考えています。)

①択一問題 : 14の選択肢のどれかが正解
②複数選択問題 : 1
4の選択肢の内、複数の選択肢の組み合わせが正解
③正誤問題 : →○か×どちらかが正解
④記述問題 : 正解は"福沢諭吉"など
⑤複数記述問題 : 1位は"アメリカ"、2位は"日本"など複数の記述を求める
⑥穴埋め問題 : 文章中に穴があり、そこに適切な解答を埋める
⑦並び替え問題 : 14の選択肢を適切な順番に並べる
⑧組み合わせ問題 : 1
4の選択肢とA~Dの選択肢が適切な組み合わせになるように選ぶ
⑨大問 : Questionを複数もつ(このquestion自体には解はない)

(2)上記を考えると、下記のようなデータが必要であると考えています。
①や②に関しては、複数の選択肢(Choice)と、どの選択肢が答えなのかが情報として必要
③に関しては、マルが正解がバツが正解かの情報が必要
④、⑤、⑥に関しては、(必要に応じて複数の)答えの情報が必要
⑦に関しては、複数の選択肢と、どの選択肢の順番が正解なのかの情報が必要
⑧に関しては、複数の選択肢とどの組み合わせが正解なのかの情報が必要
⑨に関しては、どのquestionが小問なのかの情報が必要

(3)これら上記の情報をどんなテーブルにどのように持たせるか、リレーションをどのようにするべきかについて悩んでいます。

試したこと

そこで、いくつか自分でもDBの構成を考えて見ました。
A 下記のように子モデルをたくさんぶら下げるDBの設計
モデル登録やViewでの表示などは、if question_type == "something"で条件分岐させて行う予定。
あんまり見たことのない設計のような気がして…かつif文多用によって美しくないような気がする。
(true_or_falseは③のため、right_or_wrongは①②のchoiceが正解)
イメージ説明

B answerテーブルを一纏めにして、情報をすべて持たせてquestionテーブルとanswerテーブルの2つにする設計
しかし、これだと、他のquestion_typeで必要な情報も持たせているため、結果的に空のカラムとなる部分が多い。
イメージ説明

C というか上二つとも、answerという名前のテーブルだが、間違いである選択肢もanswerテーブルに入ってる。そもそも選択肢と答えがちゃんと機能として切り離されていない!!というとこで選択肢(choice)を切り離そうと思い。
でも、④⑤⑥はただ単純にanswerが必要で、かつ複数になることもあるので、④⑤⑥の答えを持たせるanswerを作る。③の正誤かどうかの答えの置き場所が困り、questionに入れてしまう。また、結局choiceには答えのchoiceかどうかが合ったり、気持ち悪い。
イメージ説明

問題と答え、そして問題の選択肢などを上手くまとめられる方法やこういうやり方もあるよ。というのがあればご教示いただきたく。よろしく御願いします。

補足

カラム名の補足です。下記の情報のために必要だと考えています。
true_or_falseは③正誤問題用の、正誤確認(Boolean)
right_or_wrongはその選択肢が正解かどうか(Boolean)
comination_contentは⑧組み合わせ問題用の組み合わせの対象の文
right_sortingは⑦、並び替え問題用の答え(0~3などの並び替え順序の番号が入る)

s.k👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

なんともいえませんが、設問形式が違うなら

  • それにあったテーブルを用意するか
  • JSON型で質問,回答を持ち、プログラム側で適当に処理するか

が妥当だと思います

投稿2020/03/13 05:28

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問