BDD (MySQL) organisation d'une table, help plz.

Fermé
Ruka - 13 juil. 2013 à 16:13
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 - 16 juil. 2013 à 15:23
Bonjour,

Le titre n'est pas clair, je vais m'expliquer ici.

Alors je suis en train de créer un site sur la musique, il montrera tous les albums de chaque artiste avec toutes les pistes de l'album.
Les albums, je les affiche avec un tableau.
Ce que je n'arrive pas à faire, c'est pas quelque chose de compliqué, c'est juste de l'organisation.

+-----------------------------------+
Ma table ALBUM comporte:
- num_piste
- nom_artiste
- nom_album
+-----------------------------------+

Et j'aimerais pouvoir afficher chaque piste de l'album aussi, mais j'préfère évité de mettre plusieurs champs : piste1, piste2, piste3,... pistes11 dans la table ALBUM.


Existe t-il un moyen de faire comme tel :

+-----------------------------------+
Ma table ALBUM comporte:
- num_piste
- nom_artiste
- nom_album
- pistes_album (TEXT)
+-----------------------------------+

J'ajoute le champs "pistes_album" pour inclure toutes les pistes de l'album. Puis, dans ma page PHP, faire un système pour qu'il prenne chaque piste et le mettre entre chaque cellule "<td>" et "</td>" du tableau.

Si quelqu'un me trouve une solution, ça me ferait gagner beaucoup de temps car coder plusieurs tableau à la main, c'est lonnnnng !!!
Je compte faire une boucle pour afficher chaque piste si vous trouvez une solution.

Merci bien :)
A voir également:

2 réponses

js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 353
13 juil. 2013 à 16:29
Non, je pense que c'est une mauvaise idée de mettre les titres des pistes dans un champ.

Voilà comment je vois la base :
Table ARTISTE
- id_artiste : int, clé primaire
- nom_artiste : varchar
- on ajoute un champ supplémentaire pour chaque info sur l'artiste qu'on veut stocker

Table ALBUM
- id_album : int, clé primaire
- num_artiste : int, doit correspondre à l'id de l'artiste dans la table précédente (clé étrangère)
- nom_album : varchar
- on ajoute un champ supplémentaire pour chaque info sur l'album qu'on veut stocker

Table PISTE
- num_piste : int, le même numéro que sur le cd
- num_album : int, doit correspondre à l'id de l'album dans la table précédente (clé étrangère)
- titre : varchar
- on ajoute un champ supplémentaire pour chaque info qu'on veut stocker pour une piste
La clé primaire de cette dernière table est sur l'union des attributs num_piste et num_album, c'est-à-dire qu'une piste est identifiée par son album et son numéro dans l'album, reporte-toi à la documentation de ton SGBD pour trouver le code à écrire pour déclarer cette clé primaire.

En espérant que tu y vois plus clair...
1
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 353
Modifié par js95 le 13/07/2013 à 16:40
Un exemple de code MySQL pour créer la table piste
CREATE TABLE IF NOT EXISTS piste (
 num_piste int not null,
 num_album int not null,
 titre varchar not null,
 PRIMARY KEY (num_piste, num_album),
 INDEX(num_piste),  -- facultatif, indexe les numeros de piste (pour accelerer la recherche)
 FOREIGN KEY (num_album) REFERENCES album(id_album) ON DELETE CASCADE,
-- on delete cascade : pour garder une base propre, si on supprime un album toutes les pistes rattachées à cet album seront supprimées 
 INDEX(num_album)  -- facultatif, indexe les numeros d'album (pour accelerer la recherche)
) TYPE=InnoDB DEFAULT CHARSET=utf8;
0
Merci pour avoir pris le temps de réfléchir à mon sujet.
Ca me semble pas si mal, par contre à votre avis, je suis obligé de créer une table PISTE ?
J'avais pensé à créer une table ALBUM, mais si je dois créer une table PISTE ça va me prendre un siècle pour terminer mon site ^^'
Bon ok, je vais faire avec. Maintenant pour afficher chaque piste entre les cellules <td> et </td>, il me suffit de mettre "$titre" et c'est bon ?
0
Ruka Nizuka Messages postés 70 Date d'inscription dimanche 7 avril 2013 Statut Membre Dernière intervention 26 novembre 2016
13 juil. 2013 à 17:12
Merci pour tout ! :)
0
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 353
14 juil. 2013 à 12:43
> je suis obligé de créer une table PISTE ?
Oui, cette table est indispensable, un album ayant un nombre de pistes variable, pour afficher les pistes d'un album on peut ainsi facilement récupérer le nombre de pistes.
En revanche, si pour chaque artiste tu as très peu d'albums, tu peux éventuellement te passer de la table artiste et mettre le nom de l'artiste dans chaque album, mais en faisant attention qu'un même artiste soit toujours écrit de la même façon, de sorte à pouvoir opérer une sélection d'albums d'un même artiste.

