2010-12-13 90 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。