私はオンライン試験モジュール用の webapp を作成していますが、現在の設計と抽象化をどのように改善できるか疑問に思っていました。試験は選択式です。
これまでのところ、データベースには 3 つのテーブルがあります。
1.試験
- Exam_id(プライマリ、自動インク)
- 試験名 - 例:「物理学」など
- num_questions
- time_per_question
- points_per_question
2.質問
- question_id - 主キー、auto_inc
- Exam_id - 試験中の Exam_id を参照する FK、更新および削除時 - カスケード
- question_text - 実際の質問自体
- question_figure - 質問に画像が添付されている場合のファイル名 (例: graph.jpg)。ヌルにすることができます
- question_category
- question_name - 一意の varchar、質問を識別するための何か (このフィールドを使用する予定なので、回答オプションを追加するための参照がありますが、不要のように感じます)
3.答え
- answer_id - PK、auto_inc
- question_id - 質問の下の question_id を参照する外部キー。更新/削除時にカスケード
- answer_text
- answer_correct - 正しい答えかどうかを示す小さな int
- answer_name - 一意、varchar、回答への参照、質問への question_name と同じ
これは私がクラスについて念頭に置いていることです:
public class Exam
{
private int Id;
private String name;
private int timePerQuestionInSeconds;
private int pointsPerQuestion;
private int numberOfQuestions;
private ArrayList<Question> questionList;
}
public class Question
{
private int Id;
private int examID;
private String text;
private String figure;
private String category;
private String name;
private ArrayList<Answer> answers;
}
public class Answer
{
private int id;
private int questionId;
private String text;
private boolean correct;
private String name;
}
したがって、試験を受けるには、exam から selectbyexamname を選択し、次に question から selectbyexamId を選択し、次に answer から selectbyquestionid を選択する必要があります。次に、これらの結果セットを取得してオブジェクトにマップします。
代わりに、JPA を使用してこれらのエンティティを永続化する場合、エンティティの ArrayList を永続化することは可能ですか? そして、私はクラスの試験でそれで正しいですか
@OneToMany(targetEntity=Question.class、mappedBy="examID")
プライベートArrayList(質問);
そしてクラスの質問で私は持っているべきです
@ManyToOne
プライベート試験ID;
望ましい関係をセットアップするには?ところで、私は Java SE を使用しているので、Java EE が持っている Bean をすべてサポートしているかどうかはわかりません。
また、学生が受けた試験のスコアを保存する方法も必要です。私は、学生IDへのfkを持つテーブルスコアを持つことを考えていました。学生IDでそのテーブルをクエリして、学生のスコアを返すことができました。