Conception Database

Rechercher

Conception Database

Par Vini  -  12 reponses  -  Le 19/09/2008 12:44  -  Editer  - 

Bonjour tous le monde !

Je debute dans la conception et j'ai lu pas mal d'article plus ou moin complexe !

j'ai encore du mal à definir mes relations entre table et donc à savoir si il faut couper, rassemblé ou crée une table intermediaire du genre 1:1 - 0:n - 1:n - n:n

je crée un base avec pour but la gestion de cd virtuel.

je voudrais savoir si elle est bien pensée et si non que pourrais je modifier ?

j'ai crée :

une table albums : dans un album peux y avoir les titres d'un single ou bien des titre hors single

une table **single **: car il peux y avoir un single sans album

une table **titre **: id - titre - temps - nbreTelechargé

je veux savoir le nombre detélécharcgement par titre que j'incrementerai dans la requete SQL

une table genre (Jazz, soul, funk) id - genre

une table **artist **: id - pseudo car il peux y avoir plusieur artists pour un titre ou un album

une table commentaires pour chaque titre

Mes relations:

albums 1:n titre

single 1:n

titre n:n artist

titre 1:n commentaire

titre 1:n genre

 

Merci de bien vouloir m'aider ;)

 

Réponses apportées à cette discussion

Par Emacs  -  Le 20/09/2008 00:03  -  Haut de page  - 

Hello Vini,

