从具有列表的实体创建数据库表

时间:2014-12-10 16:34:49

标签: java mysql database-design uml

我正在创建一个让教授创建测试的应用程序。每个考试都由教授创建的n个问题组成。

我有一个问题实体:

public class Question {
    private int questionID;
    private int testID;
    private String question;
    private String answer;
    private int points;

    public int getQuestionID() {
        return questionID;
    }

    public void setQuestionID(int questionID) {
        this.questionID = questionID;
    }

    public int getTestID() {
        return testID;
    }

    public void setTestID(int testID) {
        this.testID = testID;
    }

    public String getQuestion() {
        return question;
    }

    public void setQuestion(String question) {
        this.question = question;
    }

    public String getAnswer() {
        return answer;
    }

    public void setAnswer(String answer) {
        this.answer = answer;
    }

    public int getPoints() {
        return points;
    }

    public void setPoints(int points) {
        this.points = points;
    }
}

我有一个测试实体:

import Question;

public class Test {
    private int testID;
    private int courseID;
    private String testName;
    private List<Question> questions;

    public int getTestID() {
        return testID;
    }

    public void setTestID(int testID) {
        this.testID = testID;
    }

    public int getCourseID() {
        return courseID;
    }

    public void setCourseID(int courseID) {
        this.courseID = courseID;
    }

    public String getTestName() {
        return testName;
    }

    public void setTestName(String testName) {
        this.testName = testName;
    }

    public List<Question> getQuestions() {
        return questions;
    }

    public void setQuestions(List<String> questions) {
        this.questions = questions;
    }

}

测试实体有问题列表,我不知道如何将其变成表格。我宁愿避免表中的多值字段用于测试。

可能解决方案的一个想法是在数据库中创建一个有助于映射问题的表。我可以称之为TestQuestion,它将具有TestID(int):QuestionID(int)作为其列。 Test表将包含列(testID,courseID,testName)。然后,当我查询测试时,我还在TestQuestion表中查询问题列表,并将其放入测试实体的列表中。

我想通过良好的实践来做到这一点。

1 个答案:

答案 0 :(得分:1)

您的类定义显示每个Question实例属于一个Test实例,因为您在Question类中只有一个testId,而不是testIds列表。另一方面,单个测试可能有多个问题。所以Test和Question之间的关系是一对多的。

为了将这些实体实现到数据库模式中,您只需要2个表,这些表通过将测试ID作为外键加入到Question表中来加入:

Test(id, course_id, test_name, ...)
Question(id, test_id, question, answer, ...)

查询以获取属于测试的所有问题:

SELECT *
FROM Question
WHERE test_id = 1

查询以获得所有测试及其相应的问题:

SELECT *
FROM Question, Test
WHERE Question.test_id = Test.id
GROUP BY Question.test_id