Как нормализовать связь между еженедельными участниками и еженедельными вопросами?
-
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 к ответу не помогает.
Каков правильный способ представления этой информации?
Решение
Вы можете удалить поле Id в таблице «Участие» и использовать (UserId, WeekId) в качестве составного / объединенного первичного ключа для таблицы «Участие». Поле ParticipationId в таблице «Ответ» необходимо заменить парой (UserId, WeekId) в качестве ссылки внешнего ключа на таблицу «Участие». Если ваша система баз данных это позволяет, вы можете определить поля (QuestionId, WeekId) в таблице Ответ на ссылку (Id, WeekId) в таблице Вопрос. Может быть, для этого вам нужно определить индекс пары (Id, WeekId) в таблице Вопрос раньше.
Другие советы
Вам действительно нужно связывать участие с соответствующей неделей?Вы можете получить это с помощью Вопроса
Итак:
- Ответ (Id, userId, QuestionID, Значение)
- Вопрос (Идентификатор, WeekId, Текст)
- Неделя (Идентификатор, дата начала)
Лично я думаю, что у вас есть правильная реализация здесь.
ParticipationId - ссылка на идентификатор участия, который указывается пользователем и неделей. Ваша таблица вопросов также имеет идентификатор WeekId. Р>
Следовательно, у вас есть правильные ссылки с самого начала. Если это не так, я думаю, что нам нужно будет увидеть некоторые данные