IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Schéma Discussion :

Problème dans la conception d'une BDD


Sujet :

Schéma

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2012
    Messages : 7
    Par défaut Problème dans la conception d'une BDD
    Bonjour,

    Je vous demande de l'aide dans l'élaboration d'une base de données. Voici un lien pour vous montrer ce que j'ai fait : http://www.developpez.net/forums/att...1&d=1337823387 ! Le problème, c'est que ceci n'est pas cohérent avec ce que je veux faire.

    En effet, un fournisseur peut avoir plusieurs produits. Un produit peut être livré par plusieurs fournisseurs. Jusque là, tout fonctionne ! Le problème, c'est qu'une commande doit contenir plusieurs produits venant d'un SEUL ET UNIQUE fournisseur. Alors que dans le schéma que je vous ai envoyé, une commande peut contenir plusieurs produits de fournisseurs différents ...

    Merci d'avance

    PS 1 : pouvez-vous m'indiquer si les nommages de mes identifiants sont clairs. Si ce n'est pas le cas, quelles règles de nommage me conseillez-vous ?

    PS 2 : ne faites pas attention aux types des données, je les ai saisis vite fait
    Images attachées Images attachées  

  2. #2
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Par défaut
    Bonjour HABITB0L,

    Citation Envoyé par HABITB0L
    Le problème, c'est qu'une commande doit contenir plusieurs produits venant d'un SEUL ET UNIQUE fournisseur.
    ==> il faut stocker "id_fournisseur" dans "commande" (ne surtout pas le stocker dans "commande_produit_fournisseur", qu'il faudrait nommer "commande_detail" ou "commande _produit").
    Citation Envoyé par HABITB0L
    PS 1 : pouvez-vous m'indiquer si les nommages de mes identifiants sont clairs. Si ce n'est pas le cas, quelles règles de nommage me conseillez-vous ?
    ==> tu auras autant de réponses que de forumeurs !... ou à peu près : fais un tour dans les FAQ et tutos, il me semble que tu pourras trouver des bases. Sinon, Google te les trouvera également.

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Richard_35
    ==> il faut stocker "id_fournisseur" dans "commande" (ne surtout pas le stocker dans "commande_produit_fournisseur", qu'il faudrait nommer "commande_detail" ou "commande _produit").
    Sauf qu'avec ce modèle simple, on peut commander à un fournisseur des produits qu'il ne fournit pas.

    J'avais commencé à y réfléchir ce matin chez moi mais pas eu le temps d'aller au bout de la réflexion et de la rédaction.
    J'y reviendrai plus tard.
    HABITB0L, tu trouveras sûrement des exemples similaires dans les discussions de ce forum.
    Tu verras ainsi qu'il vaut mieux donner un titre plus explicite pour faciliter la recherche !

    Citation Envoyé par Richard_35
    ==> tu auras autant de réponses que de forumeurs !
    Un premier article à lire qui donne un standard de nommage des objets d'une BDD.

    Je l'ai un peu adapté de cette manière concernant les identifiants :
    - code_id pour les identifiants des tables issues des entités du MCD, avec 'code' = le code mnémotechnique de 3 lettres rappelant le nom de la table où se trouve la colonne.
    - code_id_autre_table ou code_id_nom_clair pour les portant une clé étrangère.

    Exemple :
    personne -0,n----diriger----1,1- projet -1,1----concerner----0,n- client

    te_personne_prs (prs_id, prs_nom...)
    te_projet_prj (prj_id, prj_id_chef, prj_id_client, prj_nom...)

    Ce standard peut sembler rébarbatif au début mais on s'aperçois vite qu'on n'a même plus besoin de regarder son MCD ou MLD pour écrire les requêtes quand on a bien son schéma en tête.

    J'écrirais un billet de blog un de ces 4 sur les raisons qui m'ont poussé aux adaptations que j'ai faites du standard de SQLPro.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Par défaut
    Bonjour Philippe,

    Citation Envoyé par CinePhil
    Sauf qu'avec ce modèle simple, on peut commander à un fournisseur des produits qu'il ne fournit pas.
    ==> ma réponse n'était, effectivement, pas complète. HABITB0L aura, sans doute, pris soin de la compléter :
    Citation Envoyé par Richard_35
    ==> il faut stocker "id_fournisseur" dans "commande" (ne surtout pas le stocker dans "commande_produit_fournisseur", qu'il faudrait nommer "commande_detail" ou "commande _produit")...
    ... et modifier les relations en conséquence.

  5. #5
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 162
    Billets dans le blog
    16
    Par défaut
    Pauvre HABITB0L, confronté à un p... de problème !


    En réalité, du fait de la contrainte qui veut que pour une commande le fournisseur soit unique quels que soient les produits, la prétendue clé (candidate) de la table commande_produit_fournisseur est seulement une surclé réductible à une paire :




    Pour la suite, pour éviter les maux de tête, permettez-moi d’utiliser des noms moins chargés :



    Le problème est qu’après avoir défini la clé authentique (irréductible) de la table, il y a maintenant viol de la deuxième forme normale (2NF). En effet, la contrainte initiale donne lieu à la dépendance fonctionnelle :
    DF1 : CommandeId -> FournisseurId
    La solution consiste à appliquer le théorème de Heath, en décomposant la table CDE_PROD_FOUR peccamineuse selon :
    CPF1 {CommandeId, FournisseurId}, laquelle peut être absorbée par la table COMMANDE ;

    CPF2 {CommandeId, ProduitId, Quantite, Montant}.
    Malheureusement, comme dit CinePhil, on peut désormais commander des produits non fournis par le fournisseur concerné...
    Pour éviter cela, au stade opérationnel il faudra en passer par la mise en œuvre d’un trigger veillant au grain.

    Il en va de même si on préfère ne pas décomposer la table : mettre en œuvre un trigger veillant à ce que la dépendance fonctionnelle DF1 soit respectée.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #6
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Par défaut
    Bonjour Fsmrel,

    Il me semble préférable de stocker le fournisseur dans l'entête de la commande, puis développer un trigger de contrôle qui vérifie que le couple {Fournisseur(entête), Produit(détail)} existe dans le catalogue fournisseur.

    Soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Fournisseur ---0,n---[Commander]---1,1--- Commande_Fournisseur ---1,n---[Composer]---1,n--- Produit
        |                                                                                          |
        +------------------------------0,n---[Fournir]---1,n---------------------------------------+
    donnant :
    Fournisseur(Id_Fournisseur, Nom,...) ;
    Produit(Id_Produit, Libellé, ...) ;
    Prod_Four(#Id_Fournisseur, #IdProduit, ...) ;
    Commande(Id_Commande, #Id_Fournisseur, Date_Commande, ...) ;
    Commande_Détail(#Id_Commande, #Id_Produit, Quantité, ...).
    Non ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème dans l'implémentation d'une fonction de pagination
    Par Lost In Translation dans le forum Langage
    Réponses: 2
    Dernier message: 11/12/2007, 10h35
  2. Réponses: 2
    Dernier message: 10/12/2007, 18h47
  3. [SQL] Compteur de saisies dans des champs d'une BDD
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 28/02/2007, 13h54
  4. Ecrire dans un fichier ou une bdd
    Par HaTnuX dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/01/2007, 14h02
  5. Réponses: 3
    Dernier message: 15/07/2005, 17h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo