MySQL db结构帮助

时间:2010-12-13 22:41:39

标签: 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;

感谢您阅读本文。

3 个答案:

答案 0 :(得分:1)

从questionOrder字段中删除AUTO_INCREMENT

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

答案 1 :(得分:1)

1)订单会自行增加。只有当它是PK的一部分时,DB才会这样做。您可以通过制作包含订单列的复合键来破解它,但这不值得。

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

答案 2 :(得分: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; )说真的,玩弄东西 - “足够好”经常是。如果它符合您的需求,为什么要修补?否则,一旦你完成并运行,你可以提出更详细的问题(即我的查询在这样的操作上太慢了。)