Base de donnée complexe (casse tête)

Répondre
Suta
le 19/04/2008 à 19:55
Suta
Bonjour,

Je cherche a faire une db un peu complexe mais je ne penses pas que ce soit impossible.
Le probleme c'est que "mathematiquement" je ne trouve pas de solution...

Je m'explique :

Mon but est de faire une base de donnée qui referencie des artistes, des groupes, et des genre musicaux.
J'ai donc créé 3 tables : artistes, groupes, genres

Mon probleme :

- Un artiste peu faire partie de plusieurs groupes et peut avoir plusieurs genres.

- Un groupe peut lui avoir plusieurs artistes et aussi plusieurs genres.

- Un genre musicale reuni plusieurs artistes ainsi que plusieurs groupes...

Bref vous voyez le truc de malade que ça donne.
Je sais pas si vous comprennez ou je veux en venir mais je vais essayer de l'expliquer clairement (c'est pas gagné ^^) :

Comment faire pour faire apparaitre tout les paramettre lié a un artiste (groupe, genre) sur une page en "piochant" dans les 3 differentes tables (artiste, groupe, genre) ?
Et biensure, la même chose avec groupe et genre ?

Je n'arrive pas a trouver la logique mathematique de la base...
Disons que ce n'est pas une question sur le php ou le mysql, mais plutot sur l'architecture de la base... Comment faire ?
Peut etre que je ne devrai pas creer 3 table... Mais alors je ne sais pas par ou commencer.

Merci à ceux qui oseront s'aventurer dans ce probleme complexe, et pour tout les indice ou coup de pouce que vous pourrez m'apporter.

Cordialement !!!
Suta
le 19/04/2008 à 20:04
Suta
Je voulais juste rajouter que j'ai penser a faire une sorte de wiki pour pallier a ce probleme.

Mais ça ne le résoud pas. Car effectivement un wiki n'est pas vraiment une base de donnée.

Bref si certain d'entre vous y ont penser aussi (au wiki) merci :p mais c'est pas vraiment ce que je recherche.

Aller je suis sur qu'avec plusieurs cerveaux ont peu y arriver.

++
moogli
le 20/04/2008 à 08:49
moogli
salut,

ajoute des tables.

je m'explique :
tu grade les tables artistes, groupes et genres.

tu n'affecte aucun groupe aux artistes dans ces tables ni aucun genre aux groupes.

ensuite tu crée une table qui sert de liaison
pour les artistes
artisteGroupe
id clef primaire de la table
idArtiste
idGroupe

tu peut ainsi mettre un artiste dans plusieurs groupes. si tu veut filtre un seul groupe facile ;)

idem pour le genre des groupes
table genreGroupe
id clef primaire
idGroupe
idGenre
etc

je te l'accorde les requêtes vont être plus complexe (jointure sur une ou deux tables à chaque fois) mais coté maintenance c'est plus simple et plus clair coté utilisation (tu veut supprimer un artiste d'un groupe tu supprime un tuple de la table artisteGroupe etc).

le nom des tables est bien sur à ta discrétion :d

@+
Il en faut peu pour être heureux !!!!!
Necnom
le 20/04/2008 à 22:40
Necnom
Bonjour,
Ce que tu cherches à faire n'est pas si complexe que ça, crois moi, il y a des situations "1000 fois" pires. Mais tu peux faire beaucoup plus simple, cela dépend de ce que tu veux vraiment faire. L'année dernière, je voulais moi aussi faire 3 tables: Disques, auteurs, et titres musicaux. Je l'ai fait et c'était assez complexe ( enfin... pas trop mais bon ) de tout scripter pour faire des affichages en page web en fonction de que le visiteur voulait. Finalement, je n'ai fait qu'une seule table: titres_musicaux , qui repertoriait tous les titres, avec les auteurs et me disque. Et ce n'était pas plus mal. Quand je voulais afficher des infos, quelques "WHERE" dans la requête SQL suffisaient. Tout ça pour dire que ça dépend de ce que tu veux faire, et que des fois on peut faire simple.
Necnom :)
LupusMic
le 21/04/2008 à 04:32
LupusMic
Il suffit de faire des tables de jointure :
create table artistes
( id integer auto_increment
, name char(100)
, primary key (id)
) ;

create table groupes
(id integer auto_increment
, name char(100)
, primary key (id)
) ;

create table artistes_groupes
( groupe_id integer not null
, artiste_id integer not null
, primary key (artiste_id, groupe_id)
, foreign key (artiste_id) references artistes(id)
, foreign key (groupe_id) references groupes(id)
) ;


En insérant les données suivantes :
insert into artistes (name) values  ('Zarakaï'),('Zehirman') ;
insert into groupes (name) values ('ZZ Top') ;
insert into artistes_groupes values (1, 2), (1,1) ;


Ainsi on pourrait retrouver tout les artistes d'un groupe :
select artistes.* from artistes 
join artistes_groupes on artistes.id=artistes_groupes.artiste_id
join groupes on artistes_groupes.groupe_id = groupes.id
where groupes.name = 'ZZ Top' ;


Bien sûr, tu peux complexifier en considérant l'appartenance à un groupe en fonction du temps, considérer qu'un artiste mort ne fait plus partie d'un groupe, qu'un groupe a une date de dissolution, etc.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
LupusMic
le 21/04/2008 à 04:35
LupusMic
Bon après relecture, moogli avait déjà donné la solution :p
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Suta
le 21/04/2008 à 13:04
Suta
Merci, effectivement c'est moins compliqué que ce que je pensais...

Je vais bosser la dessus et quand ce sera terminé je vous montrerai ;)

Merci mille fois pour votre aide !
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours