多选题检查的数据库结构

时间:2015-10-17 19:09:35

标签: mysql database hibernate

我正在为在线多项选择考试开发一个演示应用程序。 当然,每个问题都有多种选择。在问题屏幕上,候选人将选择其中一个选项,提交该选项并将导航到下一个问题。

我已经制定了以下表格结构。

CREATE  TABLE users (
  username VARCHAR(45) NOT NULL ,
  password VARCHAR(45) NOT NULL ,
  enabled TINYINT NOT NULL DEFAULT 1 ,
);

CREATE TABLE questions (
    id int(10) NOT NULL auto_increment
    question varchar(800) NOT NULL,
    right_option int(10) NOT NULL references options(id)
);

CREATE TABLE options (
    id int(10) NOT NULL auto_increment,  
    question_id int(10) NOT NULL references questions(id),
    option varchar(150) NOT NULL,              
);

CREATE TABLE exam_details (
    id  int(10) NOT NULL,
    username varchar(45) NOT NULL references users(username),
    date_of_exam date,
    exam_result varchar(10) NOT NULL, -- PASS/FAIL
    exam_score int(10) NOT NULL,      -- e.g. 40 
    no_of_questions int(10) NOT NULL  -- total no. of questions in the test
);     

CREATE TABLE user_answers (
    id  int(10) NOT NULL,
    username varchar(45) NOT NULL references users(username),
    question_id int(10) NOT NULL references questions(id),
    answer int(10) NOT NULL references options(id)
 );

数据库将是MySql。但请忽略语法,因为我只是想传达这个想法。请建议是否有更好的方法。
只是补充一点,我将使用spring&在服务器端休眠。

2 个答案:

答案 0 :(得分:3)

一旦你清理了一点,最大的一个是user_answers.username(它被去标准化),尝试这样的事情:

CREATE  TABLE users (
  id int(10) auto_increment primary key,
  username VARCHAR(45) NOT NULL ,
  password VARCHAR(45) NOT NULL ,
  enabled TINYINT NOT NULL DEFAULT 1
);

CREATE TABLE questions (
    id int(10) auto_increment primary key,
    question varchar(800) NOT NULL,
    right_option int(10) NOT NULL references options(id)
);

CREATE TABLE options (
    id int(10) auto_increment primary key,
    question_id int(10) NOT NULL references questions(id),
    `option` varchar(150) NOT NULL
);

CREATE TABLE exam_details (
    id int(10) auto_increment primary key,
    username varchar(45) NOT NULL references users(username),
    date_of_exam date not null,
    exam_result varchar(10) NOT NULL, -- PASS/FAIL
    exam_score int(10) NOT NULL,      -- e.g. 40 
    no_of_questions int(10) NOT NULL  -- total no. of questions in the test
);     

CREATE TABLE user_answers (
    id int(10) auto_increment primary key,
    userId int(10) NOT NULL references users(id),
    question_id int(10) NOT NULL references questions(id),
    answer int(10) NOT NULL references options(id)
);

然后,立即跳出来的唯一问题是user_answers.answer可以技术上保存为不同问题的答案。

最大的外卖就是永远不要使用答案表中的用户名。不能有多个同名的真实用户(大问题)。此外,如果用户名是拼写错误,则会在用户表中的一个位置更改。数据的完整性。加入这样的身份。

注意:auto_increment必须是主键,并且主键永远不能为NULL,因此在其旁边键入NOT NULL是多余的。只是说。

答案 1 :(得分:2)

我最近需要编写一个完全由数据库驱动且可由客户更改的问卷系统。

我最终将可能的答案存储为数据库中的JSON对象,然后根据问题ID存储给出的答案,但这会增加一些复杂程度。

如果每个问题都是多项选择答案,那么您的方法将是一种合乎逻辑的方法