Conception BDD

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Conception BDD

par hi-logik » 22 févr. 2009, 20:32

c'est vrai !

je vais voir comment faire évoluer cette base avec ce que tu m'as appris !
j'ai sûrement des choses encore à voir au niveau des données à enregistré !


je penses qu'avec cette méthodologie et un peu de pratique sur divers cas je devrais
arriver à faire des bases de données qui tienne la route !

je te remercie pour l'aide que tu m'as apporté ce fut très enrichissant !

Bonne soirée !

++ ^^

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par Cyrano » 22 févr. 2009, 20:16

Je dirais que ce qu'il est important de retenir dans l'idée général, c'est qu'on répartit les informations de telle sorte qu'on évite les doublons et autres répétitions inutiles, on simplifie de ce fait la maintenance et les mises à jour du contenu. Ensuite, si on a correctement identifié les bonnes entités, on aura très très peu de propriétés permettant des valeurs NULL.

Ça donnera peut-être lieu a un nombre de tables plus important, mais de plus petites tailles et convenablement réparties. Avec les bonnes requêtes et les jointures appropriées, on retrouvera n'importe quelle informations pertinente très rapidement :)

par hi-logik » 22 févr. 2009, 20:11

l'idée de l'entité OPTION est effectivement à considérer. Mais c'est avec quelle autre entité tu dois la relier. SERIES serait le premier choix, mais comment pourras-tu déterminer quelles options tel client a dans le véhicule qu'il a acheté ? Ne faudra-t-il pas également relier OPTION et VEHICULE ?
en effet tu as raison ! je n'y avais pas pensé !

donc:

SERIE 0:n OPTIONS et OPTIONS 1:n SERIES

et la même pour vehicule !

VEHICULES 0:n OPTIONS et OPTIONS 1:n VEHICULES

Ca se dessine c cool je commence grace à cette exercice à mieux comprendre les relations !

par Cyrano » 22 févr. 2009, 19:54

Salut,
l'idée de l'entité OPTION est effectivement à considérer. Mais c'est avec quelle autre entité tu dois la relier. SERIES serait le premier choix, mais comment pourras-tu déterminer quelles options tel client a dans le véhicule qu'il a acheté ? Ne faudra-t-il pas également relier OPTION et VEHICULE ?

Si on reprend, ça donnerait :
- SERIE propose 0:n OPTION
- OPTION équipe 1:n SERIE
- VEHICULE possede 0:n OPTION
- OPTION est installée dans 0:n VEHICULE
Et dans ce cas, tu vas te retrouver dans le modèle physique avec une table relationnelle entre OPTION et VEHICULE en plus de la relation entre SERIE et OPTION.

Pour l'ajout des séries, tu peux effectivement les rajouter au fur et à mesure, d'autant que les constructeur sortent périodiquement de nouvelles séries ponctuellement pour des modèles existant, voire des nouveaux modèles, moins souvent, mais il faudra pouvoir les ajouter également.

par hi-logik » 22 févr. 2009, 13:37

Bonjour et merci Cyrano !

et en théorie un moteur est unique à chaque SERIES? puisque la SERIES 1,9 n'es pas le même que celle de la 1,2 TD par exemple et moi j'aurais tendance à dire qu'un moteur appartient à une seul SERIES donc 1:1
donc je penses que je peux la fusionné avec en series 1:1 motorisation ?

Alors il y aurait une alternative
en effet je penses que je vais opté pour cette solution !

une petite question aussi pour marque, model, serie:

j'ai déjà en catalogue toutes les marques de voitures et les modèles mais pas les serie qui y correspond ca risque d'etre beaucoup de travail de trouver toutes les serie et de plus il n'est pas sur que j'ai besoin de tout ! je penses donc qu'il faut que j'enregistre une serie au cas par cas qu'en penses tu ?

de plus j'ai ajouter une table options (climatisation...)
je devrais créer une entité relationnel entre SERIES et OPTIONS
car l'entité serie peut avoir 0:n options et options appartiens à 1:n series

ca m'a l'air pas mal si je me trompe pas !

par Cyrano » 21 févr. 2009, 11:12

Salut,
.. en théorie un moteur est unique à chaque SERIES? puisque la SERIES 1,9 n'es pas le même que celle de la 1,2 TD par exemple et moi j'aurais tendance à dire qu'un moteur appartient à une seul SERIES donc 1:1

après je suis pas un expert de l'automobile je me trompe sûrement qu'en penses tu ?
Oui, ça se tient assez bien
ensuite est que c'est bien dans l'entité relationnel serie_has_user que je me le prix l'immatriculation ou bien il manque quelque chose que je dois trouver ?
Oui, au même titre que les dates d'achat/vente. Sommairement, tu te retrouves donc avec une table serie_has_user, quand un utilisateur achète une nouvelle voiture, ça va rajouter une ligne de données dans cette table. On pourrait même pousser un peu en ajoutant dans cette table un troisième élément à la clé primaire : le numéro de série par exemple, numéro qui est unique pour chaque véhicule. En effet, rien n'interdit à un utilisateur d'acheter plusieurs exemplaires d'une même série : or ça poserait un problème d'unicité de données puisqu'on ne pourrait pas avoir deux fois la même paire ser_id/usr_id.

