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

StackOverflow https://stackoverflow.com/questions/1207507

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Итак:

  • Ответ (Id, userId, QuestionID, Значение)
  • Вопрос (Идентификатор, WeekId, Текст)
  • Неделя (Идентификатор, дата начала)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top