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 :

Aide sur un diagramme entité-relation / relation ternaire


Sujet :

Schéma

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Points : 76
    Points
    76
    Par défaut Aide sur un diagramme entité-relation / relation ternaire
    EDIT 11/12/2020

    J'ai modifié le schéma (voir le lien) car en fait j'avais 2 tables associatives entre Clients et Commandes.
    Donc je pense pouvoir simplifier avec une relation ternaire Commandes_Utilisateurs_Commentaires.
    Par ailleurs, les utilisateurs ne pouvant poster qu'un seul commentaire par commande et par utilisateur les commentaires sont associées à la tables associative par une relation 1 à 1.

    Ci dessous un exemple de scénario :
    3 utilisateurs
    3 commandes
    6 commentaires





    ____________________________________________________________________________________________________________

    Bonjour

    Je travaille sur un projet pour améliorer mes compétences en conception de bases de données / diagramme entité-relation.
    Le projet consiste à développer une API permettant à un(e) serveur(euse) de prendre des commandes dans un seul restaurant.

    J'ai identifié 5 relations:
    - Tables
    - Clients
    - Commandes
    - Menus
    - Commentaires (pour stocker les commentaires des clients une fois qu'ils ont payé)

    Le restaurant a plusieurs tables (avec un nombre défini de couverts par table). Et le propriétaire peut ajouter ou supprimer une table.

    Une table peut avoir plusieurs commandes (successives) mais une commande ne peut être liée qu'à une seule table.

    Une Commande peut contenir plusieurs Menus et un Menu peut être associé à plusieurs Commandes (relation associative: Commandes_Menus)

    Un Client peut effectuer plusieurs Commandes et une Commande peut être associée à plusieurs Clients (relation associative: Clients_Ordres); Le nombre de clients pour une commande donnée ne doit pas être supérieur au nombre de couverts de la Table associée à la Commande

    Un Client peut publier plusieurs commentaires, mais un commentaire ne peut être lié qu'à un seul client; Un client peut publier plusieurs commentaires, mais un commentaire ne peut être lié qu'à une seule commande; Un client ne peut publier des commentaires que sur l'une de ses commandes

    Voici mon diagramme ER: https://dbdiagram.io/d/5fd0815c9a6c525a03ba5f6f

    Je ne suis pas sûr de la relation ternaire entre Clients / Commandes / Commentaires.
    Je ne sais pas trop comment matérialiser les contraintes supplémentaires sur le diagramme ER.

    D'avance merci pour votre aide
    Images attachées Images attachées  

  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 002
    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 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonjour OZ1977,


    Je découvre bien tard votre message, mais il n’est pas situé au bon endroit : le forum schéma eut été préférable.

    Votre diagramme est illisible en ce qui concerne les associations entre entités-types, il serait bon de le reprendre avec l’excellent Looping, gracieusement proposé par le professeur Patrick Bergougnoux.


    Citation Envoyé par OZ1977 Voir le message
    Un Client peut effectuer plusieurs Commandes et une Commande peut être associée à plusieurs Clients.
    Je suppose que les clients en question seront réunis autour de la table référencée par une même commande.


    Citation Envoyé par OZ1977 Voir le message
    je pense pouvoir simplifier avec une relation ternaire Commandes_Utilisateurs_Commentaires.
    Par ailleurs, les utilisateurs ne pouvant poster qu'un seul commentaire par commande et par utilisateur les commentaires sont associées à la tables associative par une relation 1 à 1.
    En fait, cette cardinalité 1,1 n’empêche pas que l’on puisse associer un commentaire donné à un client cl1 et à une commande cd1 qui n’est pas associée à cl1.


    Exemple plus conforme avec Looping :

    Nom : OZ1977(loo).png
Affichages : 146
Taille : 26,4 Ko

     
    A ma demande, Looping a transformé l’association CLI_COM en entité-type. L’identifiant de celle-ci est {clientId, CdeId}, en notant que la cardinalité 1,1(R) portée par la patte connectant l’entité-type CLI_COM et l’association CLI_COM_CLI est à interpréter ainsi : une occurrence de CLI_COM fait référence à un et un seul client et CLI_COM hérite de l’identifiant de CLIENT (principe de identification relative).

    Le principe de l’identification relative vaut pour l’association de CLI_COM avec COMMANDE, et pour l’association de CLI_COM avec AVIS.

    La patte connectant CLI_COM et AVIS_CLI_COM est 0,1 dans la mesure où un client ne pourrait fournir qu’un seul commentaire par commande. A noter qu’avec ce MCD, un client ne peut donner d’avis que sur les repas auxquels il a participé.


    Code SQL produit par Looping :

    CREATE TABLE CLIENT
    (
       clientId INT,
       clientNom VARCHAR(32) NOT NULL,
       CONSTRAINT CLIENT_PK PRIMARY KEY(clientId),
       CONSTRAINT CLIENT_AK UNIQUE(clientNom)
    );
    
    CREATE TABLE TABLEE
    (
       tableId INT,
       tableNumero CHAR(2) NOT NULL,
       nbCouverts TINYINT NOT NULL,
       CONSTRAINT TABLEE_PK PRIMARY KEY(tableId),
       CONSTRAINT TABLEE_AK UNIQUE(tableNumero)
    );
    
    CREATE TABLE COMMANDE
    (
       cdeId INT,
       cdeNumero CHAR(8) NOT NULL,
       cdeDate DATE NOT NULL,
       cdeReglee BIT NOT NULL,
       tableId INT NOT NULL,
       CONSTRAINT COMMANDE_PK PRIMARY KEY(cdeId),
       CONSTRAINT COMMANDE_AK UNIQUE(cdeNumero),
       CONSTRAINT COMMANDE_TABLEE_FK FOREIGN KEY(tableId) 
           REFERENCES TABLEE(tableId)
    );
    
    CREATE TABLE CLI_COM
    (
       clientId INT,
       cdeId INT,
       CONSTRAINT CLI_COM_PK PRIMARY KEY(clientId, cdeId),
       CONSTRAINT CLI_COM_CLIENT_FK FOREIGN KEY(clientId) 
           REFERENCES CLIENT(clientId),
       CONSTRAINT CLI_COM_COMMANDE_FK FOREIGN KEY(cdeId) 
           REFERENCES COMMANDE(cdeId)
    );
    
    CREATE TABLE AVIS
    (
       clientId INT,
       cdeId INT,
       commentaire VARCHAR(96) NOT NULL,
       CONSTRAINT AVIS_PK PRIMARY KEY(clientId, cdeId),
       CONSTRAINT AVIS_CLI_COM_FK FOREIGN KEY(clientId, cdeId) 
           REFERENCES CLI_COM(clientId, cdeId)
    );
    


    Quel est votre SGBD ?

    S’il faut s’assurer que les commentaires des clients ne sont possibles qu’une une fois qu'ils ont payé, alors cela ne sera possible que par l’entremise d’un trigger (tous SGBD) ou d’une fonction (ça dépend du SGBD). Même chose si le nombre de clients pour une commande donnée ne doit pas être supérieur au nombre de couverts de la table associée à la commande, etc.

    Un jeu d’essai :

    INSERT INTO CLIENT (clientId, clientNom)
    VALUES
        (1, 'Fernand Naudin')
      , (2, 'Maître Folace')
      , (3, 'Raoul Volfoni')
      , (4, 'Paul Volfoni')
      , (5, 'Jean')
      , (6, 'Antoine Delafoy')
      , (7, 'Patricia')
      , (8, 'Madame Mado')
    ;
    SELECT * FROM CLIENT ;
    
    =>

    clientId    clientNom
    
    1           Fernand Naudin
    2           Maître Folace
    3           Raoul Volfoni
    4           Paul Volfoni
    5           Jean
    6           Antoine Delafoy
    7           Patricia
    8           Madame Mado
    

    INSERT INTO TABLEE (tableId, tableNumero, nbCouverts)
    VALUES
        (1, 'ta', 3)
      , (2, 'tb', 3)
      , (3, 'tc', 4)
    ;
    SELECT * FROM TABLEE ; 
    =>

    tableId     tableNumero   nbCouverts
    
    1           ta            3
    2           tb            3
    3           tc            4

    INSERT INTO COMMANDE (cdeId, cdeNumero, tableId, cdeDate, cdeReglee)
    VALUES
        (1, 'c0247', 2, '2020-12-05', 0)
      , (2, 'c0364', 2, '2020-12-06', 0)
      , (3, 'c1234', 3, '2020-12-12', 0)
    ;
    SELECT * FROM COMMANDE ;
    
    =>

    cdeId       cdeNumero tableId     cdeDate        cdeReglee
    
    1           c0247     2           2020-12-05     0
    2           c0364     2           2020-12-06     0
    3           c1234     3           2020-12-12     0
    

    INSERT INTO CLI_COM (clientId, cdeId)
    VALUES
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Fernand Naudin')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c0247'))
    ,
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Maître Folace')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c0247'))
    ,
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Madame Mado')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c0247'))
    ;
    
    INSERT INTO CLI_COM (clientId, cdeId)
    VALUES
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Fernand Naudin')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c1234'))
    ,
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Maître Folace')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c1234'))
    ,
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Madame Mado')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c1234'))
    ,
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Raoul Volfoni')
      , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c1234'))
    ;
    
    INSERT INTO CLI_COM (clientId, cdeId)
    VALUES
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Fernand Naudin')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c0364'))
    ,
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Maître Folace')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c0364'))
    ,
        ((SELECT clientId FROM CLIENT WHERE clientNom = 'Madame Mado')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c0364'))
    ;
    
    SELECT clientNom, cdeNumero 
      FROM CLI_COM as x
      JOIN CLIENT as y ON x.clientId = y.clientId 
      JOIN COMMANDE as z ON x.cdeId = z.cdeId
      JOIN CLI_COM as t ON t.clientId = x.clientId 
                       AND t.cdeId = z.cdeId 
    ORDER BY cdeNumero, clientNom 
    ;

    =>

    clientNom                        cdeNumero
    
    Fernand Naudin                   c0247   
    Madame Mado                      c0247   
    Maître Folace                    c0247   
    Fernand Naudin                   c0364   
    Madame Mado                      c0364   
    Maître Folace                    c0364   
    Fernand Naudin                   c1234   
    Madame Mado                      c1234   
    Maître Folace                    c1234   
    Raoul Volfoni                    c1234   
    

    INSERT INTO AVIS (clientId, cdeId, commentaire)
    VALUES
    (
         (SELECT clientId FROM CLIENT WHERE clientNom = 'Fernand Naudin')
       , (SELECT cdeId FROM COMMANDE WHERE cdeNumero = 'c0364')
       , 'Miam, miam !'
    )
    ;
    SELECT clientNom, cdeNumero, commentaire 
    FROM   AVIS as a
      JOIN CLI_COM as x ON a.clientId = x.clientId
                       AND a.cdeId = x.cdeId
      JOIN CLIENT as y ON x.clientId = y.clientId 
      JOIN COMMANDE as z ON x.cdeId = z.cdeId
      JOIN CLI_COM as t ON t.clientId = x.clientId 
                       AND t.cdeId = z.cdeId 
    ORDER BY cdeNumero, clientNom 
    ; 
    =>

    clientNom           cdeNumero    commentaire
    
    Fernand Naudin      c0364        Miam, miam !
    
    (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 émérite
    Avatar de Paprick
    Homme Profil pro
    Professeur des Universités
    Inscrit en
    Juin 2019
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Professeur des Universités
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2019
    Messages : 678
    Points : 2 716
    Points
    2 716
    Par défaut
    Bonjour,

    Il est vrai que votre modèle est difficilement lisible.
    En fait, il s'agit d'un MLD (avec des cardinalités qui ont des allures de diagramme de classes UML), et non d'un MCD et, même si le fait d'associer visuellement les clés étrangères aux clés primaires peut parfois avoir quelques vertus, cela rend difficile une bonne compréhension du SI.
    Prenez donc bonne note des suggestions de fsmrel et concentrez-vous sur le niveau conceptuel : le MLD et le code SQL qui en découle se déduiront ensuite automatiquement.

    Bonne continuation !
    Patrick Bergougnoux - Professeur des Universités au Département Informatique de l'IUT de Toulouse III
    La simplicité est la sophistication suprême (Léonard de Vinci)
    LIVRE : Modélisation Conceptuelle de Données - Une Démarche Pragmatique
    Looping - Logiciel de modélisation gratuit et libre d'utilisation

Discussions similaires

  1. Diagramme Entité/Relation aide
    Par Aygo-69 dans le forum Schéma
    Réponses: 3
    Dernier message: 30/10/2019, 19h54
  2. Diagramme Entité-relation Invitation
    Par shimomura22 dans le forum Autres Diagrammes
    Réponses: 0
    Dernier message: 03/12/2015, 22h26
  3. Outil de modélisation - Diagramme entité relation
    Par Invité dans le forum Outils
    Réponses: 16
    Dernier message: 28/08/2012, 15h02
  4. aide sur un diagramme de classe UML
    Par pascal91 dans le forum Diagrammes de Classes
    Réponses: 7
    Dernier message: 29/12/2008, 19h19
  5. [Séquence] un aide sur le diagramme de sequence
    Par Mounr dans le forum Autres Diagrammes
    Réponses: 2
    Dernier message: 19/06/2007, 13h45

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