2012-10-01 77 views
3

我需要一個名爲「問題」的數據庫表的幫助。我想知道哪些佈局了兩部下面更好的,當涉及到主鍵:哪種佈局更適合此數據庫表?

問題表方法1:

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

在上表中,QuestionId和會話ID是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是自動遞增的,所以不需要任何其他主鍵。

+0

你可以有'auto_incremented'列PK,和多列'UNIQUE'指數。 – hjpotter92

回答

3

我覺得這兩種情況都不好!你給PK的意義,但PK的應該沒有意義。

只需讓您的PK a 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)。從答案看,它可以用於很多問題(1:n)。對於many:many關係,你需要一個額外的表。

這裏是一個YouTube做一些額外的解釋:http://www.youtube.com/watch?v=RXOj0D80kRg

+0

我想知道如果我做另一列,並使主鍵INT(11)自動增量(讓我們叫它questionIndex),這是否可以說我有另一個表「Student_Answer」表,我可以鏈接兩個表使用questionId在這兩個表中還是其中一個字段必須是關鍵字段? – user1701484

+0

我更新了我的答案,我會盡力爲你做一個例子 – JvdBerg

+0

增加了一個例子。 – JvdBerg

0

標準化:

表會話: ID

表問題: ID(INT 3)自動增量PK SESSION_ID varchar255 QuestionContent (varchar800) 標記(int 3)

表答案: ID自動遞增的PK question_id(引用問題(ID)) 內容varhcar(255)