Alors il y aurait une alternative : au lieu d'avoir une relation serie_has_user, on pourrait avoir une entité véhicule avec comme relation:
- user peut avoir 0:n vehicule et vehicule appartient à 1:1 user
- vehicule peut être 1:1 serie et serie correspond à 0:n vehicule
Et dans ce cas, vehicule a sa propre clé primaire veh_id par exemple et on va retrouver en clé étrangère ser_id et usr_id. Et dans cette entité vehicule, tu vas avoir diverses propriétés comme les dates d'achat/vente, l'immatriculation, le numéro de série, le prix d'achat (lorsque l'utilisateur achète le véhicule), le prix de vente (lorsque l'utilisateur revend ce même véhicule)

par hi-logik » 20 févr. 2009, 20:14

Merci ! Et bien c'est comme ça que la voyais aussi après réflexion!

j'ai aussi réfléchi entre temps pour le coté moteur !

SERIES/MOTEUR c'est bien 1:1 en effet puisque il y'a une motorisation pour une SERIES

et en théorie un moteur est unique à chaque SERIES? puisque la SERIES 1,9 n'es pas le même que celle de la 1,2 TD par exemple et moi j'aurais tendance à dire qu'un moteur appartient à une seul SERIES donc 1:1

après je suis pas un expert de l'automobile je me trompe sûrement qu'en penses tu ?

ensuite est que c'est bien dans l'entité relationnel serie_has_user que je me le prix l'immatriculation ou bien il manque quelque chose que je dois trouver ?

l'avantage c'est que j'en apprend autant sur le MCD que l'automobile lol

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par Cyrano » 20 févr. 2009, 19:37

Re,
bon ben après réflexion, je n'étais pas loin, mais la première idée était plus juste.

Sommairement, le quelette de base de ton modèle de données devrait ressembler à ceci :
Image

par hi-logik » 20 févr. 2009, 16:56

C'est une bonne gymnastique intellectuelle, je te l'accorde, mais ne vas pas une seule seconde penser que c'est une perte de temps
bien au contraire je trouve que c'est très instructif !

et c'est comme ça que j'apprendrais le mieux !

je vais donc méditer sur la question et reviendrais pour y répondre en espérant trouvé le piège que tu m'as tendu mdrrr :D

thanks !

par Cyrano » 20 févr. 2009, 16:52

L'histoire des motorisation est en réalité un petit piège.

Je vais te laisser y réfléchir, mais avec un indice toutefois : dans la description des relations que je t'ai faite plus tôt, il manque une relation avec la motorisation, par contre celle que j'ai indiquée est fausse. SERIES utilise 1:1 MOTORISATION, et MOTORISATION équipe 1:n SERIES. Mais MOTORISATION est également reliée à une autre entité du modèle de données. C'est ce qui va te permettre de relier USER à un véhicule bien précis équipé d'un moteur précis également, enfin si je me suis pas gouré et j'ai un doute à ce propos. Faudra que j'y revienne dans la soirée, là je suis au bureau, j'ai pas trop le temps de m'arrêter dessus.

C'est une bonne gymnastique intellectuelle, je te l'accorde, mais ne vas pas une seule seconde penser que c'est une perte de temps ;)

par hi-logik » 20 févr. 2009, 16:32

Tout abord merci pour ton aide !

merci de m'avoir repris sur les relations je penserais à l'avenir à donner les relations dans les 2 sens dans ma tête c'est explicite mais c'est vrai que sa doit être explicite pour tous le monde, afin de me mieux me faire comprendre !
SERIES peut comprendre 1 à n MOTORISATION et MOTORISATION correspond à 1 et n SERIES : attention ici, un même moteur peut être utilisé pour différent véhicules d'un même constructeur;
si une motorisation connais ça SERIES qui connais son MODEL jusqu'a la MARQUE si je dis bon
ou dois je faire attention ?
que me conseille tu par rapport à ce cas de figure ?

pour ce qui est de l'entité USERS et la table relationnelle et SERIES justement je me suis aussi posé la question!

car comme tu l'a citer un USER peut posséder de 0 à n SERIES et une SERIES appartiens qu'a un seul USER c'est donc la notion d'historique qui justifie cette table c'est à dire la date qui me permet d'archiver par exemple ?

merci aussi pour l'astuce ENUM je connaissais pas ça chez MYSQL je vais l'etudier de plus près sur leur doc !

par Cyrano » 20 févr. 2009, 15:31

Salut,
je vois donc pour commencer USER, MARQUE, MODEL, SERIES, MODEL, MOTORISATION, ENERGIES

une MARQUE peut avoir de 1 à n MODEL
un MODEL peut avoir de 1 à n SERIES
une SERIES peut avoir de 1 à n MOTORISATION
une MOTORISATION peut avoir qu'un seul type d'energie mais je créer une entité pour avoir à evité de le réenregistré !
Tu en oublies une partie : tu indiques en effet les relations dans un seul sens : et dans l'autre ?
Donc, il faut établir les deux sens :
  • MARQUE peut comprendre 1 à n MODEL et MODEL correspond à 1 et 1 seul MARQUE;
  • MODEL peut comprendre 1 à n SERIES et SERIES correspond à 1 et 1 seul MODEL;
  • SERIES peut comprendre 1 à n MOTORISATION et MOTORISATION correspond à 1 et n SERIES : attention ici, un même moteur peut être utilisé pour différent véhicules d'un même constructeur;
  • MOTORISATION utilise 1 et 1 seul ENERGIE et ENERGIE alimente 0 à n MOTORISATION : mais là aussi, attention, tu auras assez peu de valeurs à enregistrer pour cette entité. Il existe un type ENUM avec MySQL et certains autres SGBDR pour un nombre limité de valeurs. Au bureau, j'ai même trouvé une astuce sous Oracle qui ne connait pas le type ENUM et j'ai fait sauter deux tables comme ça. Donc dans ce cas, je privilégierais cette option plutôt qu'une entité;
ensuite je peux faire comme tu me la conseillé une table relationnel entre USER et SERIES ce
qui me permetrais d'enregistrer les informations qui ne peuvent pas etre ni dans SERIES ni dans USERS!
Ce n'est pas la bonne raison d'avoir une table relationnelle : la bonne raison, c'est le type de relation :
USER peut posséder 0 à n SERIES, SERIES appartient à 1 et 1 seul USER : donc en principe, tu ne devrais pas avoir de table relationnelle.
comme l'immatriculation, une date d'acquisition éventuellement le prix, si c'est une première main... parce qu'elle peut par notre intermédiaire être revendu !
Voilà la raison qui modifie l'assertion précédente : SERIES appartient à 1 à n USER «dans le temps», on introduit là une notion d'historique qui justifie une relation n:n
je peux aussi créer une entité SERIE_CATEGORY puisque une serie peut avoir une category du style berline, break, coupé etc ! la aussi je préfère séparé pour évité les redondances...
Là, c'est comme pour le carburant : tu auras assez peu de valeurs différentes, donc ça peut rester une propriété de l'entité SERIES de type ENUM.

Je précise pour les curieux qui utiliseraient Oracle et se demandent comment j'ai procédé : je n'ai rien inventé et une recherche sur le net vous donnerait la même chose.

Dans la table, au lieu d'une clé étrangère, mettez une colonne de type Chaine-de-caractère d'une longueur appropriée. Ajoutez ensuite une contrainte du genre :

Code : Tout sélectionner

ALTER TABLE "NOM_SCHEMA"."NOM_TABLE" ADD CONSTRAINT "NOM_CONTRAINTE" CHECK ( LOWER(NOM_DE_LA_COLONNE) IN ('valeur possible 1','valeur possible 2','valeur possible 3') ) ENABLE;
Enjoy ! ;)

