2010-12-13 10 views
2

私はクイズのプロジェクトに取り組んでいると私は、このような方法で、mysqlの構造を作成したいこと:MySQLのDB構造のヘルプ

questionID:ユニークな質問識別番号(主キー)
テストID:ユニークなテスト識別番号(このテストに属する質問)(プライマリキー)
questionOrder:クイズの質問内の質問の順序、つまりこの質問はクイズのn番目の質問です。この値をmysqlから取得して、dbに新しい質問を挿入するときに計算する必要はありません。
複数の異なるテストに1つの質問があります。

私が持っている質問のカップル:
1)I持って、次のコードが、私は得る:
不正なテーブル定義。自動列が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)テーブルごとに1つのAUTO_INCREMENT列しか持てません。それは鍵でなければなりません。一般的には、PKの一部です。

2)「クイズ」は質問で構成されるエンティティです。 quest_id、質問、 2に答える - quiz_quiz:quiz_id、話題、情報 3 - quiz_fact:quiz_id、quest_id、quest_order

クイズと質問のテーブルごとのアイテムを保持する - quiz_question 1:あなたは3つのテーブルを持っている必要があります(クイズ/質問)情報。 quiz_factは、クイズがどのように構成されるかを定義します(このクイズには、この順番でこの質問があります)。

3)私の唯一の提案は、代わりに霧雨を使用することです。 )真剣に、しかし、物事で遊ぶ - 「十分に良い」はしばしばです。それがあなたのニーズに合っていれば、なぜ汚れ?それ以外の場合は、これを実行してから詳細な質問をすることができます(クエリの実行が遅すぎるなど)。

1

questionOrderフィールドからAUTO_INCREMENTを削除します。

MySQLがquestionOrderフィールドに値を設定している限り、その後のUPDATEクエリでそれを行います。通常は、管理ユーティリティを使用してテストの管理者が質問の順序を調整できるようにします。その場合、(テストで)最も高い以前の発注値よりも高い初期値を入力するだけです。次に、Netflixキューを調整する方法のようなものに調整させることができます:)

1

1)自分で注文を増やしてください。 DBは、それがPKの一部である場合にのみ行います。注文列を含むコンポジットキーを作成してハッキングすることはできますが、それは価値がありません。

2)quiz_questionの名前をquestionに(quiz_quizをquizに)変更します。 quiz_questionという新しいクイズ質問結合テーブルを作成します。クイズIDと質問IDが必要です。質問にクイズをリンクしてください。同じ質問が異なるクイズで異なる注文をするので、は、新しいquiz_questionに質問の順序を入れます。質問表でクイズIDが必要なくなりました。