試験の成績についてDBに保存しているのですが、保存テーブルはこのようになってます。
+---------+-------+
| Shiken | kaito |
+---------+-------+
| buturi1 | 1 2 3 |
+---------+-------+
試験と回答がそれぞれに紐付けられていて、回答は半角スペースでじゃんじゃん放り込むというシンプルなものです。
特に複雑なものではないのでいまのところ問題はないのですが、回答部分についての設計がこれでいいのか?どうか?というがあります。
この構造にするに至った理由は
・試験自体がシンプルであったこと(成績が確認出来さえすればよかったため)
・回答1個につきジャンジャンinsertしていたら膨大な数になるのでは?と思ったこと
・単にSQLの知識がなかったのでこれでいいかという考え + これでも問題なく動いたので
ということもあって今の構造になっています。
これをもっと効率よくしようとした場合はやはり回答用の別テーブルを作って1解答ごとにinsertしていくほうがよいのでしょうか?
なにぶんデータベースの作法もままならない部分がありますのでアドバイスいただければと思います。
>これをもっと効率よくしようとした場合はやはり回答用の別テーブルを作って1解答ごとにinsertしていくほうがよいのでしょうか?
普通はそうです。
データが少なくても、教科書通りに作ってしまいますね。
>回答1個につきジャンジャンinsertしていたら膨大な数になるのでは?と思ったこと
膨大な数って何件のことなのか不明ですが
通常はそういうのは気にしないんです。
実際にそう作ってみて、
性能に問題があるとかそういう場合に見直す程度です。
今のPCの性能でそんな心配は要らないと思います。
効率に関しても、INSERTが1回ですむとか10回かかるとか程度も
関係ないというか意識しませんね。
>試験と回答がそれぞれに紐付けられていて、回答は半角スペースでじゃんじゃん放り込むというシンプルなものです。
>特に複雑なものではないのでいまのところ問題はないのですが、回答部分についての設計がこれでいいのか?どうか?というがあります。
ほかの要件などがわからないのでなんとも言いがたいですが、
プロでもこういう設計をする場合もあります。
実際にこのような形式でデータを保存している業務システムもあります。
一概に悪いとも言いがたいのですが、
プロでも意見が分かれる話なので、こうしたい場合にはやはりそれなりの理由が必要と
いうことになります。
逆に言うと、教科書どおりにDBを正規化して構造のものは
少々効率が悪くても、誰もおかしいとは言い出しません。
実践的データモデリング入門 (DB magazine selection)
真野 正
決して美しい構造とは言えませんが、quocardさんがやりたいことを行う上で、この設計で性能上問題がなく、また、このデータを使った処理もシンプルに済むのであれば、ひょっとしたら最善な方法である可能性もあります。
quocardさんがどのようなものを管理したく、また、そのデータを使ってどんなことをしたいのかを挙げてもらえれば、もっとこうした方がいいよとか、これで十分なんじゃない?とか言えるかと思います。
今のところ特にはないのですが、仮に機能を拡張する場合
・成績だけでなくどの問題の間違いが多いか?
・最後までやっているか?
とかの機能を追加しようとした場合に、これではマズいかな~と思ったりもしたのですが。
今後のことを視野にいれた場合にもっとよい方法があったのではと考えたりもします。
1.そもそも何を管理している?
カラムが、試験名と回答しかないのですが、単純に想像すると、ユーザごとに回答ってあるのではないかなと思ったりします。また、今は、ユーザごとにテーブルを作ってるのですか?
2.問題数は固定?
試験名が入っているので、複数の試験の情報を管理できるようにしたいと思うのですが、回答は数字で答えられるものだけであるとして、問題数は試験が変わっても固定でしょうか?
3.試験はどうやって管理している?
各設問の正答率を計算するとなれば、各設問の正当の情報が必要だったり、試験によって問題数が違えばその問題数なんかも管理する必要があるかと思います。
実際には試験を行って、その結果を入れています。
テーブルは「試験問題」「ユーザー」「試験の解答」の3つのみになります。
>>2.問題数は固定?
もしかしたら将来は変更したいと思うかもしれませんが問題数は今のところ固定ですが
将来に渡って確定しているわけではありません。
>>3.試験はどうやって管理している?
試験問題の中に問題と正解と選択肢が入っています。
なので回答を見る際に、選択された回答と試験問題に設定されている正解を比較して一致していれば正解として表示しています。
ですので回答が増えたり、複雑になったりした場合は1個のカラムに詰め込むのは生産性が悪いのかな?と思っています。
これは個人的な意見ですが、御自身で問題意識がないのであれば、今のままでいいのではないかと。
コメントに書かれている通り、将来どうなるかの予測が立たず、かつ、現状に不満を感じていないのであれば、変える理由は少ないのかなと。
逆に言えば、回答が整数で表現できなくなったときとか、何かの集計が非常に繁雑になり、それがデータの構造で解決できると判断した時に変えた方がより適切な形にできるのじゃないかなと。