毎週の参加と毎週の質問の間の関連付けを正規化する方法は?
-
05-07-2019 - |
質問
ユーザーが複数の質問の正解を選択する必要があるコンテストシステムを実装しています。毎週、新しい質問のセットがあります。 ユーザーの参加をデータベースに保存する正しい方法を見つけようとしています。現在、次のデータモデルがあります。
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を回答に追加しても役に立ちません。
この情報を表す正しい方法は何ですか
解決
テーブルParticipationのIdフィールドを削除し、テーブルParticipationの構成/連結プライマリキーとして(UserId、WeekId)を使用できます。テーブルAnswerのParticipationIdフィールドは、テーブルParticipationへの外部キー参照としてペア(UserId、WeekId)に置き換える必要があります。データベースシステムで許可されている場合は、テーブルQuestionのテーブルAnswer to reference(Id、WeekId)のフィールド(QuestionId、WeekId)を定義できます。たぶん、このためには、前の表Questionでペア(Id、WeekId)のインデックスを定義する必要があります。
他のヒント
本当に参加をその週に関連付ける必要がありますか?質問から取得できます
だから:
- Answer(Id、UserId、QuestionId、Value)
- Question(Id、WeekId、Text)
- Week(Id、StartDate)
個人的には、ここに適切な実装があると思います。
ParticipationIdは、参加のIDにリンクします。これは、ユーザーと週にキーが設定されます。質問テーブルには、WeekIdもキーとして設定されます。
したがって、適切な参照がずっとあります。そうでない場合は、データを表示する必要があると思います