Как нормализовать связь между еженедельным участием и еженедельными вопросами? - PullRequest
0 голосов
/ 30 июля 2009

Я внедряю систему соревнований, в которой пользователь должен выбрать правильный ответ на несколько вопросов. Каждую неделю появляется новый набор вопросов. Я пытаюсь найти правильный способ хранения участия пользователей в базе данных. Прямо сейчас у меня есть следующая модель данных:

 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 к ответу не помогает.

Как правильно представлять эту информацию?

Ответы [ 3 ]

1 голос
/ 30 июля 2009

Вы можете удалить поле Id в таблице Участие и использовать (UserId, WeekId) в качестве составного / объединенного первичного ключа для таблицы Участие. Поле ParticipationId в таблице «Ответ» необходимо заменить парой (UserId, WeekId) в качестве ссылки внешнего ключа на таблицу «Участие». Если ваша система баз данных это позволяет, вы можете определить поля (QuestionId, WeekId) в таблице Ответ на ссылку (Id, WeekId) в таблице Вопрос. Может быть, для этого вам нужно определить индекс по паре (Id, WeekId) в таблице Вопрос раньше.

0 голосов
/ 30 июля 2009

Лично я думаю, что у вас есть правильная реализация здесь.

ParticipationId ссылается на идентификатор участия, который указывается пользователем и неделей. Ваша таблица вопросов также имеет идентификатор WeekId.

Следовательно, у вас все время есть правильные ссылки. Если это не так, я думаю, нам нужно будет увидеть некоторые данные

0 голосов
/ 30 июля 2009

Вам действительно нужно связать участие с его неделей? Вы можете получить его через вопрос

Итак:

  • Ответ (Id, UserId, QuestionID, Value)
  • Вопрос (Id, WeekId, текст)
  • Неделя (Id, StartDate)
...