Reposons les bases si tu veux bien. Quelles sont les données que nous avons à la base : chien, questions, réponses, votants. Pour chaque élément, demande toi s'il peut être lié à un autre élément une et une seule fois, 0 ou 1 fois, 0 à n fois, 1 à n fois ou bien n à m fois ou bien si la relation est sans objet ? Ensuite, inverse les éléments et repose les mêmes questions. Ce faisant, tu vas établir des cardinalités.
Lorsque le lien est 1:1 // 1:1, alors l'un est plus que probablement une propriété de l'autre. Si tu reprends le tuto sur les jointures où j'ai illustré avec un petit annuaire, téléphone n'est pas une propriété de personne, le lien est 0:n // 1:1, une personne peut avoir de 0 à n téléphones, mais un téléphone appartient à une et une seule personne. Là, on identifie deux entités : téléphones et personnes. numéro est une propriété de téléphone, mais sa relation avec personne est sans objet.
Reprenons tes données : un chien peut faire l'objet de 0 à n votes, une réponse est une propriété de vote. Une question peut concerner 0 à n chiens, et un chien peut faire l'objet de 0 à n questions. Un votant peut répondre à 0 à n questions. On remarque également qu'entre question et votant, la relation est 0:n // 0:n. Par ailleurs, le nombre de question est actuellement établi à 7, mais rien ne permet de dire que tu ne feras pas évoluer ce nombre avec le temps. Donc en résumé, j'identifie trois entités : chien, questionnaire et votant. Le reste, ce sont des propriété de l'une ou l'autre entité. Ça, c'est ce qu'on appelle le modèle conceptuel de données. Passons au modèle physique de données, c'est à dire que les entités deviennes des tables, et les propriés des entités deviennent les colonnes des tables.
Ça donnerait le schéma suivant :
+----------------+ +----------------+
| chien | | questionnaire |
+-----------+----+ +-----------+----+
| id_chien | PK |---, ,---| id_quest | PK |
| ... | | | | | libelle | |
+-----------+----+ | | +-----------+----+
| |
+------------------+
| votes |
+-------------+----+
| id_chien | PK |
| id_quest | PK |
,----| id_votant | PK |
| +-------------+----+
|
+-----------------+
| votant |
+-----------------+
| id_votant | PK |
| ... | |
+-----------------+
Note bien au passage : la table vote a trois colonnes qui forment une clé primaire composite, les trois colonnes étant des clés étrangères.De cette manière, les possibilités sont très nombreuses pour une évolution de ton application. Tu as aujourd'hui 7 questions, si tu veux en rajouter une ou deux ou trente, peux importe, tu les ajoutes dans la table questionnaire, il ne restera qu'à ajouter des votes dans la table relationnelle votes en insérant l'identifiant de la question, celui du chien concerné et celui du votant.
Quant aux statistiques, il ne sera rien de plus facile que d'obtenir les votes pour un chien donné par comptage des lignes de la table votes où on retrouve l'identifiant du chien en question, par exemple. Du coup, plus besoin de stoker de valeurs calculées sur le nombre de votes obtenus, ça se calcule à chaque fois que nécessaire.
Est-ce que cette façon de faire ne te semble pas plus rationnelle comme ça ?
