0

私は、ユーザーが複数の質問の正解を選択しなければならないコンテストシステムを実装しています。毎週新しい質問があります。 データベースへのユーザー参加を格納する正しい方法を見つけようとしています。私が思いついた唯一の解決策は、次の図に示すように、質問と参加を関連付け回答テーブルを追加することです毎週参加と週間質問との関連を正規化する方法は?

Participation      Week 
+--------------+     +--------------+ 
| Id   |  +----------->| Id   |<-+ 
| UserId  |  |   | StartDate | | 
| WeekId  |-----+   +--------------+ | 
+--------------+         | 
            Question   | 
            +--------------+ | 
            | Id   | | 
            | WeekId  |--+ 
            | Text   | 
            +--------------+ 

Participation      Week 
    +--------------+     +--------------+ 
+->| Id   |  +----------->| Id   |<-+ 
| | UserId  |  |   | StartDate | | 
| | WeekId  |-----+   +--------------+ | 
| +--------------+         | 
|          Question   | 
|  Answer      +--------------+ | 
|  +------------------+ +---->| Id   | | 
+------| ParticipationId | |  | WeekId  |--+ 
     | QuestionId  |----+  | Text   | 
     | Value   |   +--------------+ 
     +------------------+ 
今私は、以下のデータモデルを持っています

私はこのソリューションをリンクしていないので、別の週の質問に回答することができます。 WeekIdを回答に追加することは役に立ちません。

この情報を表す正しい方法は何ですか?

答えて

1

テーブルParticipationのIDフィールドを削除し、テーブルParticipationの作成/連結主キーとして(UserId、WeekId)を使用できます。テーブルParticipationへの外部キー参照として、ペア(UserId、WeekId)で置き換えなければならないテーブルのParticipationIdフィールドが返されます。データベースシステムで許可されている場合は、テーブルQuestionの参照(Id、WeekId)テーブルにフィールド(QuestionId、WeekId)を定義することができます。おそらくこれのために、質問の前のテーブルのペア(Id、WeekId)にインデックスを定義する必要があります。

0

あなたは本当にその週に参加する必要がありますか?

  • 回答(ID、ユーザーID、QuestionId、バリュー)
  • 質問(同上、WeekId、テキスト)
  • ウィーク(ID、開始日)
  • :あなたは

    そこで質問を通してそれを得ることができます

+0

これは同じ参加が別の週の回答を持つことを妨げるものではありません。 –

0

個人的に私はここに適切な実装があると思います。

ParticipationIdは参加者のIDと、ユーザーと週をキーにしてリンクします。あなたの質問表はWeekIdとキーイングされています。

したがって、適切な参照がすべてあります。これが当てはまらない場合は、データを参照する必要があると思われます。

関連する問題