structure mysql et requête complexe.

Le
Anthony
bonjour,

j'imagine une base mysql avec la structure suivante :
- table morceaux
- table personnes

Avec un lien entre morceaux et personnes, sachant que les tables peuvent
être liées de façon complexe :

- fiche morceau : titre, année, producteurs, chanteurs
- fiche personne : nom, prénom, adresse

sachant que producteurs et/ou chanteurs peuvent contenir X contacts (là
est la difficulté).

Et qu'il faudra pouvoir trouver par exemple tous les morceaux dont un
producteur s'appelle toto ou dont le chanteur s'appelle titi.

Comment structureriez la base pour que la requête soit la moins "lourde"
possible ? je m'interroge surtout sur les liens et la manière de les
stocker :

exemple : un morceau dont les producteurs sont les id 1,4,19 de la table
contact et le chanteur l'id 100 de la table contact.

merci d'avance pour des pistes,

Anthony
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bruno Desthuilliers
Le #21920631
Anthony a écrit :
bonjour,

j'imagine une base mysql avec la structure suivante :
- table morceaux
- table personnes

Avec un lien entre morceaux et personnes, sachant que les tables peuvent
être liées de façon complexe :

- fiche morceau : titre, année, producteurs, chanteurs...



Je t'arrête tout de suite. Un attribut se doit d'être atomique, donc
"producteur*s*" et "chanteur*s*" ne _peuvent pas_ être des attributs de
l'entité "morceau" (voir plus bas).

- fiche personne : nom, prénom, adresse...

sachant que producteurs et/ou chanteurs peuvent contenir X contacts (là
est la difficulté).



Il n'y a aucune difficulté, à condition de penser dans les bon termes.
Ne pense pas en termes de "fiches" (une fiche, c'est une élément de
l'interface utilisateur, pas un élément d'une base relationnelle), pense
en termes d'entités, de relations et d'attributs.

Et qu'il faudra pouvoir trouver par exemple tous les morceaux dont un
producteur s'appelle toto ou dont le chanteur s'appelle titi.



Ici, il y a une entité que tu n'a pas clairement identifié, celle de
"rôle" (ie : "producteur", "chanteur" etc... )

Si tu pose ça sous forme de règles, c'est plus simple:

1. un morceau est défini par un titre, une année, ....
2. une personne est définie par un nom, un prenom, ....
3. un role est défini par un libellé
4. une ou plusieurs personnes jouent un ou plusieur roles sur un ou
plusieurs morceaux
5. une même personne ne peut pas jouer plusieurs fois le même rôle sur
le même morceau

La structure de ta base est complètement définie par ces 5 règles.

Comment structureriez la base pour que la requête soit la moins "lourde"
possible ?



