1

質問

テーブルforeign keysに対して実行したいの設定は正しいアイデアであり、複数のフィールドを処理する外部キー制約の追加でSQLを作成する方法はありますか?Answer

セッションテーブル:

SessionId (PK) SessionName
1              AAA
2              AAB

質問表:

QuestionId(PK)  SessionId(PK)  QuestionContent
1               1              What is 2+2?
2               1              What is 3+3?
1               2              What is 4+4?
2               2              What is 5+5?

回答表:

AnswerId(auto, PK)  QuestionId(fk)  SessionId(fk)  Answer
1                   1               1              A
2                   1               1              D
3                   2               1              C
4                   2               1              A
5                   1               2              True
6                   2               2              A
7                   2               2              B

今私が抱えている問題は、Answerテーブルの外部キーに関するものです。どの外部キーを実行するのが正しいか知りたいです。

私が行ったことは、外部キーを追加することです。SessionIdこれは、行をクリックすると、テーブル内のSessionIdと一致することを意味します。SessionIdSession

QuestionId次に、Answerテーブルにリンクしているテーブルに外部キーを提供すると思いましたQuestion。ただし、これに関する問題は、行内でをクリックすると、同じを含むのQuestionIdすべての行が表示されることです。だから私がこれを調べたいのなら:QuestionIdQuestionIdAnswer

AnswerId(auto, PK)  QuestionId(fk)  SessionId(fk)  Answer
1                   1               1              A

QuestionId上の外部キーをクリックすると、以下が出力されます。

QuestionId(PK)  SessionId(PK)  QuestionContent
1               1              What is 2+2?
1               2              What is 4+4?

Answerは、これらの両方の質問に属しているわけではなく、1つの質問にのみ属しているが、両方QuestionIdが同じであるため、両方の質問が表示されます。

したがって、私が考えているのは、ユーザーが行をクリックすると両方を検索し、その回答が属する質問とセッション(試験)を認識して以下に出力する外部キー制約が必要だということQuestionIdです。 :QuestionIdSessionId

QuestionId(PK)  SessionId(PK)  QuestionContent
1               1              What is 2+2?

私の質問は、2つのフィールドを処理する外部キー制約を作成する方法がわからないということです。また、正しく一緒に外部キーを設定することは正しいですSessionIdか?SessionId and QuestionId

4

2 に答える 2

3

次の構文を使用して Answers テーブルの複合外部キーを作成できます。

FOREIGN KEY (QuestionId, SessionId) REFERENCES Questions (QuestionId, SessionId)

SessionIdただし、主キーとしてその名前の列を使用するセッション テーブルがあることを考えると、質問テーブルの列が複合主キーの一部であることは奇妙に思えます。おそらくQuestions.SessionId、Sessions テーブルで外部キーを作成しQuestionId、標準の単一の主キーにすることを検討する必要があります。

SessionIdこれを行うと、Answers テーブルに列が必要ないことがわかります。

以下は、あなたができることの例です:

-- Sessions table
SessionId (PK) | SessionName

-- Questions table
QuestionId (PK) | SessionId (FK) | QuestionContent

-- Answers table
AnswerId (PK) | QuestionId (FK) | Answer
于 2013-01-06T02:35:16.523 に答える
2

正解です。現在のスキーマでは、Answerテーブルに2つのインデックスが必要です。SessionId列に1。SessionId列とQuestionId列に1つ。これを行う方法に関する投稿は次のとおりです。

MySQLの複数列の外部キー?

ちなみに、QuestionIdをID/自動にすることも検討するかもしれません。セッションごとにリセットされる付加価値を受け取っているかどうかわからない。必要なインデックスのいくつかを単純化するのに役立つ可能性があります。

于 2013-01-06T02:32:58.463 に答える