2010-12-13 93 views
2

我工作的测验项目,我想以这样的方式创建MySQL结构:MySQL数据库结构有助于

questionID:的唯一问题标识号(主键)
testID:一个独特的测试识别号码(问题属于这个测试)(主键)
questionOrder:测验问题内的问题的顺序,即这个问题是测验中的第n个问题。我希望这个值来自mysql,这样当我向db插入一个新问题时,我不必计算它
一个问题可以在多个不同的测试中。

我有几个问题:
1)我有下面的代码,但我得到:
不正确的表定义;可以只有一个自动列,它必须被定义为一个键
我该如何解决这个问题?

2)此结构不允许问题属于多个测验。任何想法来避免这种情况?

3)你认为这个结构是好的/最佳的,你能提出更好的建议吗?


CREATE TABLE `quiz_question` (
    `questionID` int(11) NOT NULL auto_increment, 
    `quizID` int(11) NOT NULL default '0', 
    `questionOrder` int(11) NOT NULL AUTO_INCREMENT, 
    `question` varchar(256) NOT NULL default '', 
    `answer` varchar(256) NOT NULL default '', 
    PRIMARY KEY (`questionID`), 
    UNIQUE KEY (`quizID`, `questionOrder`), 
    KEY `par_ind` (`quizID`, `questionOrder`) 
) ENGINE=MyISAM; 

ALTER TABLE `quiz_question` 
ADD CONSTRAINT `0_133` FOREIGN KEY (`quizID`) REFERENCES `quiz_quiz` (`quizID`); 

CREATE TABLE `quiz_quiz` (
    `quizID` int(11) NOT NULL auto_increment, 
    `topic` varchar(100) NOT NULL default '', 
    `information` varchar(100) NOT NULL default '', 
    PRIMARY KEY (`quizID`) 
) ENGINE=MyISAM; 

感谢您阅读本文。

回答

1

1)每个表只能有一个AUTO_INCREMENT列。这应该是关键。一般来说,它是PK的一部分。

2)“测验”将是由问题组成的实体。你应该有3个表: 1 - quiz_question:quest_id,提问,回答 2 - quiz_quiz:quiz_id,主题,信息 3 - quiz_fact:quiz_id,quest_id,quest_order

测验和问题表中保存了每个项目(测验/问题)信息。 quiz_fact定义测验的组成方式(此测验按此顺序包含此问题)。

3)我唯一的建议是使用Drizzle代替; )但是,严肃地说,玩弄东西 - 经常是“足够好”的。如果它适合您的需求,为什么修补?否则,一旦你有这个和运行(即我的查询在这样和那样的操作上太慢),你可以问更详细的问题。

1

从questionOrder字段中删除AUTO_INCREMENT

只要让MySQL在questionOrder字段中设置值,那么在后续的UPDATE查询中这样做。通常情况下,您希望使用管理工具的测试管理员能够调整问题的顺序。在这种情况下,您只需输入比先前排序值最高的初始值+1(在该测试中)。然后,你可以让他们调整它像调整Netflix队列的方式:)

1

1)订单是否增加自己。数据库只会在PK的一部分时才会这样做。您可以通过制作包含订单栏的组合键来破解它,但它不值得。

2)将quiz_question重命名为question(quiz_quiz为quiz)。创建一个名为quiz_question的新测验问题连接表。它应该有测验ID和问题ID,将测验与问题联系起来。由于同一问题在不同测验中会有不同的顺序,因此会将问题顺序放在新的测验问题上。您不再需要问题表上的测验ID。