par
Ryle » 20 févr. 2007, 17:14
Bah en gros mon exemple consiste à dire qu'il faut regrouper de manière à pas multiplier. La première chose à faire étant d'identifier les "objets" ou "ensembles" les plus importants. (Le plus simple pour cela étant généralement d'écrire clairement ce que tu veux faire, ca les fait ressortir assez facilement
Ex : "Je veux gérer les
matchs de basket entre
plusieurs équipes, et suivre les
statistiques des
joueurs pour chaque
match."
=> une table match, une table equipe, une table joueur, une table stat.
Tu peux alors commencer à décrire tes tables :
- un match est défini par : une date, deux équipes, un score, ... (et bien sur un identifiant unique)
- une équipe est définie par : (un id unique), un nom, un logo, ...
- un joueur est défini par : (son id unique), son nom, son prénom, ...
- un enregistrement statistiques comprend : le nombre de rebonds off, déf, passes décisives, ...
Etape suivante, les cardinalités (comment les données sont liées entres elles) :
* match {2..2} --- {0..n} équipe // un match est joué par obligatoirement 2 équipes, une équipe peut avoir joué 0 à n match
=> je vais avoir deux champs dans la table match pour identifier les deux équipes correspondantes
* équipe {5..n} --- {1..1} joueur // une équipe a minimum 5 joueurs, maximum n joueurs avec les remplacants, en revanche un joueur appartient à une et une seule équipe.
=> je vais avoir un champ dans la table joueur pour identifier l'équipe
* joueur {0..n} --- {1..1} stat // un joueur peut avoir de 0 à n statistiques (1 par match ou il joue), une statistique est associée à un et un seul joueur
=> je vais avoir un champ dans la table stat pour identifier le joueur
* match {10..n} --- {1..1} stat // un match aura 2 équipes, donc minimum 2*5 = 10 joueurs, donc logiquement 10 stats associées. En revanche les stat d'un joueur ne sont vallable que pour un et un seul match.
=> je vais avoir un champ dans la table stat pour identifier le match
En gros, si j'ai un nombre fini de possibilités d'un côté ou de l'autre, j'ajoute un champ. Si j'ai un nombre infini (0..n) de possibilité de chaque côté, j'ajoute une table de liaison qui reprend les identifiants de chaque table.
Alors bien sur, tout n'est pas figé non plus. On pourrait très bien envisager avoir un champ date dans la table statistique alors que l'info est déjà présente dans la table match parce que c'est beaucoup plus simple pour voir directement les perf d'un joueur sur un mois, plutôt que de devoir croiser avec la table des matchs (de toute façon c'est pas une donnée qui bougera beaucoup

)
Bon c'est pas forcément évident de résumé les principes de conception d'une bdd, mais ca te donnera au moins un début d'approche de la chose

Bah en gros mon exemple consiste à dire qu'il faut regrouper de manière à pas multiplier. La première chose à faire étant d'identifier les "objets" ou "ensembles" les plus importants. (Le plus simple pour cela étant généralement d'écrire clairement ce que tu veux faire, ca les fait ressortir assez facilement :)
Ex : "Je veux gérer les [u]matchs[/u] de basket entre [u]plusieurs équipes[/u], et suivre les [u]statistiques[/u] des [u]joueurs[/u] pour chaque [u]match[/u]."
=> une table match, une table equipe, une table joueur, une table stat.
Tu peux alors commencer à décrire tes tables :
- un match est défini par : une date, deux équipes, un score, ... (et bien sur un identifiant unique)
- une équipe est définie par : (un id unique), un nom, un logo, ...
- un joueur est défini par : (son id unique), son nom, son prénom, ...
- un enregistrement statistiques comprend : le nombre de rebonds off, déf, passes décisives, ...
Etape suivante, les cardinalités (comment les données sont liées entres elles) :
* match {2..2} --- {0..n} équipe // un match est joué par obligatoirement 2 équipes, une équipe peut avoir joué 0 à n match
=> je vais avoir deux champs dans la table match pour identifier les deux équipes correspondantes
* équipe {5..n} --- {1..1} joueur // une équipe a minimum 5 joueurs, maximum n joueurs avec les remplacants, en revanche un joueur appartient à une et une seule équipe.
=> je vais avoir un champ dans la table joueur pour identifier l'équipe
* joueur {0..n} --- {1..1} stat // un joueur peut avoir de 0 à n statistiques (1 par match ou il joue), une statistique est associée à un et un seul joueur
=> je vais avoir un champ dans la table stat pour identifier le joueur
* match {10..n} --- {1..1} stat // un match aura 2 équipes, donc minimum 2*5 = 10 joueurs, donc logiquement 10 stats associées. En revanche les stat d'un joueur ne sont vallable que pour un et un seul match.
=> je vais avoir un champ dans la table stat pour identifier le match
En gros, si j'ai un nombre fini de possibilités d'un côté ou de l'autre, j'ajoute un champ. Si j'ai un nombre infini (0..n) de possibilité de chaque côté, j'ajoute une table de liaison qui reprend les identifiants de chaque table.
Alors bien sur, tout n'est pas figé non plus. On pourrait très bien envisager avoir un champ date dans la table statistique alors que l'info est déjà présente dans la table match parce que c'est beaucoup plus simple pour voir directement les perf d'un joueur sur un mois, plutôt que de devoir croiser avec la table des matchs (de toute façon c'est pas une donnée qui bougera beaucoup :))
Bon c'est pas forcément évident de résumé les principes de conception d'une bdd, mais ca te donnera au moins un début d'approche de la chose :)