par hi-logik » 20 févr. 2009, 14:59

Hello !

bon j'ai lu se cours sur le MCD:
http://sqlpro.developpez.com/cours/mode ... ge=base#L2

en plus de tes conseils

voila comment je vois la chose pour la base !

je vois donc pour commencer USER, MARQUE, MODEL, SERIES, MODEL, MOTORISATION, ENERGIES

une MARQUE peut avoir de 1 à n MODEL
un MODEL peut avoir de 1 à n SERIES
une SERIES peut avoir de 1 à n MOTORISATION
une MOTORISATION peut avoir qu'un seul type d'energie mais je créer une entité pour avoir à evité de le réenregistré !

ensuite je peux faire comme tu me la conseillé une table relationnel entre USER et SERIES ce
qui me permetrais d'enregistrer les informations qui ne peuvent pas etre ni dans SERIES ni dans USERS!

comme l'immatriculation, une date d'acquisition éventuellement le prix, si c'est une première main... parce qu'elle peut par notre intermédiaire être revendu !

je peux aussi créer une entité SERIE_CATEGORY puisque une serie peut avoir une category du style berline, break, coupé etc ! la aussi je préfère séparé pour évité les redondances...

par hi-logik » 13 févr. 2009, 00:42

Merci pour cet éclaircissement comme tu l'as dis j'ai tendance à pensé table etc
faut que je prenne cette habitude c'est pas toujours évident mais avec de l'entrainement...
par contre j'ai des difficultés avec le mot cardinalités il est pas encore bien ancré dans mon cerveau lol!

je vais faire quelque recherche la dessus !

par Cyrano » 10 févr. 2009, 19:01

À ce stade, ne réfléchis pas en terme de "tables" et de "colonnes" : pense en terme d'entité et de propriétés.

Tu as un certain nombre de données à manipuler, certaines sont des entités, d'autres sont des propriétés de ces entités. C'est le tri que tu dois opérer en premier lieu en établissant les cardinalités entre les entités, c'est à dire si le lien entre deux entités est 0:1, 1:1, 0:n, 1:n ce qui en d'autres termes veut dire "entité A correspond 0 ou 1 fois à entité B" (remplace le 0 et le 1 par les autres possibilités de combinaisons citées juste avant)

C'est comme ça que tu obtiendras un modèle de données cohérent et surtout pérenne.