[resolu]problème avec inner join

Mammouth du PHP | 19672 Messages

13 oct. 2011, 14:18

Pas vraiment, en tous cas je n'aurais pas traité le problème de cette façon.

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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

13 oct. 2011, 20:16

pas facile tout ça,
je comprend, que l’intérêt serait séparer les données mais aussi créer une nouvelle ligne a chaque nouveaux votes mais dans ton, cas c'est un système complètement différent du mien ?
si c'est le cas, je ne serais jamais capable de le faire, pour l'instant mon Systems update la ligne id questions a chaque votes pour mettre a jour: "le vote supplémentaire" "le changement de la moyenne" et "les ids votants", le tout sur une ligne...
coté visiteurs ya un petit système (ajax) de petites étoiles qui bouge au survol de la souris, tu clique et il update pour cette question...

maintenant il fraudais que je modifie complètement ce système de façon a ce qu'il enregistre dans les tables style celles que tu a cité plus haut ou en écrire un autre: je ne saurais jamais le faire, ou pas pour le moment, j'ai déjà regarder et je comprend pas tout je peux créer en suivant des tutos mais modifié le fonctionnement d'un script qui fonctionne avec plusieurs langage, c'est encore compliqué...

je pense que je suis coincé pour le moment, il faut que j'apprenne plus... ou je cherche un autre système

désole d’être aussi bête mais je crois ne pas avoir assé de connaissances pour ça pour le moment et tu perd ton temps...

je vais regarder si je trouve autre chose, merci...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

13 oct. 2011, 20:26

Pas de soucis, mais ce n'est pas parce que tu es bête, il n'y a pas de bêtise quand on ne sait pas, c'est une question d'apprentissage et d'approche. Ça vient avec la pratique. Ça te semble complexe parce que tu ne visualises pas encore bien comment opérer tout ça, mais en fin de compte, ce ne sont que des requêtes SQL. La différence, c'est qu'on atomise les données et on les structure de façon plus cohérentes. Il y aura donc différentes requêtes à mettre au point, de petites requêtes en écriture et des requête à peine plus complexes en lecture parce qu'il faudra effectuer des jointures, mais en somme, peut-être moins compliquées que tes auto-jointures sur une même table.

Enfin voilà, c'est toi qui vois, je ne peux bien entendu pas être disponible à plein temps, mais ce n'est pas un soucis de passer périodiquement pour t'aiguiller lorsque tu butes sur une difficulté, et petit à petit, tu évolueras vers une plus grande autonomie, capable d'aborder des problèmes de plus en plus complexes. Mais bien sûr, il faut un peu de temps, d'obstination et de patience. :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

13 oct. 2011, 20:38

est ce que tu est d'accord avec moi si je dis que c'est la page qui update les infos de ma table:
INSERT INTO `votes` (`id`, `id_chien`, `id_question`, `total_votes`, `total_value`, `used_ips`) VALUES
('1-G', '1', 'Question 1:', 1, 10, 'a:1:{i:0;s:9:"127.0.5.1";}'),
('1-F', '1', 'Question 2:', 1, 3, 'a:1:{i:0;s:9:"127.0.5.1";}'),
('1-E', '1', 'Question 3:', 1, 5, 'a:1:{i:0;s:9:"127.0.5.1";}'),
('1-D', '1', 'Question 4:', 1, 5, 'a:1:{i:0;s:9:"127.0.5.1";}'),
('1-C', '1', 'Question 5:', 1, 9, 'a:1:{i:0;s:9:"127.0.5.1";}'),
('1-B', '1', 'Question 6:', 1, 6, 'a:1:{i:0;s:9:"127.0.5.1";}'),
('1-A', '1', 'Question 7:', 1, 9, 'a:1:{i:0;s:9:"127.0.5.1";}');
que je dois modifié pour enregistrer ling pas ling dans les nouvelles tables que tu propose ?

ça me frustre et je voudrais bien y arrivé car il comme tu l'a dis d'autre truc derrière...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

13 oct. 2011, 21:01

Ben schématiquement, tu ferais la même insertion dans la table relationnelle que celle-ci, il faudrait juste y rajouter une colonne pour stocker l'adresse IP que tu as dans la chaine sérialisée, mais sinon, tu n'aurais plus de traitement pour transformer les données ni besoin de sérialiser quoi que ce soit. Là, il manquerait juste l'id du votant, à moins que tu ne te bases sur l'adresse IP à la place ? Mais ça risque de bloquer si plusieurs votants passent par un même proxy : il seront distincts l'un de l'autre mais passeront par la même adresse IP, donc un seul pourra voter pour un même chien et une même question.

