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 :

Correction MCD gestion de transport des marchandises


Sujet :

Schéma

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut Correction MCD gestion de transport des marchandises
    Bonjour
    Je sollicite vos avis concernant un projet de gestion de transport des marchandises.

    Voici le résumé du fonctionnement de l’entreprise :
    L’entreprise possède plusieurs bureaux dans deux pays différents (ici j’appelle chaque bureau : compte).
    Chaque client qui vient avec des articles à expédier est enregistré. Après les enregistrements, les articles sont chargés dans un camion pour les expédier vers un autre bureau de l’entreprise dans un autre pays (compte destination).

    Une fois arrivée, deux cas se présentes :
    Certains articles sont directement récupère par leur destinataire ;
    D’autres sont stock dans les magasins avant l’arrivée des propriétaires (destinataire).

    Dans les deux cas, un bon de sortie est fait pour le client c’est avec celui-ci qu’il paie a la caisse.

    NB : Il ma été dit aussi qu’il est possible de transférer certains stock dans d’autres magasins

    Nom : G-TRANSPORT MCD - 1.PNG
Affichages : 6196
Taille : 40,4 Ko


    Question :

    Je demande des pistes pour permettre la réception de chargement destiné à un compte avec la possibilité de faire des bons de sortie pour les articles récupérer et les paiements.

    Règles de gestion

    Chaque compte peut avoir plusieurs magasins, chaque magasin est lié à un seul compte ;

    Chaque magasin peut avoir plusieurs blocs (pour mieux classer les articles), chaque bloc est lié à un magasin ;

    Un enregistrement à deux comptes (expédition et destination), chaque compte peut avoir plusieurs enregistrements;

    Un enregistrement à deux clients (expéditeur et destinataire), chaque client peut avoir plusieurs enregistrements ;

    Un enregistrement à plusieurs lignes d’enregistrements, chaque ligne d’enregistrement concerne un enregistrement ;

    Chaque ligne d’enregistrements est concernée par un article, un article peut avoir plusieurs lignes d’enregistrements ;

    Chaque ligne d’enregistrements peut concerner un magasin, un magasin peut avoir plusieurs ligne d’enregistrements ;

    Chaque ligne d’enregistrements peut concerner un bloc de magasin, un bloc de magasin peut avoir plusieurs enregistrements ;

    Chaque chargement a des lignes de chargement, chaque ligne de chargement est liée à un seul chargement ;

    Chaque chargement a deux comptes (compte expédition et destination), chaque compte peut avoir plusieurs chargements ;

    Chaque ligne de chargement est liée à une ligne d’enregistrement, chaque ligne d’enregistrement peut avoir plusieurs lignes de chargement.


    Merci

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonjour mrfof,

    Avant d’aller au fond des choses.

    Citation Envoyé par mrfof Voir le message
    Il ma été dit aussi qu’il est possible de transférer certains stock dans d’autres magasins.
    Votre MCD est porteur d’une contradiction concernant les stocks. En effet, selon l’association Avoir_2, un stock appartient à au moins et au plus un bloc, alors que certains magasins peuvent avoir des stocks (association Avoir_3), tout en étant dépourvus de blocs.

    Une contrainte d’exclusion est à prévoir : les stocks dans un bloc d’une part, les stocks seulement en magasin d’autre part. A cet effet, on peut par exemple spécialiser STOCK en STOCK_EN_BLOC et STOCK_HORS_BLOC. L’entité-type spécialisée STOCK_EN_BLOC est alors à associer ( Avoir_2) à BLOC, tandis que l’entité-type spécialisée STOCK_HORS_BLOC est à associer ( Avoir_3) à MAGASIN.

    Par ailleurs puisqu’un stock peut être transféré dans un autre magasin, il faudrait envisager de modéliser le suivi des transferts.
    (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.

  3. #3
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut
    Bonsoir fsmrel

    Merci pour la remarque

    Citation Envoyé par fsmrel Voir le message

    Votre MCD est porteur d’une contradiction concernant les stocks. En effet, selon l’association Avoir_2, un stock appartient à au moins et au plus un bloc, alors que certains magasins peuvent avoir des stocks (association Avoir_3), tout en étant dépourvus de blocs.

    Une contrainte d’exclusion est à prévoir : les stocks dans un bloc d’une part, les stocks seulement en magasin d’autre part. A cet effet, on peut par exemple spécialiser STOCK en STOCK_EN_BLOC et STOCK_HORS_BLOC. L’entité-type spécialisée STOCK_EN_BLOC est alors à associer ( Avoir_2) à BLOC, tandis que l’entité-type spécialisée STOCK_HORS_BLOC est à associer ( Avoir_3) à MAGASIN.
    Voici la nouvelle version avec la modélisation du suivi de transferts

    Nom : G-TRANSPORT MCD - 3.PNG
Affichages : 4653
Taille : 80,5 Ko

    Transfert (De) : est la source
    Transfert (A) : est la destination

    Merci

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonjour mrfof,

    Pour le transfert d’un stock, ne faut-il pas prévoir la date de ce transfert ?

    Par ailleurs, le stock S appartient à un magasin M (directement ou via un bloc B). Ce magasin M appartient au compte C. Mais le stock S référence la ligne de chargement LC, laquelle référence le chargement C, lequel référence le compte d’expédition Ce et le compte de destination Cd : C doit-il être égal à Ce ? à Cd ?

    Bonne journé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.

  5. #5
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut
    Bonjour fsmrel

    Citation Envoyé par fsmrel Voir le message
    Pour le transfert d’un stock, ne faut-il pas prévoir la date de ce transfert ?
    Oui vous avez raison il est important de mentionner la date du transfert.

    Citation Envoyé par fsmrel Voir le message
    Par ailleurs, le stock S appartient à un magasin M (directement ou via un bloc B). Ce magasin M appartient au compte C. Mais le stock S référence la ligne de chargement LC, laquelle référence le chargement C, lequel référence le compte d’expédition Ce et le compte de destination Cd : C doit-il être égal à Ce ? à Cd ?
    Je pense les deux cas sont possibles.

    1 cas :
    Avant le chargement, le compte expéditeur qui détient les stocks peut décider de transférer certains articles dont le chargement ne va pas se faire tôt dans d’autres magasins.
    Dans ce cas, dans ce cas le compte propriétaire du magasin (C) doit être égal au compte d’expédition (Ce).

    2 cas :
    Puisque le compte de destination peut stocker les chargements reçus, donc à son tour il peut décider de transférer certains stocks (dans ses magasins).
    Dans ce cas le compte propriétaire du magasin (C) doit être égal au compte de destination (Cd).


    Le chargement est là pour dire quels sont les quantités que j’ai expédiées vers un autre compte comme mentionner dans mon premier poste.
    Chargement est comme une expédition.

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir mrfof,

    STOCK_HORS_BLOC et STOCK_EN_BLOC : ces entités-types n’ont pas à avoir d’identifiant en propre, car elles héritent de l’identifiant de STOCK.

    Avant le chargement, le compte expéditeur qui détient les stocks peut décider de transférer certains articles dont le chargement ne va pas se faire tôt dans d’autres magasins.
    Dans ce cas, dans ce cas le compte propriétaire du magasin (C) doit être égal au compte d’expédition (Ce).
    Soit (S) un stock donné. Via ASSO_24 (ou ASSO_25 et AVOIR_5) on sait quel est le magasin (M) qui détient (S). Connaissant (M), on connaît donc (C) (via POSSEDER).

    Maintenant, si je vous suis :

    Avant un 1er chargement, les associations CPTE_EXPEDITION et CPTE_DESTINATION ne sont pas valorisées, auquel cas le compte d’expédition (Ce) est forcément (C).
    Après ce 1er chargement, via CPTE_DESTINATION on sait précisément quel est le compte de destination (Cd). En même temps, l’association CPTE_EXPEDITION fait double emploi, c’est-à-dire qu’il y a une redondance à assurer, (C) = (Ce), ce qui n’est pas sain. Dans le cas général, peut-on dire que via ASSO_24 (ou ASSO_25 et AVOIR_5), le magasin (M) qui détient le stock (S) appartient au compte (C) tel que (C) = (Ce) ? Si oui, l’association CPTE_EXPEDITION peut disparaître. Si non, avez-vous un contre exemple justifiant la conservation dans le MCD de cette association ?
    (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.

  7. #7
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut
    Bonsoir fsmrel

    Citation Envoyé par fsmrel Voir le message
    STOCK_HORS_BLOC et STOCK_EN_BLOC : ces entités-types n’ont pas à avoir d’identifiant en propre, car elles héritent de l’identifiant de STOCK.
    D'accord

    Citation Envoyé par fsmrel Voir le message

    Maintenant, si je vous suis :

    Avant un 1er chargement, les associations CPTE_EXPEDITION et CPTE_DESTINATION ne sont pas valorisées, auquel cas le compte d’expédition (Ce) est forcément (C).
    Après ce 1er chargement, via CPTE_DESTINATION on sait précisément quel est le compte de destination (Cd). En même temps, l’association CPTE_EXPEDITION fait double emploi, c’est-à-dire qu’il y a une redondance à assurer, (C) = (Ce), ce qui n’est pas sain. Dans le cas général, peut-on dire que via ASSO_24 (ou ASSO_25 et AVOIR_5), le magasin (M) qui détient le stock (S) appartient au compte (C) tel que (C) = (Ce) ? Si oui, l’association CPTE_EXPEDITION peut disparaître.
    Oui c'est toujours le cas : le compte qui détiens le stock expédie vers un autre compte ça ne change pas.

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir mrfof,

    Citation Envoyé par mrfof Voir le message
    Oui c'est toujours le cas : le compte qui détiens le stock expédie vers un autre compte ça ne change pas.
    Donc l’association CPTE_EXPEDITION peut disparaître, on sait l'inférer. Au stade SQL il faudra quand même développer un trigger pour s’assurer (via ASSO_24 (ou ASSO_25 et AVOIR_5) et POSSEDER) que tous les stocks d’un chargement font référence à un seul compte d’expédition.

    Peut-on extrapoler à l’association CPTE_EXPEDITION définie entre les entités-types ENREGISTREMENT et COMPTE, c’est-à-dire inférer cette association à partir de STOCK là aussi ?
    (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.

  9. #9
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut
    Bonsoir fsmrel

    Citation Envoyé par fsmrel Voir le message
    Peut-on extrapoler à l’association CPTE_EXPEDITION définie entre les entités-types ENREGISTREMENT et COMPTE, c’est-à-dire inférer cette association à partir de STOCK là aussi ?
    J'ai pas compris

  10. #10
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir mrfof,

    Citation Envoyé par mrfof Voir le message
    J’ai pas compris
    Ma question revient à ceci : si dans le MCD on supprime l’association CPTE_EXPEDITION reliant ENREGISTREMENT et COMPTE, sait-on inférer, déterminer cette association grâce à STOCK, sur la base des liens suivants :

    un stock détermine une ligne d’enregistrement, laquelle détermine un enregistrement

    sachant par ailleurs que ce stock est sensé déterminer le bon compte d’expédition via LIGNE_CHARGEMENT, CHARGEMENT et COMPTE.
    (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.

  11. #11
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir mrfof,

    Est-ce plus clair ?

    Du point de vue de la modélisation, ces redondances potentielles ne sont quand même pas inintéressantes à étudier.
    (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.

  12. #12
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mali

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2013
    Messages : 33
    Points : 52
    Points
    52
    Par défaut
    Bonsoir fsmrel

    Désolé pour le retard.

    Citation Envoyé par fsmrel Voir le message
    Bonsoir mrfof,

    Ma question revient à ceci : si dans le MCD on supprime l’association CPTE_EXPEDITION reliant ENREGISTREMENT et COMPTE, sait-on inférer, déterminer cette association grâce à STOCK, sur la base des liens suivants :

    un stock détermine une ligne d’enregistrement, laquelle détermine un enregistrement

    sachant par ailleurs que ce stock est sensé déterminer le bon compte d’expédition via LIGNE_CHARGEMENT, CHARGEMENT et COMPTE.
    C'est bien compris maintenant.

    Merci beaucoup pour les pistes.

  13. #13
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir mrfof,

    J’ai réfléchi à la spécialisation de l’entité-type STOCK, en STOCK_EN_BLOC (articles dans des blocs) et STOCK_HORS_BLOC (articles non présents dans des blocs). Du point de vue conceptuel, c’est très bien. Mais quand on descend au niveau SQL, on a envie d’alléger le code impliqué par cette spécialisation.
    De fait, on devra implanter la contrainte d’exclusion et de totalité (XT) entre les deux entités-types spécialisées. Dans le cas de la norme SQL, on peut facilement mettre en oeuvre la contrainte d’exclusion au moyen de l’instruction CREATE ASSERTION, par exemple :

    Pour la contrainte d’exclusion :

    CREATE ASSERTION CX1 CHECK
        (NOT EXISTS
            (SELECT idSB
             FROM   STOCK_EN_BLOC
            INTERSECT
             SELECT idSHB 
             FROM   STOCK_HORS_BLOC 
             )AS x
        ) ;
    
    Pour mémoire, en relationnel pur (Tutorial D) :

    CONSTRAINT CX1 
        IS_EMPTY (STOCK_EN_BLOC {idSB} INTERSECT STOCK_HORS_BLOC{idSHB}) ; 
    Le problème est que les SGBD commercialisés (DB2, SQL Server, PostgreSQL, MySQL, etc.) ne fournissent pas l’instruction CREATE ASSERTION , en conséquence de quoi on doit se résoudre à programmer des triggers (un pour chacune des 2 tables en cause, STOCK_EN_BLOC et STOCK_HORS_BLOC) et ça commence à devenir lourd et franchement pénible.

    Et je ne vous parle pas de la programmation de la contrainte de totalité !

    Bon. La situation actuelle est la suivante :
    Nom : mrfof_transport(XT)image1.png
Affichages : 3644
Taille : 10,4 Ko
    image 1


    Essayons d’alléger. On peut par exemple chercher à éliminer la spécialisation STOCK_HORS_BLOC dans la mesure où, au stade SQL, un stock hors bloc est un stock qui appartient à la table STOCK, mais pas à la table STOCK_EN_BLOC. Allons-y pour éliminer STOCK_HORS_BLOC :

    Nom : mrfof_transport(XT)image2.png
Affichages : 3557
Taille : 10,3 Ko
    image 2


    Le problème maintenant est qu’on ne sait plus à quel magasin appartient un stock hors bloc.
    Dans ces conditions, associons les entités-types MAGASIN et STOCK (on retrouve l’association avoir_3 de votre tout 1er MCD, renommée ici en MAG_STOCK) :

    Nom : mrfof_transport(XT)image3.png
Affichages : 3770
Taille : 9,7 Ko
    image 3


    La contrainte XT peut être conservée, mais ça fait bizarre d’avoir une contrainte d’exclusion entre STOCK_EN_BLOC et rien... On va remplacer cette contrainte par une association, appelons-la ETRE_EN_BLOC . On conserve l’héritage de l’identifiant en utilisant l’identification relative ("1,1,(R)" au lieu de "1,1"). Pour mémoire, pour mettre en oeuvre l’identification relative avec Looping, quand on crée la patte connectant l’entité-type STOCK_EN_BLOC et l’association ETRE_EN_BLOC, on coche la case « Identifiant relatif ». Au résultat :

    Nom : mrfof_transport(XT)image4.png
Affichages : 3516
Taille : 10,4 Ko
    image 4


    Mais on remarquera que se pose un problème : en effet, via le chemin

    STOCK_EN_BLOC → ETRE_EN_BLOC → STOCK → MAG_STOCK → MAGASIN

    alors pour le stock en bloc S1 on peut atteindre le magasin M1, tandis que pour ce même stock S1, on peut atteindre le magasin M2 via le chemin

    STOCK_EN_BLOC → BLOC_STOCK → BLOC → MAG_BLOC → MAGASIN

    =>

    Contradiction !

    Pour résoudre ce problème, en Merise, donc avec Looping, on met en oeuvre une contrainte d’inclusion, traduisant ceci 

    « Le bloc dans lequel est présent un stock donné doit être un bloc du magasin auquel appartient le stock »

    Nom : mrfof_transport(XT)image5.png
Affichages : 3838
Taille : 13,0 Ko
    image 5
     


    Dans cette contrainte (I), MAGASIN joue le rôle de « pivot », MAG_STOCK celui de « cible » et BLOC_STOCK celui de « portée ». Reportez-vous à ce sujet à l’ouvrage remarquable de D. Nanci (RIP) et B Espinasse Ingénierie des systèmes d'information : Merise deuxième génération (4e édition, 2001), c’est l’ouvrage de référence. Le chapitre concerné est le chapitre 7 (« Modélisation conceptuelle des données »), à la page 124.

    Côté MCD, c’est OK. Problème : les AGL (dont Looping à ce jour) ne traduisent pas cette contrainte au niveau SQL... Au développeur de se débrouiller, donc triggers en vue, c’est-à-dire le cauchemar.

    Examinons le code SQL produit par Looping :

    CREATE TABLE BLOC
    (
       idMag INT,
       IdBloc INT,
       nomBloc VARCHAR(48) NOT NULL,
       CONSTRAINT BLOC_PK PRIMARY KEY(idMag, IdBloc),
       CONSTRAINT BLOC_MAGASIN_FK FOREIGN KEY(idMag) 
           REFERENCES MAGASIN(idMag)
    );
    
    CREATE TABLE STOCK
    (
       idStock INT,
       idMag INT NOT NULL,
       CONSTRAINT STOCK_PK PRIMARY KEY(idStock),
       CONSTRAINT STOCK_MAGASIN_FK FOREIGN KEY(idMag) 
           REFERENCES MAGASIN(idMag)
    ) ; 
    
    CREATE TABLE STOCK_EN_BLOC
    (
       idStock INT,
       IdBloc INT NOT NULL,
       CONSTRAINT STOCK_EN_BLOC_PK PRIMARY KEY(idStock),
       CONSTRAINT STOCK_EN_BLOC_STOCK_FK FOREIGN KEY(idStock) 
           REFERENCES STOCK(idStock),
       CONSTRAINT STOCK_EN_BLOC_BLOC_FK FOREIGN KEY(IdBloc) 
           REFERENCES BLOC(IdBloc)
    );
    Pour éviter les triggers et le cauchemar :

    A la réflexion, BLOC n’est jamais qu’une propriété multivaluée de MAGASIN, on dit que c’est une entité-type « faible » car un bloc sans magasin ça n’a aucun sens. Dans ces conditions, dans le MCD on va utiliser l’identification relative pour l’association MAG_BLOC :

    [MAGASIN]---0,n---(MAG_BLOC)---1,1(R)---[BLOC]

    Impact au stade SQL :

    CREATE TABLE BLOC
    (
       idMag     INT,
       IdBloc    INT,
       nomBloc   VARCHAR(48)   NOT NULL,
       CONSTRAINT BLOC_PK PRIMARY KEY(idMag, IdBloc),
       CONSTRAINT BLOC_MAGASIN_FK FOREIGN KEY(idMag) 
           REFERENCES MAGASIN(idMag)
    );
    
    CREATE TABLE STOCK
    (
       idStock     INT,
       idMag       INT     NOT NULL,
       CONSTRAINT STOCK_PK PRIMARY KEY(idStock),
       CONSTRAINT STOCK_MAGASIN_FK FOREIGN KEY(idMag) 
           REFERENCES MAGASIN(idMag)
    ) ; 
    
    CREATE TABLE STOCK_EN_BLOC
    (
       idStock     INT,
       idMag       INT      NOT NULL,
       IdBloc      INT      NOT NULL,
       CONSTRAINT STOCK_EN_BLOC_PK PRIMARY KEY(idStock),
       CONSTRAINT STOCK_EN_BLOC_STOCK_FK FOREIGN KEY(idStock) 
           REFERENCES STOCK(idStock),
       CONSTRAINT STOCK_EN_BLOC_BLOC_FK FOREIGN KEY(idMag, IdBloc) 
           REFERENCES BLOC(idMag, IdBloc)
    );
    Cette fois-ci, on sait à quel magasin fait référence un stock en bloc, mais le respect de la contrainte d’inclusion nécessite toujours la mise en oeuvre d’un trigger.

    Aux grands maux, les grands remèdes ! on va dire qu’à son tour, STOCK n’est jamais qu’une propriété multivaluée de MAGASIN, donc une entité-type faible. Dans ces conditions, dans le MCD on va utiliser l’identification relative pour l’association MAG_STOCK :

    [MAGASIN]---0,n---(MAG_STOCK)---1,1(R)---[STOCK]

    Le MCD devient :
    Nom : mrfof_transport(XT)image6.png
Affichages : 4201
Taille : 13,7 Ko
    image 6
     


    Conséquences sur le code SQL :

    CREATE TABLE BLOC
    (
       idMag     INT,
       IdBloc    INT,
       nomBloc VARCHAR(48) NOT NULL,
       CONSTRAINT BLOC_PK PRIMARY KEY(idMag, IdBloc),
       CONSTRAINT BLOC_MAGASIN_FK FOREIGN KEY(idMag) 
           REFERENCES MAGASIN(idMag)
    );
    
    CREATE TABLE STOCK
    (
       idMag     INT,
       idStock   INT,
       CONSTRAINT STOCK_PK PRIMARY KEY(idMag, idStock),
       CONSTRAINT STOCK_MAGASIN_FK FOREIGN KEY(idMag) REFERENCES MAGASIN(idMag)
    ) ; 
    
    CREATE TABLE STOCK_EN_BLOC
    (
       idMag     INT,
       idStock   INT,
       idMag_1   INT      NOT NULL,
       IdBloc    INT      NOT NULL,
       CONSTRAINT STOCK_EN_BLOC_PK PRIMARY KEY(idMag, idStock),
       CONSTRAINT STOCK_EN_BLOC_STOCK_FK FOREIGN KEY(idMag, idStock) 
           REFERENCES STOCK(idMag, idStock),
       CONSTRAINT STOCK_EN_BLOC_BLOC_FK FOREIGN KEY(idMag_1, IdBloc) 
           REFERENCES BLOC(idMag, IdBloc)
    );
    La table STOCK_EN_BLOC contient cette fois-ci deux colonnes pour le magasin :

    (1) colonne idMag héritée du chemin

    STOCK_EN_BLOC → ETRE_EN_BLOC → STOCK → MAG_STOCK → MAGASIN

    (2^) colonne idMag_1 héritée du chemin

    STOCK_EN_BLOC → BLOC_STOCK → BLOC → MAG_BLOC → MAGASIN

    Pour empêcher la contradiction évoquée précédemment et mettre en oeuvre la contrainte d’inclusion, dans STOCK_EN_BLOC il suffit de forcer idMag_1 à prendre les mêmes valeurs que idMag, ce qui revient tout simplement à ne faire qu’une seule colonne de ces deux colonnes, autrement dit supprimer idMag_1 et la remplacer par idMag dans la contrainte STOCK_EN_BLOC_BLOC_FK :

    CREATE TABLE STOCK_EN_BLOC
    (
       idMag     INT,
       idStock   INT,
       IdBloc    INT      NOT NULL,
       CONSTRAINT STOCK_EN_BLOC_PK PRIMARY KEY(idMag, idStock),
       CONSTRAINT STOCK_EN_BLOC_STOCK_FK FOREIGN KEY(idMag, idStock) 
           REFERENCES STOCK(idMag, idStock),
       CONSTRAINT STOCK_EN_BLOC_BLOC_FK FOREIGN KEY(idMag, IdBloc) 
           REFERENCES BLOC(idMag, IdBloc)
    );
    Cette fois-ci on est OK, pas besoin de triggers !

    Tant qu’à faire, histoire de se simplifier la vie dans les requêtes à venir (par exemple déterminer le compte d’expédition pour un compte de destination donné), on va pousser jusqu’à identifier MAGASIN relativement à COMPTE.


    Nom : mrfof_transport(XT)image7.png
Affichages : 3673
Taille : 19,2 Ko
    image 7
     


    code SQL (toujours avec absorption de idMag_1 par idMag) :

    CREATE TABLE COMPTE
    (
       idCpte     INT,
       nomCpte    VARCHAR(48) NOT NULL,
       CONSTRAINT COMPTE_PK PRIMARY KEY(idCpte),
       CONSTRAINT COMPTE_AK UNIQUE(nomCpte)
    );
    
    CREATE TABLE MAGASIN
    (
       idCpte     INT,
       idMag      INT,
       nomMag     VARCHAR(48)    NOT NULL,
       CONSTRAINT MAGASIN_PK PRIMARY KEY(idCpte, idMag),
       CONSTRAINT MAGASIN_AK UNIQUE(nomMag),
       CONSTRAINT MAGASIN_COMPTE_FK FOREIGN KEY(idCpte) 
           REFERENCES COMPTE(idCpte)
    );
    
    CREATE TABLE BLOC
    (
       idCpte     INT,
       idMag      INT,
       IdBloc     INT,
       nomBloc    VARCHAR(48)   NOT NULL,
       CONSTRAINT BLOC_PK PRIMARY KEY(idCpte, idMag, IdBloc),
       CONSTRAINT BLOC_MAGASIN_FK FOREIGN KEY(idCpte, idMag) 
           REFERENCES MAGASIN(idCpte, idMag)
    );
    
    CREATE TABLE STOCK 
    (
       idCpte     INT,
       idMag      INT,
       idStock    INT,
       CONSTRAINT STOCK_PK PRIMARY KEY(idCpte, idMag, idStock),
       CONSTRAINT STOCK_MAGASIN_FK FOREIGN KEY(idCpte, idMag) 
           REFERENCES MAGASIN(idCpte, idMag)
    );
    
    CREATE TABLE STOCK_EN_BLOC
    (
       idCpte     INT     NOT NULL,
       idMag      INT     NOT NULL,
       IdBloc     INT     NOT NULL,
       idStock    INT,
       CONSTRAINT STOCK_EN_BLOC_PK PRIMARY KEY(idCpte, idMag, idStock),
       CONSTRAINT STOCK_EN_BLOC_STOCK_FK FOREIGN KEY(idCpte, idMag, idStock) 
           REFERENCES STOCK(idCpte, idMag, idStock),
       CONSTRAINT STOCK_EN_BLOC_BLOC_FK FOREIGN KEY(idCpte, idMag, IdBloc) 
           REFERENCES BLOC(idCpte, idMag, IdBloc)
    );

    A suivre...
    (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.

  14. #14
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Suite !

    Quelques requêtes (à vérifier)

    Les stocks en bloc du magasin 'magasin 1 du cpte C1'

    SELECT nomMag, z.*
    FROM   COMPTE as x  
      JOIN MAGASIN as y
             ON x.idCpte = y.idCpte
      JOIN STOCK_EN_BLOC as z
             ON y.idCpte = z.idCpte AND y.idMag = z.idMag
    WHERE x.nomCpte = 'C1' AND y.nomMag = 'magasin 1 du cpte C1' 
    ;
    
    -- Les stocks pas en bloc du magasin 'magasin 1 du cpte C1' :

    SELECT '' as 'stocks non en bloc d''un magasin', nomMag, z.*
    FROM   COMPTE as x  
        JOIN MAGASIN as y
             ON x.idCpte = y.idCpte
        JOIN STOCK as z
             ON y.idCpte = z.idCpte AND y.idMag = z.idMag
     WHERE x.nomCpte = 'C1' AND y.nomMag = 'magasin 1 du cpte C1' 
        AND NOT EXISTS (SELECT *
                        FROM   STOCK_EN_BLOC as t
                        WHERE  z.idCpte = t.idCpte 
                           AND z.idMag = t.idMag
                           AND z.idStock = t.idStock)
    ;
    Je pense que cette requête remplace avantageusement la mise en oeuvre de la table STOCK_HORS_BLOC, la programmation de triggers, etc.


    En passant, pas de problème pour transférer un stock d’un magasin à un autre (cf. votre 1er message). Exemple :

    UPDATE STOCK 
        SET idMag = 4 
        WHERE idCpte = 1 AND idMag = 1 AND idStock = 1 ;
    A suivre (les chargements, c'est en cours).
    (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.

  15. #15
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Suite donc,

    Les chargements

    Dans le MCD ci-dessous, il n’y a qu’une seule association entre les entités-types COMPTE et CHARGEMENT, à savoir CPTE_DESTINATION :
    Nom : mrfof_transport(XT)image8.png
Affichages : 4296
Taille : 25,1 Ko
    image 8
     


    En effet, chaque ligne de chargement d’un chargement donné fait référence à un stock, lequel, via le magasin où il est localisé, détermine le compte d’expédition.

    code SQL correspondant :

    CREATE TABLE CHARGEMENT
    (
       idCpteDest     INT,
       idCh           INT,
       chargementDate DATE   NOT NULL,
       CONSTRAINT CHARGEMENT_PK PRIMARY KEY(idCpteDest, idCh),
       CONSTRAINT CHARGEMENT_COMPTE_FK FOREIGN KEY(idCpteDest) 
           REFERENCES COMPTE(idCpte)
    );
    
    CREATE TABLE LIGNE_CHARGEMENT
    (
       idCpteDest   INT,
       idCh         INT,
       idLch        INT,
       idCpteExp    INT     NOT NULL,
       idMag        INT     NOT NULL,
       idStock      INT     NOT NULL,
       CONSTRAINT LIGNE_CHARGEMENT_PK PRIMARY KEY(idCpteDest, idCh, idLch),
       CONSTRAINT LIGNE_CHARGEMENT_CHARGEMENT_FK FOREIGN KEY(idCpteDest, idCh) 
           REFERENCES CHARGEMENT(idCpteDest, idCh),
       CONSTRAINT LIGNE_CHARGEMENT_STOCK_FK FOREIGN KEY(idCpteExp, idMag, idStock) 
           REFERENCES STOCK(idCpte, idMag, idStock)
           ON UPDATE CASCADE,
       CONSTRAINT LIGNE_CHARGEMENT_CHK01 CHECK (idCpteDest <> idCpteExp)
    );
    Remarques :

    (1) Pour des raisons de lisibilité, j’ai renommé les colonnes concernant les comptes d’expédition et de destination respectivement en idCpteExp et idCpteDest.

    (2) J’ai supposé qu’un compte ne pouvait pas être à la fois expéditeur et destinataire, d’où mise en oeuvre de la contrainte LIGNE_CHARGEMENT_CHK01 (table LIGNE_CHARGEMENT). A vous de voir si cela répond effectivement à une règle de gestion..


    Pour connaître le compte d’expédition concernant un chargement à destination du compte C2, on peut se servir de la requête suivante :

    SELECT DISTINCT x.nomCpte as CpteExp
    FROM   COMPTE as x
      JOIN STOCK as y ON x.idCpte = y.idCpte 
      JOIN LIGNE_CHARGEMENT as z ON y.idCpte = z.idCpteExp  
      JOIN COMPTE as t ON z.idCpteDest = t.idCpte
    where t.nomCpte = 'C2'
    ;
    Vous noterez que les tables CHARGEMENT et MAGASIN ne font pas partie de la requête, sinon on alourdirait inutilement celle-ci (jointures supplémentaires).
    (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.

  16. #16
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir mrfof,

    A propos des lignes d’enregistrement :

    Selon le MCD, une ligne d’enregistrement fait référence à un article, d’accord.

    Toujours selon le MCD, une ligne d’enregistrement peut faire référence à plusieurs stocks et un stock ne concerne qu’une ligne d’enregistrement. Quelque chose m’échappe.  C’est bien la règle de gestion voulue ? Tout cela mérite d’être détaillé...

    Quelle relation y-a-t-il entre les articles et les stocks (quelles règles de gestion ?)
    (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.

Discussions similaires

  1. Correction MCD gestion scolaire
    Par mrfof dans le forum Schéma
    Réponses: 3
    Dernier message: 24/12/2019, 15h48
  2. [MCD] Gestion des habilitations de personnels
    Par sozie9372 dans le forum Schéma
    Réponses: 3
    Dernier message: 19/09/2006, 14h57
  3. [MCD] Gestion d'historique des mails envoyés, recus
    Par vodasan dans le forum Schéma
    Réponses: 6
    Dernier message: 15/09/2006, 17h54
  4. [MCD] Gestion d'acces a des applications
    Par Tibler dans le forum Schéma
    Réponses: 12
    Dernier message: 25/04/2006, 18h10
  5. [MCD] [MCD] Gestion des dates
    Par brionne dans le forum Schéma
    Réponses: 3
    Dernier message: 30/05/2003, 13h01

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