3

我需要一个名为“问题”的数据库表的帮助。当涉及到主键时,我想知道以下两种布局中哪种布局更好:

题表法一:

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,而是自增。

题表方法二:

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 是自动递增的,因此不需要任何其他主键。

4

2 回答 2

3

我觉得这两种情况都不好!你给 PK 赋予了意义,但 PK 应该没有意义。

只需使用外键将您的 PK aint(11) Auto Increment和链接表连接在一起。

更新

每个表都有自己的 PK。Questions 表有一个 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)。从答案来看,它可以用于许多问题(1:n)。对于many:many关系,您需要一个额外的表。

这是一个 youtube 做一些额外的解释:http ://www.youtube.com/watch?v=RXOj0D80kRg

于 2012-10-01T19:07:28.130 回答
0

标准化:

表会话:id

表问题: id (int 3) auto increment pk session_id varchar255 QuestionContent (varchar800) Marks (int 3)

表答案: id auto increment pk question_id (references questions(id)) content varhcar(255)

于 2012-10-01T19:12:46.637 回答