> pour afficher chaque piste entre les cellules <td> et </td>, il me suffit de mettre "$titre" et c'est bon ?
Là ça dépend du langage de programmation que tu utilises. Je peux t'aider si tu utilises PHP.
0
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 353
14 juil. 2013 à 13:11
Si ça peut t'aider, voici deux méthodes pour l'affichage que tu souhaites obtenir.
La première est plus coûteuse pour le SGBD, mais moins pour la programmation.
La seconde est peu coûteuse pour le SGBD, mais nécessite plus de lignes de code.
Si tu utilises PHP/MySQL, je te recommande la deuxième car MySQL a tendance à ramer quand les requêtes deviennent conséquentes, bien qu'ici la première requête devrait passer (il n'y a que deux jointures).
-- Requête pour afficher les albums d'un artiste
SELECT nom_album, num_piste, titre
FROM piste
INNER JOIN album ON album.id_album=piste.num_album
INNER JOIN artiste ON id_artiste=num_artiste
WHERE nom_artiste='Michel Sardou'
ORDER BY nom_album, num_piste;
-- le résultat contient alors toutes les données à afficher

-- autre méthode avec plusieurs requêtes
-- etape1 : on récupère les albums
SELECT id_album, nom_album
FROM album
INNER JOIN artiste ON id_artiste=num_artiste
WHERE nom_artiste='Michel Sardou'
ORDER BY nom_album;
-- on passe en revue chaque résultat (un par un) dans une boucle
   -- on affiche le nom de l'album
   -- etape2 : on récupère les pistes de l'album courant
    SELECT num_piste, titre 
    FROM  piste
    WHERE num_album=?
    ORDER BY num_piste; -- en remplaçant ? par l'id de l'album courant (récupéré à l'étape 1), en prenant soin de faire une requête préparée afin de prévenir le risque d'injection SQL
   -- on fait une autre boucle pour afficher les pistes
-- fin de la grande boucle

0
Ruka Nizuka Messages postés 70 Date d'inscription dimanche 7 avril 2013 Statut Membre Dernière intervention 26 novembre 2016
14 juil. 2013 à 18:13
Pas mal, pas mal. Merci beaucoup d'avoir pris le temps de m'aider.
Avec ce que j'ai sous la main, je vais essayer d'en sortir quelque chose puis si j'ai un soucis, je reviendrais poster.
Merci encore.
0
seul problème, le système d'information pourra pas gérer les noms des musiciens d'un groupe.

Pour ça il faudra remplacer nom d'artiste par nom de groupe et faire une nouvelle table facultative qui permet de stocker pour chaque groupe quel artiste la compose et en y mettant un champ année début, année départ(qui peut être nul si le musicien est toujours dans le groupe) et éventuellement un champ de l'instrument/rôle de l'interprète.

Sinon la proposition de js95 est très bien mais ça m'a semblé utile à signaler.
0
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 353
16 juil. 2013 à 15:23
En effet, je n'ai pas envisagé ce cas, un album pouvant alors être affiché sur la page de différents artistes.
Le problème peut même encore se complexifier selon les informations que l'on souhaite stocker pour les pistes.
En effet, un artiste peut être impliqué seulement sur quelques pistes d'un album, plusieurs artistes peuvent être auteurs/chanteurs/compositeurs d'une même piste...
La majorité des albums ont ces particularités...
Tout dépend de ce qu'on veut vraiment afficher sur la page de chaque artiste.
0