0

Je suis en train de mettre en place un système de concours dans lequel l'utilisateur doit choisir la bonne réponse à plusieurs questions. Chaque semaine, il y a une nouvelle série de questions. J'essaie de trouver la bonne façon de stocker les participations des utilisateurs dans une base de données. En ce moment j'ai le modèle de données suivantes:Comment normaliser une association entre des participations hebdomadaires et des questions hebdomadaires?

Participation      Week 
+--------------+     +--------------+ 
| Id   |  +----------->| Id   |<-+ 
| UserId  |  |   | StartDate | | 
| WeekId  |-----+   +--------------+ | 
+--------------+         | 
            Question   | 
            +--------------+ | 
            | Id   | | 
            | WeekId  |--+ 
            | Text   | 
            +--------------+ 

La seule solution que je suis venu avec est d'ajouter une table réponse qui associe une participation à une question, comme il est indiqué dans le schéma suivant:

Participation      Week 
    +--------------+     +--------------+ 
+->| Id   |  +----------->| Id   |<-+ 
| | UserId  |  |   | StartDate | | 
| | WeekId  |-----+   +--------------+ | 
| +--------------+         | 
|          Question   | 
|  Answer      +--------------+ | 
|  +------------------+ +---->| Id   | | 
+------| ParticipationId | |  | WeekId  |--+ 
     | QuestionId  |----+  | Text   | 
     | Value   |   +--------------+ 
     +------------------+ 

Je ne relie pas cette solution est très bonne, car elle permet à une participation d'avoir des réponses à des questions d'une semaine différente. Ajouter le WeekId à la réponse n'aide pas.

Quelle est la bonne façon de représenter cette information?

Répondre

1

Vous pouvez supprimer le champ Id dans la table Participation, et utiliser (UserId, WeekId) comme clé primaire composée/concaténée pour la table Participation. Le champ ParticipationId dans la table Réponse vous devez remplacer ensuite par la paire (UserId, WeekId) comme référence de clé étrangère à la table Participation. Si votre système de base de données le permet, vous pouvez définir les champs (QuestionId, WeekId) dans le tableau Répondre à la référence (Id, WeekId) dans la table Question. Peut-être que pour cela vous devez définir un index sur la paire (Id, WeekId) dans le tableau Question avant.

0

Avez-vous vraiment besoin d'associer une participation à sa semaine? Vous pouvez l'obtenir par Question

Alors:

  • Réponse (Id, UserId, QuestionID, valeur)
  • Question (Id, WeekId, texte)
  • semaine (Id, StartDate)
+0

Cela n'empêche pas la même participation d'avoir des réponses de différentes semaines. –

0

Personnellement, je pense que vous avez la bonne implémentation ici.

ParticipationIl des liens vers l'ID sur la participation, qui est saisi avec l'utilisateur et la semaine. Votre table de questions est également associée au WeekId.

Par conséquent, vous avez les références appropriées tout au long. Si ce n'est pas le cas je pense que nous aurons besoin de voir des données

Questions connexes