Como normalizar uma associação entre participações semanais e perguntas semanais?
-
05-07-2019 - |
Pergunta
Estou implementando um sistema de concurso em que o usuário tem que escolher a resposta correta de questões de múltipla. A cada semana, há um novo conjunto de perguntas. Eu estou tentando encontrar a maneira correta de armazenar as participações de usuário em um banco de dados. Agora eu tenho o seguinte modelo de dados:
Participation Week
+--------------+ +--------------+
| Id | +----------->| Id |<-+
| UserId | | | StartDate | |
| WeekId |-----+ +--------------+ |
+--------------+ |
Question |
+--------------+ |
| Id | |
| WeekId |--+
| Text |
+--------------+
A única solução que eu vim com é adicionar uma tabela Resposta que associa uma participação com uma pergunta, como indicado no diagrama a seguir:
Participation Week
+--------------+ +--------------+
+->| Id | +----------->| Id |<-+
| | UserId | | | StartDate | |
| | WeekId |-----+ +--------------+ |
| +--------------+ |
| Question |
| Answer +--------------+ |
| +------------------+ +---->| Id | |
+------| ParticipationId | | | WeekId |--+
| QuestionId |----+ | Text |
| Value | +--------------+
+------------------+
Eu não ligar esta solução é muito boa, porque permite a participação de ter respostas a perguntas de uma semana diferente. Adicionando o WeekId para a resposta não ajuda.
O que é a maneira correta para representar esta informação?
Solução
Você pode remover o campo Id na Participação mesa, e uso (UserId, WeekId) como composto / chave primária concatenada para a Participação mesa. O ParticipationId campo na tabela Resposta você tem que substituir, em seguida, pelo par (UserId, WeekId) como referência de chave estrangeira para a Participação mesa. Se o seu sistema de banco de dados permite que ele, você pode definir, em seguida, os campos (QuestionID, WeekId) na tabela de Resposta a referência (Id, WeekId) na Pergunta mesa. Talvez por isso você tem que definir um índice sobre o par (Id, WeekId) na Pergunta mesa antes.
Outras dicas
Você realmente precisa para associar uma participação com a sua semana? Você pode obtê-lo através Pergunta ??p>
Assim:
- Resposta (Id, UserId, QuestionID, Value)
- Pergunta (Id, WeekId, texto)
- Week (Id, StartDate)
Pessoalmente, eu acho que você tem a aplicação adequada aqui.
ParticipationId links para a identificação com a participação, que é introduzido com o usuário e a semana. Sua mesa Pergunta é introduzido com o WeekId também.
Portanto, você tem as referências apropriadas tempo todo. Se este não for o caso, acho que teremos de ver alguns dados