Personnellement (et ça n'engage que moi), je procéderai ainsi (je préfère les noms de tables en anglais ^^) :

 

  • 1 single est une sorte d'album, donc tu peux très bien ajouter un flag "is_single" dans ta table "Album". Ce champ prendra 1 seule valeur (0 ou 1). Tu peux ajouter en plus les informations de l'album (nom de la compilation, date de sortie, téléchargements, prix, category_id...)
  • Une table "Artist" (id, nom, prenom...)
  • Une table "Track" (id, titre, téléchargement...)
  • Une table "Track_Artist" (id_track, id_artist). Cette table te permet de savoir quel(s) est (sont) le(s) artiste(s) qui chante(nt) la chanson. Tu peux ajouter d'autres flags du genre "is_singer, is_compositor..."
  • Une table "Track_Album" (id_album, id_track, order). Cette table associe les pistes à un album. Le champ "order" te permet de spécifier l'ordre de chaque piste dans la compilation.
  • Une table "Category" (id, label). L'id est en clé étrangère dans la table "Album".
  • Une table "Comment" (id, object_id, object_model, pseudo, body) pour gérer les commentaires. Le champ "object_id" contient l'ID d'une "track" ou d'un "album". Le champ "object_model" contient une chaine (ou un entier) pour identifier soit une "track", soit un "album". Ainsi, la table "Comment" te permet de stocker tous les commentaires sur n'importe quel type d'objets (Track, Artist, Album...).

Je ne sais pas ce que tu penses de ce modèle ?

++

Hugo

 
Par Vini  -  Le 20/09/2008 12:07  -  Haut de page  - 

Thank you very much Emacs !

lool moi aussi je prefère l'anglais je me suis dis qu'en français serait peut etre plus simple pour me faire comprendre !

alors en effet ton model m'interesse beaucoup ! d'ailleur je vais le reprendre !

je travaille pas mal sur la conception BDD car c'est une étape importante et qu'il faut une certaine experience pour faire des modèles logique !

Quand je créer un modèl j'ai tendance à me laisser infuencer par les requètes car quand je vois le schema je me dis que quand je vais devoir faire une requète pour afficher toutes les informations de ces tables ca va etre la galère !

Je dois faire une erreur de logique mais bon je suis la pour apprendre et passer au dessus de tout cette complexité !

donc pour faire le point sur ma compréhension de ton modèl niveau relationnel:

  • CATEGORY 1:n ALBUMS
  • ALBUMS n:n TRACKS (table intermdediaire = TRACKS_ALBUMS)
  • TRACKS n:n ARTISTS (table intermediaire = TRACKS_ARTISTS)
  • TRACKS_ARTISTS 1:n ARTIST

 

ensuite j'ai encore des soucis niveau clé primaire et auto_incrementation

un champ **id **qui possède une clef primaire est d'office indexé ? si oui ce la suppose que chaque id doit être unique ?

car une table intermediaire(relationnel) peut avoir plusieurs fois le même numero

Prenons comme exemple la table **TRACKS_ARTISTS **

plusieus tracks peuvent avoir plusieurs fois le même artist donc le champ ID_ARTIST peut avoir plusieurs fois le même numero donc je suppose que ce champ la doit être non primaire ?

je me pose toutes ces questions car après je vais devoir faire des selects, insert et update et c'est pas toujours évident de géré tout ce petit monde lool :D

Encore merci pour ton aide

 

 
Par Emacs  -  Le 20/09/2008 13:00  -  Haut de page  - 

Salut Vini,

De rien pour la réponse.

Concernant ta question, chaque index auto-incrémenté est d'office une clé primaire unique. C'est d'ailleurs le but de la clé primaire.

Dans les relations n:n, tu devras mettre en clé primaire le couple cle_id1,cle_id2. C'est l'association des deux clés primaires des deux tables liées qui forme la clé primaire de la troisième table. Prenons l'exemple tout bête :

Table Track : (id - titre)

  • 19 - Allumer le feu
  • 25 - Disturbia
  • 27 - Good girls gone bad
  • 28 - Umbrella
  • 76 - I'm like a bird

Table Album : (id - titre)

  • 14 - Compilation de l'été
  • 18 - Good girls gone bad
  • 56 - Nelly Furtado

Maintenant on se dit que les chansons sont réparties ainsi :

  • Compilation de l'été (Allumer le feu, Disturbia, I'm like a bird)
  • Good girls gone bad (Umbrella, Good girls gone bad, Disturbia)
  • Nelly Furtado (I'm like a bird)

Tu vois bien que des titres peuvent être présents dans plusieurs albums. Donc notre table "Album_Track" possèdent deux champs qui forme la clé primaire (album_id, track_id). En effet, c'est l'association de ces deux clés uniques qui fait l'unicité de la clé dans la table. En effet, l'association (Nelly Furtado // I'm like a bird) ne pourra pas être présent plus d'une fois. Il s'agit bien d'un seul album qui contient cette chanson. Au final nous obtenons en BDD dans la table Album_Track (album_id, track_id) :

  • (14 - 19) [compilation de l'été]
  • (14 - 25) [compilation de l'été]
  • (14 - 76) [compilation de l'été]
  • (18 - 25) [good girls gone bad]
  • (18 - 27) [good girls gone bad]
  • (18 - 28) [good girls gone bad]
  • (56 - 76) [nelly furtado]

Et voilà, maintenant on sait comment sont répartis les titres dans les albums. Pour les récupérer c'est tout bête, il suffit de faire une jointure entre les tables. Par exemple je souhaite récupérer tous les titres de l'abum "Good Girls Gone Bad" (id=18). Ma requête SQL aura la forme suivante :

1.          SELECT a.id, a.titre, t.id, t.titre

2.          FROM titre AS t

3.          JOIN album_track AS at ON at.track_id = t.id

4.          JOIN album AS a ON at.album_id = a.id

5.          WHERE a.id = 18

6.          ORDER BY t.titre ASC

Normalement je devrais obtenir le résultat suivant :

1.          A.id - A.titre             - T.id - T.titre

2.          18   - Good girls gone bad - 25   - Disturbia

3.          18   - Good girls gone bad - 27   - Good girls gone bad

4.          18   - Good girls gone bad - 28   - Umbrella

Tu as compris le principe ?

++

Hugo.

 
Par Vini  -  Le 20/09/2008 13:50  -  Haut de page  - 

Merci !

J'y suis presque en effet je commence à comprendre la logique !

donc pour notre table albums_tracks qui fais l'association :

je crée donc 2 champs id_albums et id_track simple je leur met pas à chacun des champs, une clé primaire puisque c'est la somme des 2 clés primaire d'albums et track qui fais l'unicité et donc unique !

voila comment j'ai compris la chose !

en même temps tu m'a conseiller de mettre un champ Order qui est une bonne idée et qui m'amène à me poser d'autre question ?

ce champ doit être avec une cle primaire ? et le fais que ce soit une table intermediaire ne pose pas de problème on n'est pas figé que sur 2 champs ?

 
Par Emacs  -  Le 20/09/2008 14:17  -  Haut de page  - 

Voici à quoi doit ressembler la structure de ta table Album_Track :

CREATE TABLE `album_track` (
`album_id` INT NOT NULL ,
`track_id` INT NOT NULL ,
`order` INT NOT NULL DEFAULT 1 ,
PRIMARY KEY ( `album_id` , `track_id` )
);

Tu remarques que les deux premiers champs sont placés en tant que clé primaire de la table. Une clé primaire est toujours unique donc cela signifie que les couples de valeurs album_id / track_id seront tous uniques dans la table.

Quant au champ "order" il s'agit simplement d'un entier dont la valeur va de 1 à n (où n est le numéro de la track dans l'album). Il n'a nul besoin d'être placé comme clé quelconque. A la rigueur peut-être clé d'index puisque tu seras amené à trier selon ce champ. Tu peux également ajouter un champ "downloads" de type "int" qui te permet de comptabiliser le nombre de téléchargement individuel d'une track dans un seul album. Ainsi tu pourras avoir des stats sur les albums et tracks les plus populaires.

++

 
Par Vini  -  Le 20/09/2008 15:31  -  Haut de page  - 

Fine !

voila c'est ca que j'avais pas capté !

c'est "les couples de valeurs albums_id / track_id "

c'est la bonne formule pour moi et ta structure ma confirmé ta formule !

ca veux dire que le couple doit etre unique pas forcément le champ

du genre :

*
* (18 - 27) [good girls gone bad]

*
* (18 - 28) [good girls gone bad

le champ id_album est en double mais pas 2 fois le meme titre pour le meme albums

en gros c'est l'addition des 2 qui crée un nombre unique !

je repète sous une autre forme ma compréhension.

 

maintenant pour la table TRACKS_ARTISTS je fais la même

CREATE TABLE TRACKS_ARTIST (
id_track int NOT NULL
id_artist int NOT NULL,
is_singer tinyint,
is_compositor tinyint NOT NULL,
PRIMARY KEY('id_track','id_artiste')
);

donc si j'ai bien compris c'est good !

parcontre encore un point obscurs on as pas trop parler de la table comments niveau relationnel

ce que je veux faire pour rappel c'est qu'on à une page qui affiche les photos de single ou d'albums sous forme de liste et quand on click sur un single ou un album, que ca affiche tout les details et en dessous pouvoir laisser un commentaire sur l'objet selectionné!

c'est pour une discography

la table je dois l'associé avec albums?

merci pour ta patience et ton aide qui ma été précieuse !

 
Par Emacs  -  Le 21/09/2008 13:04  -  Haut de page  - 

Salut Vini,

Pour la table "comment", tu dois avoir la structure suivante :

 

  • id (identifiant unique auto incrémenté du commentaire)
  • object_id (identifiant unique de l'objet à commenter : album ou single)
  • model_name (type d'objet commenté : album, artist, track)
  • pseudo
  • body
  • created_at (date de création)

Tu peux ajouter une clé d'index sur les champs "object_id" et "model_name" car les requêtes SQL agiront essentiellement sur ces derniers.

Cette structure te permet d'associer des commentaires à n'importe quel objet de ton application (news, article, album, artist, track...). Par exemple, si je commente l'album d'identifiant 45, la requête SQL d'insertion aura cette tête :

INSERT INTO comment (object_id, model_name, pseudo, body, created_at) VALUES(45, 'ALBUM', 'Emacs','Cet album est trop cool', NOW());

Et pour sélectionner tous les commentaires de l'album 45, tu feras :

SELECT id, pseudo, body, created_at FROM comment WHERE object_id = 45 AND model_name = 'ALBUM' ORDER BY created_at ASC

Tu comprends le principe ?

++

Hugo.

 
Par Vini  -  Le 21/09/2008 13:48  -  Haut de page  - 

Hello Emacs et merci !

Si j'ai bien compris on ne lie pas la table COMMENTS ce qui évite les dépendances et du coup fléxible pour y insérer divers type d'objet, Single, Album ou titre !

j'ai grace à ton aide crée mon Schema sur Mysql WorkBench et ça ma beaucoup aidé à comprendre les relations et pour cloturé ce post j'ai encore 1 ou 2 question comme je suis bien lancer autant en terminer avec ça bien lool

quand on determine une relation n:n quel est la bonne formule en français ? je m'explique !

le but est de bien determiner si on à besoin d'une relation n:n

pour une relation 1:n on dis

  • ex (un clients peut avoir plusieurs produit mais un produit ne peut avoir qu'un seul client )

et la formule pour n:n en francais

  • ex(plusieus albums peut avoir plusieur titre et plusieurs titre peuvent apartenir à plusieurs albums)

voila j'ai besoin de me le dire en francais pour arriver bien determiner mes relations !

peux tu me confirmer si j'ai bon stp?

 
Par Emacs  -  Le 21/09/2008 19:35  -  Haut de page  - 

Pas de quoi pour l'aide. Pour répondre à tes deux questions, je vais prendre un cas d'école : le blog. Un blog est constitué de billets, de commentaires et de catégories. Nous avons 4 tables :

  • Post (id, title...)
  • Comment (id,post_id, pseudo, body)
  • Category (id,title)
  • PostCategory (post_id, category_id)

Comme tu peux le voir, nous avons deux types de relations. Une relation 1:n entre les tables Comment et Post, et une relation n:m entre les tables Post, Category et PostCategory.

En effet, un billet (Post) peut avoir de 0 à n commentaires (Comment), c'est pourquoi nous plaçons dans la table Comment la clé étrangère vers l'identifiant unique de l'article associé. On peut donc dire :

  • Un billet peut avoir de 0 à n commentaires
  • Un commentaire n'est associé qu'à un seul et unique billet

De l'autre côté, on considère qu'un article peut-être associé à 1 ou plusieurs catégories et qu'une catégorie peut contenir de 0 à n catégories. On a donc une relation ternaire justifiée par la table intermédiaire PostCategory. On peut donc dire :

  • Un billet est associé à 1 ou plusieurs catégories
  • Une catégorie contient de 0 à n billets

C'est aussi simple que cela :)

++

 
Par Vini  -  Le 22/09/2008 11:23  -  Haut de page  - 

Encore merci pour ton aide !

j'ai tester ma base en faisant des Jointures etc... et ça marche niquel quand on as fais une bonne conception !

un dernier truc en rapport avec ce post et ca me donne un exercice !

car on à fais la conception d'une base et on ce dis tiens ! on à oublié un truc lool

un album peut avoir plusieurs photos(livret) et un single souvent que 2!

la photo d'un single peut très bien se trouver sur un album et sur la compile de l'été !

je dirais donc relation n:n

j'ai donc crée une table COVERS!

je reflechi à la meilleurs solution et devrais je plutôt faire: (je te donne le chemin comme une jointure

  • catrgory -> albums -> covers_albums -> covers -> tracks_albums -> track etc

ou bien je devrais la mettre entre category et album ?

ca sera la dernère question sur ce post la! lool :D

en tous cas ça m'a vraiment aidé j'ai beaucoup avancé !

souvent dans les cours ou tutoriaux, qu'on trouve sur le net c'est soit trop complexe ou bien un manque d'informationsqui pourtant ne serais pas de trop ! :)

 

 

 

 
Par Emacs  -  Le 25/09/2008 20:15  -  Haut de page  - 

Salut,

Désolé pour le temps de réponse mais je suis un peu pris en ce moment. Si un album (et / ou single) peut avoir de 1 à n covers, il suffit de faire une table "cover" et une table "album_cover" pour avoir la relation n:m.

++

Hugo.

 
Par Vini  -  Le 26/09/2008 11:40  -  Haut de page  - 

hello !

Je comprend t'inquiete c'est normal !

en faite ce que je te demandais c'est par rapport à la table category ?

car je l'avais déjà créer la table covers et albums_cover ! j'ai mis le chemin plus haut

ma question etait je la place ou ?

car category est relier à albums qui est relier à artist etcet la j'ai remplacer la liaison par covers, albums_covers albums etc et je sais pas trop ou je dois mettre category ?

 

car si je relie albums avec covers et albums avec category après je serais pas faire la jointure avec les 2 et ensuite joindre album ->tracks_albums -> tracks etc !

à moin peut etre que je fasse un select imbriquer je sais pas ?

 

merci pour ta patience je sais que t 'es pas mal occupé mais prend ton temps y'a pas de souci !

Vini :)

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |