Comment bien structurer ma BD MySQL?

Mammouth du PHP | 545 Messages

30 déc. 2005, 01:03

Enfin, pour la table changements, j'avoue que le but poursuivi m'échappe un peu : quel est donc le ien avec les autres tables et à quoi sert-elle ?
En faite, il y a des changements chaque année pour un même coureur: le dossard, le club, ... la catégorie (qui peut être calculer avec la date de naissance et le sexe). Voilà l'utilité de cette table mais je me demande si j'arriverais au résultat voulu avec ça !

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 19672 Messages

30 déc. 2005, 01:11

oui, ok, c'est absolument juste : mais cette table est à ce moment là une relation entre la table des coureurs et celle des clubs et la clé primaire est une clé composite crée sur la base des deux clés étrangères: id_club d'un coté et id_courreur de l'autre : est-ce que tu saisis le principe ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 545 Messages

30 déc. 2005, 01:15

est-ce que tu saisis le principe ?
Ben à vrai dire, je suis heureux que tu poses la question car cela m'évite de te la poser :lol: en résumé pas vraiment!
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 19672 Messages

30 déc. 2005, 01:22

Regarde ce sujet auquel j'ai répondu tout à l'heure, ça t'éclairera peut-être mieux avec un schéma.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 545 Messages

30 déc. 2005, 01:31

J'ai vu mais ... !
une clé primaire composite constituée des deux clés étrangères reprises selon les clés primaires de la table membre d'un coté et de la table zone de l'autre.
Je ne saisais pas tout! J'ai aussi l'impression en lisant la question de l'intervenant, qu'il est possible de mettre plusieurs données dans une seule cellule! Bon, je vais aller dormir un peu pour bien réflèchir car mes neuronnes en ont pris un coup!

Un grand merci pour cette aide prècieuse
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

30 déc. 2005, 14:41

Salut Cyrano,

Ne comprennant pas, peux-tu m'expliquer en détail? J'ai l'impression que l'on peut mettre plusieurs données dans une même cellule ... mes connaissances en BD sont très rudimentaires et je ne saisis pas encore tout (même pas grand chose!).

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 19672 Messages

30 déc. 2005, 15:39

Bon, je vais essayer de résumer.

Il peut exister des relations entre tables qu'on nomme "cardinalité. Par exemple, supposons une table membre et une table téléphone. Un membre peut avoir 0 à n numéros de téléphone, mais un numéro de téléphone ne correspond qu'à un et un seul membre. On parle dans ce cas à d'une relation 1/1 - 0/n. Donc pour retrouver les numéros d'un membre en particulier, je dois avoir un point de repère devant chaque numéro de téléphone : ce point de repère sera une clé étrangère qui aura la valeur de la clé primaire du membre correspondant.
Maintenant prenons le cas qui nous occupe : nous avons des participants et des clubs. Un club peut compter 0 à n participant, mais au fil du temps, un participant peut changer de club et de ce fait être membre de 1 à n clubs. En pratique, il n'est membre que d'un seul club à la fois, mais si on conserve les archives, il aura plusieurs clubs. On a donc une cardinalité 0/n - 1/n, ce qui pose un problème puisque si je mets la clé primaire participant en clé étrangère dans la table clubs, ça voudrait dire qu'un participant peut être membre de 0 à n club mais dans l'autre sens, un club ne peut avoir qu'un seul participant. À l'inverse, si je mets en clé étrangère dans la table participant la clé primaire d'un club, j'aurai une rlation à sens unique qui n'est pas plus satisfaisante.

La solution consiste donc à avoir une table intermédiaire comportant une clé primaire composite, c'est à dire constituée de plusieurs champs et ici, ce seront les deux clés étrangères, l'une correspondant à la clé primaire club, l'autre la clé primaire participant. Dans cette ralation, je devrais aussi ajouter une clé primaire : l'année parce qu'un participant peut changer de club d'une année sur l'autre... ou ne pas changer auquel cas il me faut un point de repère unique, l'id du club et l'ic du particpant ne changeant pas.

Ça donnerait quelque chose comme ceci:

Code : Tout sélectionner

+------------------------+ | club | +---------+--------------+ |club_id | club_nom | +---------+--------------+ | 1 | Les moineaux | | 2 | Les dragons | | 3 | Les aigles | | 4 | Les écureils | +---------+--------------+ +-------------------+ | participants | +--------+----------+ |part_id | par_nom | +--------+----------+ | 1 | Dupond | | 2 | Durand | | 3 | Dugenou | +--------+----------+ +---------------------------------------+ | affilie | +--------+----------+-------+-----------+ |club_id |part_id | annee | dossard | +--------+----------+-------+-----------+ | 1 | 1 | 2004 | 115 | | 2 | 1 | 2005 | 17 | | 1 | 3 | 2004 | 42 | | 1 | 3 | 2005 | 42 | | 4 | 2 | 2005 | 30 | +--------+----------+-------+-----------+
Partant de ce schéma, tu vas retrouver le club d'un participant en fonction de l'année via la relation "affilie" ou les membres pour un club particulier pour une année définie. Mais tu n'auras aucun doublon nulle part.

Alors je ne garantis pas que ce ce qu'il y a de plus optimal, certains gourous de la modélisation trouveront peut-être à redire, mais l'idée générale est là : est-ce que c'est plus clair comme ça ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 545 Messages

30 déc. 2005, 16:33

Disons que cela devient un peu moins obscur. Il n'y a donc plus réellement de clef primaire (si on veut)? Pas non plus d'auto-increment?

Bon, je fais une table que je soumets ... vous me direz si j'ai vu juste! J'y ajouterai la catégorie car je ne suis pas certain d'avoir les dates de naissance de tous!

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

30 déc. 2005, 16:48

Au passage pour le sexe, tu peux utiliser un ENUM, c'est plus clair selon moi.
J'ai essayé mais cela fait une erreur
Erreur

requête SQL :

ALTER TABLE `soc_categories` CHANGE `sexe` `sexe` ENUM NOT NULL

MySQL a répondu:


#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT NULL' at line 1
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 545 Messages

30 déc. 2005, 16:52

Bon voyons si j'ai bien saisis les explications. Comme je le disais, j'ai ajouter une colonne pour la catégorie.


Image

Alors, c'est bon?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 19672 Messages

30 déc. 2005, 16:59

Pour le type ENUM, tu dois mettre ENUM('valeur_1', 'valeur_2',... etc...) DAFAULT 'valeur_1' (par exemple) : tu as une erreur parce que tu essaye de mettre ENUM sans mettre une liste de valeurs.

Pour ta table de relation, ça a l'air correct.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 545 Messages

30 déc. 2005, 17:11

Pour ta table de relation, ça a l'air correct.
Donc maintenant, je peux essayer l'encodage directe dans mes tables pour voir les éventuelles erreurs et si tout va bien je pourrai faire un interface d'enregistrement!

Merci beaucoup
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

ViPHP
fab
ViPHP | 2657 Messages

30 déc. 2005, 20:38

topic résolu ?
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Mammouth du PHP | 19672 Messages

30 déc. 2005, 20:46

Pas certain encore, mais on a à mon avis pas mal avancé ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Mammouth du PHP | 545 Messages

30 déc. 2005, 23:23

Je vais faire quelques essaies et je vous tiens au courant si c'est bon!

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!