Commence donc par faire les choses dans les formes (normales en
l'occurrence), tu verra après s'il y a un problème de performances, et
si oui comment le résoudre au mieux.

je m'interroge surtout sur les liens et la manière de les
stocker :



règles 4. et 5.

Autrement dit, avec une table qui dit le rôle que joue une personne sur
un morceau (donc une clé étrangère sur morceaux, une clé étrangère sur
personnes, et une clé étrangère sur rôles).

Allez, un exemple (simplifié):

# règle 1
create table morceaux(
id integer not null primary key,
titre varchar(255) not null
);

# règle 2
create table personnes(
id integer not null primary key,
nom varchar(100) not null
);

# règle 3
create table roles(
id integer not null primary key,
libelle varchar(50)
);

# règle 4
create table participations(
id_morceau integer not null foreign key references morceaux.id,
id_personne integer not null foreign key references personnes.id,
id_role integer not null foreign key references roles.id,

# règle 5
primary key(id_morceau, id_personne, id_role)
);


# on peuple la base pour l'exemple

insert into roles(id, libelle) values(1, "producteur");
insert into roles(id, libelle) values(2, "chanteur");

insert into personnes(id, nom) values(1, "titi");
insert into personnes(id, nom) values(2, "toto");

insert into morceaux(id, titre) values(1, "lalala");
insert into morceaux(id, titre) values(2, "oh oh");

# titi chante lalala
insert into participations(id_morceau, id_personne, id_role) values(1,
1, 2);

# toto produit lalala
insert into participations(id_morceau, id_personne, id_role) values(1,
2, 1);

# titi produit et chante ho ho
insert into participations(id_morceau, id_personne, id_role) values(2,
1, 1);
insert into participations(id_morceau, id_personne, id_role) values(2,
1, 2);


# Et pour ce qui est de ta question: "trouver par exemple tous les
# morceaux dont un producteur s'appelle toto ou dont le chanteur
# s'appelle titi.", ça donne, littéralement :

select
m.id, m.titre, pe.nom, r.libelle
from morceaux m
inner join participations pa on m.id=pa.id_morceau
inner join personnes pe on pe.id=pa.id_personne
inner join roles r on r.id=pa.id_role
where
(r.libelle="producteur" and pe.nom="toto")
or
(r.libelle="chanteur" and pe.nom="titi");


+----+--------+------+------------+
| id | titre | nom | libelle |
+----+--------+------+------------+
| 1 | lalala | titi | chanteur |
| 1 | lalala | toto | producteur |
| 2 | oh oh | titi | chanteur |
+----+--------+------+------------+


Voili voilà...
HTH
Anthony
Le #21920621
Bruno Desthuilliers a écrit :


Il n'y a aucune difficulté, à condition de penser dans les bon termes.
Ne pense pas en termes de "fiches" (une fiche, c'est une élément de
l'interface utilisateur, pas un élément d'une base relationnelle), pense
en termes d'entités, de relations et d'attributs.



un très grand merci... une solution des plus didactique.
un regard extérieur et tout change...

cordialement,

Anthony
Alain Montfranc
Le #21920611
Bruno Desthuilliers a formulé la demande :
Anthony a écrit :
bonjour,

j'imagine une base mysql avec la structure suivante :
- table morceaux
- table personnes

Avec un lien entre morceaux et personnes, sachant que les tables peuvent
être liées de façon complexe :

- fiche morceau : titre, année, producteurs, chanteurs...



Je t'arrête tout de suite. Un attribut se doit d'être atomique, donc




Et le multivalué, hein, vous en faites quoi du multivalué ?

:-D

PS: helios60 s'en encore fait jeter de wikipedia !
JKB
Le #21920601
Le 17-11-2009, ? propos de
Re: structure mysql et requête complexe.,
Alain Montfranc ?crivait dans fr.comp.applications.sgbd :
Bruno Desthuilliers a formulé la demande :
Anthony a écrit :
bonjour,

j'imagine une base mysql avec la structure suivante :
- table morceaux
- table personnes

Avec un lien entre morceaux et personnes, sachant que les tables peuvent
être liées de façon complexe :

- fiche morceau : titre, année, producteurs, chanteurs...



Je t'arrête tout de suite. Un attribut se doit d'être atomique, donc




Et le multivalué, hein, vous en faites quoi du multivalué ?

:-D

PS: helios60 s'en encore fait jeter de wikipedia !



N'invoquez _jamais_ le diable !

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
helios
Le #21920591
Alain Montfranc a écrit :
Bruno Desthuilliers a formulé la demande :
Anthony a écrit :
bonjour,

j'imagine une base mysql avec la structure suivante :
- table morceaux
- table personnes

Avec un lien entre morceaux et personnes, sachant que les tables peuvent
être liées de façon complexe :

- fiche morceau : titre, année, producteurs, chanteurs...



Je t'arrête tout de suite. Un attribut se doit d'être atomique, donc




Et le multivalué, hein, vous en faites quoi du multivalué ?

:-D

PS: helios60 s'en encore fait jeter de wikipedia !




le PS est de la diffamation et si j'étais aussi procédurier qu'un
certain Homo qui fréquente ce forum je vous assignerais pour cela
Bruno Desthuilliers
Le #21920581
JKB a écrit :
(snip)
N'invoquez _jamais_ le diable !



Trop tard :(
Bruno Desthuilliers
Le #21920571
Alain Montfranc a écrit :
Bruno Desthuilliers a formulé la demande :

Je t'arrête tout de suite. Un attribut se doit d'être atomique, donc




Et le multiva



Ah, non, shut, malheureux, ne dit pas ce mot, NON, NE LE DIT PAAAAAAS !!!!!!

lué, hein, vous en faites quoi du multivalué ?



Et merdre, trop tard :(
Alain Montfranc
Le #21920561
helios a pensé très fort :
Alain Montfranc a écrit :
Bruno Desthuilliers a formulé la demande :
Anthony a écrit :
bonjour,

j'imagine une base mysql avec la structure suivante :
- table morceaux
- table personnes

Avec un lien entre morceaux et personnes, sachant que les tables peuvent
être liées de façon complexe :

- fiche morceau : titre, année, producteurs, chanteurs...



Je t'arrête tout de suite. Un attribut se doit d'être atomique, donc




Et le multivalué, hein, vous en faites quoi du multivalué ?

:-D

PS: helios60 s'en encore fait jeter de wikipedia !




le PS est de la diffamation et si j'étais aussi procédurier qu'un certain
Homo qui fréquente ce forum je vous assignerais pour cela



http://cjoint.com/data/lrmTLzVMbc.htm
helios
Le #21920551
Alain Montfranc a écrit :
helios a pensé très fort :
Alain Montfranc a écrit :
Bruno Desthuilliers a formulé la demande :
Anthony a écrit :
bonjour,

j'imagine une base mysql avec la structure suivante :
- table morceaux
- table personnes

Avec un lien entre morceaux et personnes, sachant que les tables
peuvent
être liées de façon complexe :

- fiche morceau : titre, année, producteurs, chanteurs...



Je t'arrête tout de suite. Un attribut se doit d'être atomique, donc




Et le multivalué, hein, vous en faites quoi du multivalué ?

:-D

PS: helios60 s'en encore fait jeter de wikipedia !




le PS est de la diffamation et si j'étais aussi procédurier qu'un
certain Homo qui fréquente ce forum je vous assignerais pour cela



http://cjoint.com/data/lrmTLzVMbc.htm




et alors quand c'est vrai c'est aussi de la diffamation :

la médisance est de la diffamation vrai
la calomnie est de la diffamation fausse

la justice ne connait que la diffamation vrai ou fausse ne change rien
aux fait de diffamation
Alain Montfranc
Le #21920541
Bruno Desthuilliers a exposé le 17/11/2009 :
Alain Montfranc a écrit :
Bruno Desthuilliers a formulé la demande :

Je t'arrête tout de suite. Un attribut se doit d'être atomique, donc




Et le multiva



Ah, non, shut, malheureux, ne dit pas ce mot, NON, NE LE DIT PAAAAAAS !!!!!!

> lué, hein, vous en faites quoi du multivalué ?

Et merdre, trop tard :(



Ceci dit le multivalué zimboum truc chouette se remplace aisément par
l'ajout de tables intermédiaires dans des systèmes plus répandus,
normalisés, mieux testés et probablement plus fiables.
Publicité
Poster une réponse
Anonyme