哪个布局更适合此数据库表?

时间:2012-10-01 19:02:34

标签: mysql sql database

我需要一个名为“Question”的数据库表的帮助。我想知道在主键时哪个布局比下面两个更好:

问题表方法1:

QuestionId (int 3) PK
SessionId (varchar10) PK
QuestionContent (varchar800)
NoofAnswers (int 3)
AnswerId (int 5) Auto Increment
Marks (int 3)

在上表中,QuestionId和SessionId是PK(主键),AnswerId不是PK,但它是自动增量。

问题表方法2:

QuestionId (int 3)
SessionId (varchar10)
QuestionContent (varchar800)
NoofAnswers (int 3)
AnswerId (int 5) Auto Increment PK
Marks (int 3)

在上表中,只有AnswerId是PK和自动增量。但是,如果我这样做,这意味着包含QuestionId的其他表将必须链接到此表的QuestionId作为非键或类似的东西。

数据库不允许我为QuestionId,SessionId和AnswerId做PK,因为它说AnswerId是自动递增的,因此不需要任何其他主键。

2 个答案:

答案 0 :(得分:3)

我认为两种情况都不好!你给PK一个意思,但PK应该没有意义。

只需将您的PK设为int(11) Auto Increment,并将表与外键链接在一起。

<强>更新

每张桌子都有自己的PK。问题表有一个QuestionId PK。

将表绑定在一起取决于表的关系。 1:1关系,1:many关系和many:many关系有不同的方案。

示例:

CREATE TABLE `Questions` (
  `QuestionId` int(11) NOT NULL AUTO_INCREMENT,
  `AnswerId` int(11) DEFAULT NULL,
  PRIMARY KEY (`QuestionId`),
  KEY `FK_Answer` (`AnswerId`),
  CONSTRAINT `FK_Answer` FOREIGN KEY (`AnswerId`) REFERENCES `Answers` (`AnswersId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `Answers` (
  `AnswerId` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`AnswerId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

从问题看,一个问题(1:1)只能有一个答案。从答案来看,它可用于许多问题(1:n)。对于many:many关系,您需要一个额外的表格。

以下是youtube正在做一些额外的解释:http://www.youtube.com/watch?v=RXOj0D80kRg

答案 1 :(得分:0)

归一化:

表会话: ID

表问题: id(int 3)自动增量pk session_id varchar255 QuestionContent(varchar800) 标记(int 3)

表答案: id auto increment pk question_id(引用问题(id)) content varhcar(255)