Sinon, s'il sont identifiés comme membres par exemple, alors tu as une identification avec un id_membre, que j'ai nommé id_votant dans mon exemple précédent. ça donnerait donc comme insertion :
INSERT INTO `votes` (`id_chien`, `id_question`, `id_membre`, `used_ip`) VALUES
(1, 1, 1, '127.0.5.1'),
(1, 2, 1, '127.0.5.1'),
(1, 3, 1, '127.0.5.1'),
(1, 4, 1, '127.0.5.1'),
(1, 5, 1, '127.0.5.1'),
(1, 6, 1, '127.0.5.1'),
(1, 7, 1, '127.0.5.1');
Alors je t'accorde que visuellement, si tu observes ça dans phpMyAdmin, le résultat ne sera pas très parlant, mais ce n'est pas non plus comme ça que tu l'observeras non plus en temps normal. Il faudra effectuer les requêtes pour ramener un tableau d'informations lisibles et compréhensible, et tu auras par exemple :
SELECT
  COUNT(vt.id_question) AS nombre_votes,
  ch.nom,
  qt.libelle
FROM vote AS vt
  INNER JOIN chien ch ON vt.id_chien = ch.id_chien
  INNER JOIN questionnaire AS qt ON vt.id_question = qt.id_question
GROUP BY vt.id_question, AS vt.id_chien
ORDER BY vt.id_chien;
Ce genre de requête te ramènera le nombre total de vote par question et par chien, avec le nom du chien et le libellé de la question.

Est-ce que ce n'est pas ce que tu veux à terme obtenir ?

Et si tu veux juste le nombre de votes quelle que soit la question, pour savoir combien d'étoiles tu dois afficher, c'est encore plus simple :
SELECT
  COUNT(vt.id_question) AS nombre_votes
FROM vote AS vt
WHERE vt.id_chien = 1;
Et tu auras tous les votes qui ont été effectués pour le chien dont l'identifiant est « 1 »

Est-ce que ça s'éclaire un tout petit peu mieux comme ça ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

13 oct. 2011, 22:48

oui, il y a toujours des réponses a des questions mais aussi toujours plus de questions...
j'ai recapitule:
1tbl questionaies: comment est elle remplis ? manuel ou automatique ?
CREATE TABLE IF NOT EXISTS `questionaire` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
    `id_quest` int(11) NOT NULL,
  `libelle` varchar(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
1tbl votes
CREATE TABLE IF NOT EXISTS `votes` (
  `id` int(11) NOT NULL,
  `id_chien` varchar(255) NOT NULL,
  `id_question` varchar(50) NOT NULL,
  `id_membre` int(11) NOT NULL DEFAULT '0',
  `used_ips` longtext,
  PRIMARY KEY (`id_chien`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
1tbl chien: est ce que c'est ma table chien normale, celle qui contient toutes les infos sur les chiens ?

est-ce que ma table a moi va servir a quelque chose ? et peut on en tirer quelque chose ?

si c'est ça donc 3 tables et je modifie les actions du script pour pointer vers ces nouvelless tables, est ce que c'est ca ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

14 oct. 2011, 07:31

Pourquoi doubles-tu les clés primaires avec des colonnes id alors que tu as déjà une colonne qui sert à ça ? Dans la table questionnaire par exemple, id_quest et libelle suffisent, id ne sert à rien, id_quest est ta clé primaire et doit être en auto_increment. utilises des noms qui soient significatifs pour tes colonnes, y compris tes clés primaires : ainsi, lorsqu'une clé primaire d'une table est en clé étrangère dans une autre table, elles portent le même nom et sont de ce fait plus faciles à repérer lorsque tu relis tes requêtes.

Même chose pour vote : tu rajoutes une colonne id qui n'a rien à faire là et tu limites la clé primaire à id_chien alors que la clé doit être composite sur trois colonnes. J'ajouterais que cette table votes ne peut être créée qu'après la création des trois autres puisque les trois colonnes de la clé primaire sont également des clés étrangères correspondant à ces trois autres tables, et les trois sont en NOT NULL, donc id membre aussi, mais sur cette dernière, tu n'as pas répondu sur un point à propos des votants.

Dans mon petit croquis, j'ai essayé de faire aussi visuel que possible pour que tu comprennes mieux, mais j'ai l'impression que tu as loupé une marche en cours de route.. :-k
Avant de créer tes tables, as-tu bien identifié toutes les données à répartir ? j'ai illustré en mettant le « minimum syndical » dont on avait besoin pour que tu visualises le problème, mais il y a peut-être d'autres points à prendre en compte, non ? À ce stade, ne t'occupe pas encore du code : établis ta structure de données, ce sera ensuite beaucoup plus simple de t'occuper du code parce qu'au moins tu sauras où tu vas. Pour l'instant, je te sens hésiter dans une sorte de brouillard plus ou moins opaque...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

14 oct. 2011, 13:42

ok, donc mes id question type: "1A" ou "1B" n'existe plus et ça devient 1,2,3,4... en auto incrément ?

je ne comprend pas clé composite: est ce que c'est une table sans auto incrément qui contient les PK des 3 autres tables ?

la table chien: est elle bien ma table qui contient toutes les infos sur les chiens ?

j'ai compris que pour avoir les votes on compte les lignes mais les quelles ? et ou vont les notes attribuer ?

je sens que je m’approche mais tu as raison je suis dans le brouillard a regarder mon système pour essayer de comprendre le tiens... #-o
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

14 oct. 2011, 14:09

Ok, on va reprendre un peu la base.

Dans le schéma, tu as des tables normales et une table relationnelle. Les tables normales (chien, questionnaire et membre) ont une colonne qui est leur clé primaire auto-incrémentée. On relie les trois avec une table relationnelle dont la clé primaire n'est pas auto-incrémentée, elle est composée des trois colonnes qui sont les clés étrangères pointant sur les trois tables.

Une clé primaire, ce n'est pas une colonne, c'est un index particulier dans la base, ça indique une colonne qui a une valeur unique et qui, dans certains cas, peut être reportée dans d'autres tables avec alors une autre forme d'index : FOREIGN KEY (clé étrangère) : dans le code de construction de tes tables, tu as indiqué « ENGINE InnoDB » ce qui veut dire que lors de la création des tables, tu peux indiquer ce qu'on appelle des contraintes d'intégrité référentielles, ça n'aurait pas eu d'intérêt avec MyISAM au lieu d'InnoDB. Ça veut dire quoi ? Tout simplement qu'une colonne qui est une clé étrangère fait référence à la clé primaire d'une autre table. Ça implique que pour pouvoir supprimer une ligne dans la table qui a une clé primaire, il faut au préalable supprimer les lignes des tables dont les clés étrangères qui pointent dessus, sinon, le serveur de base de données va te jeter et bloquer l'opération si tu as indiqué dans la création de la clé étrangère les directives « ON DELETE RESTRICT ». Si au contraire tu as indiqué « ON DELETE CASCADE », alors la suppression des lignes faisant référence à la ligne supprimée sera automatique : personnellement, je ne recommande pas cette option, enfin pas au niveau actuel de tes connaissances, parce que ça peut avoir des conséquences catastrophiques, donc il faut privilégier le blocage, et avec le temps tu adopteras les bonne méthodes pour ne plus devoir t'en préoccuper vraiment. S'il y a un blocage, c'est que tu as oublié un détail avant et le message d'erreur retourné par MySQL sera relativement explicite.

Pour le moment, je crois que tu tentes d'aller trop vite en mettant la charrue avant les bœufs, ou le code avant la base de données si tu préfères. Considère un point toujours très important dans n'importe quel développement : si ton modèle de données est bancal, tu auras beau maîtriser à fond la programmation, l'application finira tôt ou tard par être bancale aussi et la maintenance comme l'évolution de l'application deviendront de plus en plus difficiles voire impossibles sans remanier la base de données et par conséquent des parties non négligeables du code. Donc passer du temps sur l'analyse et la conception de ta base de données n'est en rien une perte de temps, c'est même à mon sens la partie la plus importante de ton développement. Oublie le code, les traitements et le PHP pour l'instant : structure tes données de telle sorte qu'il n'y ait que le moins possible de redondances et de données inutiles, tout comme il faut éviter d'avoir à terme des tables avec des colonnes où on met trop souvent une valeur NULL. Évite aussi le stockage de valeur qui peuvent être obtenus par calcul : ça évitera d'avoir une colonne de plus à mettre à jour avec occasionnellement une valeur erronée.

Repars du croquis que j'ai fait plus tôt et complète les tables en mettant ce qui te semble correct dans chaque table, et colle-moi ça ici, on analysera ensemble et selon le cas, le reste deviendra beaucoup plus simple ;) Essaye de garder la mise en forme, j'ai créé ça dans Notepad++, c'est un peu fatigant de tout aligner, mais ce sera plus pratique que de jongler avec des images.

J'allais oublier : les notes, c'est une nouvelle ligne dans la table relationnelle, tout simplement : une note, c'est un membre qui sélectionne un chien et une question : on a nos trois identifiants, il reste à enregistrer ces éléments dans la table votes et ensuite tu peux compter les lignes pour un chien donnée et éventuellement une question donnée.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

14 oct. 2011, 18:42

je comprend j'arrive pas a le mettre correctement
									     +-------------------+                       +-------------------+
									     | chien             |                       | sport             |
									     +--------------+----+                       +--------------+----+ 
								,--------| id_chien     | PK |---,                   | id_sport     | PK |
								|	     | nom          |    |   +-------------------| id_chien     |    | 
								|	     | affixe       |    |   |                   | sport        |    |
								|	     | race         |    |   |		             +--------------+----+
                                |        | sex          |    |   |
+-------------------+           |        | nee          |    |   |			        +-------------------+
| questionnaire     |           |        | livre        |    |   |		            | caracteristique   |
+--------------+----+           |        | lof          |    |   |                  +--------------+----+ 
| id_quest     | PK |---,       |        +--------------+----+   |                  | id_carac     | PK |
| question_1   |    |   |       |                                +------------------| id_chien     |    | 
| question_2   |    |   |       |                                |                  | taille       |    |
| question_3   |    |   |       |                                |                  | poid         |    |
| question_4   |    |   |       |        +------------------+    |                  | couleur      |    |
| question_5   |    |   |       |        | votes            |    |                  +-------------------+
| question_6   |    |	|		|	     +-------------+----+	 |			
| question_7   |    |	|		'--------| id_chien    | PK |	 |		         	 +-------------------+
+--------------+----+   '----------------| id_quest    | PK |    |                   | photo             |
                               ,---------| id_votant   | PK |    |                   +--------------+----+
                               |         | note        |    |    |                   | id_photo     | PK |
						       |         +------------------+    +-------------------| id_chien     |    |
                               |                                 |                   | photo        |    |
                               |                                 |                   +--------------+----+
						+-----------------+                      |
						| users           |                      |         
						+-----------------+                      |
						| id         | PK |                      |
						| username   |    |                      |				 +-------------------+
						| ...        |    |                      |               | resultat          |
						+-----------------+                      |               +--------------+----+
						                                         |               | id_result    | PK |
																 '---------------| id_chien     |    |
																				 | ville        |    |
																				 | date         |    |
																				 | total        |    |
																				 | place        |    |
						                                                         +--------------+----+
a priori quand on télécharge ça marche...
est ce que c'est dans le sens de l’idée général ?
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

14 oct. 2011, 23:49

Tu y es presque :)

Il n'y a que sur le questionnaire que tu n'as pas accroché. Quelles sont les données d'un questionnaire ? « question » et quoi d'autre ? En fin de compte, rien, ce n'est pas « question n° x » ou n° y ou n° z, c'est un libellé. Si tu veux ajouter des questions, il ne faut pas devoir ajouter une colonne à ta table. Ce qui devra être affiché sur le site, c'est une série de question : dans la pratique, chaque question a un libellé qui lui est propre, quel que soit ce libellé. Donc, la modification serait la suivante :
                                         +-------------------+                       +-------------------+
                                         | chien             |                       | sport             |
                                         +--------------+----+                       +--------------+----+ 
                                ,--------| id_chien     | PK |                       | id_sport     | PK |
                                |        | nom          |    |-----------------------| id_chien     |    | 
                                |        | affixe       |    |-------.               | sport        |    |
                                |        | race         |    |-----, |               +--------------+----+
                                |        | sex          |    |---, | |
+-------------------+           |        | nee          |    |   | | |              +-------------------+
| questionnaire     |           |        | livre        |    |   | | |              | caracteristique   |
+--------------+----+           |        | lof          |    |   | | |              +--------------+----+ 
| id_quest     | PK |---,       |        +--------------+----+   | | |              | id_carac     | PK |
| libelle      |    |   |       |                                | | `--------------| id_chien     |    | 
+--------------+----+   |       |                                | |                | taille       |    |
                        |       |                                | |                | poid         |    |
                        |       |        +------------------+    | |                | couleur      |    |
                        |       |        | votes            |    | |                +-------------------+
                        |       |        +-------------+----+    | |                    
                        |       `--------| id_chien    | PK |    | |                 +-------------------+
                        `----------------| id_quest    | PK |    | |                 | photo             |
                               ,---------| id_votant   | PK |    | |                 +--------------+----+
                               |         | note        |    |    | |                 | id_photo     | PK |
                               |         +------------------+    | `-----------------| id_chien     |    |
                               |                                 |                   | photo        |    |
                               |                                 |                   +--------------+----+
                        +-----------------+                      |
                        | users           |                      |         
                        +-----------------+                      |
                        | id         | PK |                      |
                        | username   |    |                      |               +-------------------+
                        | ...        |    |                      |               | resultat          |
                        +-----------------+                      |               +--------------+----+
                                                                 |               | id_result    | PK |
                                                                 `---------------| id_chien     |    |
                                                                                 | ville        |    |
                                                                                 | date         |    |
                                                                                 | total        |    |
                                                                                 | place        |    |
                                                                                 +--------------+----+
En réalité, tu es déjà très proche de la solution au niveau de la structure de tes données :) Il sera bien assez tôt pour t'inquiéter de la manipulation des données elles-même, ce ne sera pas plus compliqué que ce que tu envisageais de faire avec une seule table.

Observe donc ce croquis et dis-moi s'il y a un élément dont tu ne comprends pas la signification.

PS : pour garder la mise en forme des croquis, utilise des espaces et non des tabulations, ce sera plus facile à manipuler pour garder la mise en forme lorsque tu postes ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

15 oct. 2011, 10:55

oui, je comprend et ça règle même d'autre soucis que je voulais voir plus tard comme inscrire les concours d'un chien, en effet je ne pouvais pas inscrire d'autre concours sur un chien sans ajouté une colonne a chaque nouvel enregistrement... c'est pour ça que j'ai modifié la table chien et créer les tables: sport, caractéristique, photo et résultats...

j'ai encore un peut de mal a me représenter le fonctionnement mais je verrais avec le code au moment venu...

je fini la modelisation (mot que maintenant je comprend), je refais mes create table et je te re fait voir.
merci beaucoup Cyrano, ta patience est une qualité rare sur les forum du web...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 790 Messages

15 oct. 2011, 13:56

bon, la j'es suis la, et je pense ne rien oublié mais il me semble comprendre que ce n'est pas très grave...
                                        +-------------------+                                     
                                         | chien             |                                     
                                         +--------------+----+                                     +-------------------+
                                ,--------| id_chien     | PK |                                     | sport             |
								|        | id_user      | PK |                                     +--------------+----+
                                |        | nom          |    |-------------------------------------| id_chien     | PK | 
                                |        | affixe       |    |-------,                             | id_user      | PK |-----------------,
                                |        | race         |    |-----, |                             | sport        |    |                 |
                                |        | sex          |    |---, | |                             | signup_date  |    |                 |
+-------------------+           |        | nee          |    |   | | |                             +--------------+----+                 |
| questionnaire     |           |        | livre        |    |   | | |                                                                   |
+--------------+----+           |        | lof          |    |   | | |    +-------------------+                                          |
| id_quest     | PK |---,       |        | commmentaire |    |   | | |    | caracteristique   |                                          |
| libelle      |    |   |       |        | signup_date  |    |   | | |    +--------------+----+                                          |
+--------------+----+   |       |        +--------------+----+   | | `----| id_chien     | PK |                                          |
                        |       |                                | |      | id_user      | PK |--------------------------------------,   |
                        |       |                                | |      | poid         |    |                                      |   |
                        |       |        +------------------+    | |      | couleur      |    |                                      |   |
                        |       |        | vote             |    | |      | taille       |    |                                      |   |                                     
                        |       |        +-------------+----+    | |      | signup_date  |    |                                      |   |                  
                        |       `--------| id_chien    | PK |    | |      +-------------------+                                      |   |
                        `----------------| id_quest    | PK |    | |                                                                 |   |     
                               ,---------| id_user     | PK |    | |                                                                 |   |
                               |         | note        |    |    | |                                                                 |   |
							   |         | signup_date |    |    | |                               +-------------------+             |   |
							   |         +-------------+----+    | |                               | photo             |             |   |
							   |                                 | |                               +--------------+----+             |   |
							   |                                 | `-------------------------------| id_chien     | PK |             |   |
                               |                                 |                                 | id_user      | PK |---------,   |   |         
                               |                                 |                                 | photo        |    |         |   |   |
                               |                                 |                                 | signup_date  |    |         |   |   |                   
						       |                                 |                                 +-------------------+         |   |   |  
						       |                                 |                                                               |   |   |
						+-----------------+                      |                                                               |   |   |
                        | user            |                      |                                                               |   |   |
                        +-----------------+                      |                                                               |   |   |
                        | id_user    | PK |----------,           |                                                               |   |   |
                        | username   |    |          |           |                                                               |   |   |
                        | password   |    |          |           |               +-------------------+                           |   |   | 
                        | email      |    |          |           |               | resultat          |                           |   |   |            
                        | avatar     |    |          |           |               +--------------+----+                           |   |   |                
                        | signup_date|    |          |           `---------------| id_chien     | PK |                           |   |   |              
                        +-----------------+          '---------------------------| id_user      | PK |                           |   |   | 
						    |  |  |                                              | ville        |    |                           |   |   |
                            |  |  |                                              | date         |    |                           |   |   |             
                            |  |  |                                              | total        |    |                           |   |   |            
                            |  |  |                                              | place        |    |                           |   |   | 
							|  |  |												 | signup_date  |    |                           |   |   |
                            |  |  |                                              +--------------+----+                           |   |   |
                            |  |  |                                                                   	                         |   |   |
                            |  |  |                                                                   	                         |   |   |																																 
                            |  |  '----------------------------------------------------------------------------------------------'   |   |																				 
                            |  '-----------------------------------------------------------------------------------------------------'   |																				 
					        '------------------------------------------------------------------------------------------------------------'



					
																				 
CREATE TABLE chien (
    id_chien SMALLINT NOT NULL AUTO_INCREMENT,
    id_user SMALLINT NOT NULL,	
    nom VARCHAR(40) NOT NULL,
    affixe VARCHAR(150) NOT NULL,	
    sexe ENUM('male','femelle'),
    naissance DATETIME NOT NULL,
    race VARCHAR(50) NOT NULL,
    livre VARCHAR(50) NOT NULL,	
    lof VARCHAR(50) NOT NULL,	
	commmentaire TEXT,
    signup_date int(10) NOT NULL,	
PRIMARY KEY (id_chien)  
)
ENGINE=INNODB;																					 
																				 
	
	
CREATE TABLE questionnaire (
    id_quest SMALLINT NOT NULL AUTO_INCREMENT,
    libelle VARCHAR(40) NOT NULL,
PRIMARY KEY (id_quest)    
)
ENGINE=INNODB;																				 
	
	
																				 
CREATE TABLE vote (
    id_chien SMALLINT NOT NULL,
    id_quest SMALLINT NOT NULL,	
    id_user SMALLINT NOT NULL,		
    note INT(2) NOT NULL,
    signup_date int(10) NOT NULL,	
PRIMARY KEY (id_chien) 
)
ENGINE=INNODB;																				 
																				 
		
		
CREATE TABLE user (
    id_user bigint(20) NOT NULL AUTO_INCREMENT,
    username varchar(255) NOT NULL,
    password varchar(255) NOT NULL,
    email varchar(255) NOT NULL,
    avatar text NULL,
    signup_date int(10) NOT NULL,
PRIMARY KEY (id_user)	
) 
ENGINE=INNODB;																			 
																				 
	


CREATE TABLE sport (
    id_chien SMALLINT NOT NULL,
    id_user SMALLINT NOT NULL,		
    sport VARCHAR(50) NOT NULL,
    signup_date int(10) NOT NULL,
	PRIMARY KEY (id_chien) 
)
ENGINE=INNODB;



CREATE TABLE caracteristique (
    id_chien SMALLINT NOT NULL,
    id_user SMALLINT NOT NULL,	
    taille VARCHAR(30) NOT NULL,	
    poid VARCHAR(50) NOT NULL,   
    couleur VARCHAR(50) NOT NULL,		
    signup_date int(10) NOT NULL,	
PRIMARY KEY (id_chien) 
)
ENGINE=INNODB;



CREATE TABLE photo (
    id_chien SMALLINT NOT NULL,
    id_user SMALLINT NOT NULL,		
    photo text NULL,
    signup_date int(10) NOT NULL,
PRIMARY KEY (id_chien) 	
)
ENGINE=INNODB;



CREATE TABLE resultat (
    id_chien SMALLINT NOT NULL,
    id_user SMALLINT NOT NULL,
    niveau VARCHAR(15) NOT NULL,	
    ville VARCHAR(50) NOT NULL,	
    date DATETIME NOT NULL,   
    total VARCHAR(50) NOT NULL,		
    position INT(3) NOT NULL,	
    signup_date int(10) NOT NULL,
PRIMARY KEY (id_chien) 	
)
ENGINE=INNODB;


ps: impossible de mettre le schéma correctement même sans tabulation dans notpad++
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.

Mammouth du PHP | 19672 Messages

15 oct. 2011, 15:02

Ok, pour les données, on semble bons, il n'y a que ta table « resultat » dont je ne comprends pas le sens, mais le problème reste dans les relations et les définitions de clés primaires et celles des clés étrangères.

C'est sur ce dernier point que je vais m'attarder un peu. Lorsqu'une colonne est simplement une clé étrangère, on la note FK (Foreign Key) et non PK (Primary Key). Il arrive dans des tables relationnelles que certaines colonnes puissent être les deux à la fois : dans ce cas c'est la clé primaire qui prévaut et on notera donc PK.

Les données maintenant : observe ta table « caracteristique » Tu as commis la même erreur que pour les questions. Il y a deux manières d'aborder ce point : soit tu intègres les colonnes directement dans la table chien, puisqu'au fond, les deux tables ont les mêmes clés, il n'y a en fin de compte que l'endroit où tu stockes les informations qui changent, c'est une autre table, mas à une ligne de la table « chien » ne peut correspondre qu'une seule ligne de « caracteristique ». Ça manque d'intérêt, tu ne trouves pas ?
Et puis il y a un autre problème : supposons qu'un jour futur, tu souhaites ajouter une caractéristique à la description des chiens, par exemple (complètement fantaisiste peut-être c'est juste pour l'exemple) la couleur des yeux : il te faudrait jouter une colonne « yeux » dans ta table caractéristique... pas pratique, et surtout obligation de modifier des codes multiples de l'application au lieu de simplement jouter certaines fonctionnalités dans un endroit unique.
Ensuite, certaines caractéristiques ne changeront pas pour un individu, d'autres évolueront avec le temps. La race d'un chien sera toujours la même de sa naissance à sa mort, mais son poids évoluera au fil du temps. Alors sur ce point particulier du poids, reste à déterminer si tu veux pouvoir ou non conserver un historique de son évolution. Selon le cas, il va falloir répartir l'information différemment. Soit tu n'envisages pas de pouvoir sortir de statistiques sur ce poids et dans ce cas, c'est une propriété du chien, il faudra simplement mettre à jour la ligne de la table « chien » si son poids évolue. Sinon

Et puis à ce compte là, il faudrait reporter certaines colonnes de « chien » vers les caractéristiques pour rester logique : race par exemple si on considère qu'un chien est d'une race unique (même si c'est un croisement, peu importe), mais une race peut compter plusieurs individus. Mais en fait, je serais bien pus enclin à créer une table « race » parce que c'est un élément qui ne changera pas chez le chien et qu'on ne peut pas lier cette information avec un quelconque autre élément de l'ensemble des données.

Ce que j'ai mentionné sur les caractéristiques est aussi valable pour les sports : je présume qu'il y a plusieurs sports, que pour chaque sport, on peut retrouver 0 à n chiens, et qu'un chien peut pratiquer 0 à n sports... on se retrouve là aussi avec une relation combinant les deux.

J'imagine volontiers que tout ça peut sembler bien compliqué : voici comment je verrais certaines modification de ton dernier modèle. Là au lieu de Notepad++, j'ai créé une modélisation avec MySQL Workbench, ce sera plus net.
Image

Je n'ai pas mis la table « resultat » parce que je n'ai pas saisi à quoi elle correspond. Mais observe déjà cette structure et reviens avec les questions qui te viennent à l'esprit si tu ne vois pas de réponse évidente ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 790 Messages

15 oct. 2011, 15:10

je n'ai pas encore lu mais je répond de suite: la table résultat est pour enregistrer certain concours avec résultat et pointage mais elle est pas fini...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.