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 :

Table intermédiaire et clé primaire


Sujet :

Schéma

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Table intermédiaire et clé primaire
    Bonjour,

    Je souhaite créer un site e-commerce (une librairie) mais je suis confronté à un problème dont je ne trouve pas la solution.

    Voici le schema de la bdd en image :
    Nom : tables_schema.png
Affichages : 21948
Taille : 64,1 Ko

    J'ai créé une table intermédiaire "AUTEUR INTER" entre la table "LIVRE" et la table "AUTEUR" car un livre peut être écrit pas plusieurs auteurs ... néanmoins il est nécessaire que cette table ai une clé primaire (qui serait censé être la combinaison de l'id auteur et l'id livre ?) .

    Comment puis-je procéder pour attribué automatiquement cette clé primaire à chaque insertion dans la table ?

    Si vous avez d'autres suggestions concernant le schema de ma bdd, je suis preneuse

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 337
    Points : 39 723
    Points
    39 723
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    La table "AUTEUR_INTER" est une table associative, sa PK est donc composée de la concaténation des PK des types d'entité concourant à la relation, à savoir l'identifiant de l'auteur et l'identifiant du document

    Au moment de créer une occurrence de lien OUVRAGE <-> AUTEUR, vous récupérerez la valeur insérée dans la table "AUTEUR" puis de la table "LIVRE" par une fonction qui dépend du SGBD, par exemple :
    - SCOPE_IDENTITY() avec SQL-Server
    - LAST_INSERT_ID avec MYSQL
    - IDENTITY_VAL_LOCAL() avec DB2

    Ne gérez vous que des livres ? Ne proposez vous pas aussi d'autres supports tels que bandes dessinées, périodiques, CD, DVD...
    Si c'est le cas, il est préférable de parler de DOCUMENT plutôt que de LIVRE et de créer des sous-type par héritage pour chaque type de support particulier

    Et pourquoi ce nom "AUTEUR_INTER" l'utilisation d'un verbe est recommandée et "COMPOSER" ou "ECRIRE" semblent plus intuitifs non ?

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut à tous.

    Nous sommes bien d'accord que "id_auteur" et "id_livre" sont des identifiants de type technique, genre "auto incrémenté.
    Le couple (id_auteur, id_livre) est à la fois clef primaire de la table associative et clefs étrangères.

    Citation Envoyé par linoa57
    Comment puis-je procéder pour attribuer automatiquement cette clé primaire à chaque insertion dans la table ?
    Comme vos identifiants sont des clefs étrangères, au préalable, les valeurs doivent exister respectivement dans les tables "auteur" et "livre".
    Avant l'insertion, vous devez récupérer ces valeurs en faisant une recherche, peut-être sur le nom de l'auteur et sur le titre du livre.

    Il y a juste un point qui me dérange dans votre modélisation.
    La table "auteur-inter" ne sert à rien car un livre est toujours rattaché à un et un seul auteur.
    Et si plusieurs livres possèdent le même titre, ils ne sont pas tous écrits à la même date et possèdent le même nombre de pages.

    Je préfère une organisation hiérarchique, où l'auteur est la table mère et le livre, donc rattaché à l'auteur, est la table fille.
    Mais dans ce cas là, la clef primaire de votre table livre devrait être un identifiant "auto incrémenté" !
    Et il y aura qu'une clef étrangère de nom "id_auteur" qui va pointer sur la table "auteur".
    Pour identifier le livre, vous utiliserez cette clef primaire, et non un couple (id_auteur, id_livre).

    Je ferai aussi la même remarque que Escartefigue.
    Dans une librairie, on ne vend pas que des livres papiers.
    Il faudrait dans ce cas, envisager une autre modélisation afin de créer des tables par type de documents (dans le sens le plus général) que vous désirer fournir à vos clients.
    Et envisager de mettre en place une organisation de type héritage pour lier tous vos supports que vous vendez dans votre librairie.

    Je pense que vous feriez mieux de faire votre demande dans le forum consacré à la modélisation :
    --> https://www.developpez.net/forums/f6...sation/schema/

    @+

  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 112
    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 112
    Points : 31 586
    Points
    31 586
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par linoa57
    un livre peut être écrit pas plusieurs auteurs
    [...]
    il est nécessaire que cette table ait une clé primaire (qui serait censée être la combinaison de l'id auteur et l'id livre ?)
    La clé primaire de la table AUTEUR_LIVRE (ou AUTEUR_INTER) est effectivement composée des colonnes AuteurId et LivreId. Un logiciel comme MySQL Workbench nous permet de réaliser cela, de façon automatique :


    Les clés de couleur jaune symbolisent des clés primaires. Les clés de couleur rouge symbolisent des clés à la fois primaires et étrangères. Je rappelle à cette occasion qu’une clé étrangère (qualificatif au demeurant peu pertinent) est en fait une contrainte référentielle.

    En passant, quel est votre SGBD ?

    A défaut, avec SQL Server :

    CREATE TABLE AUTEUR
    (
            AuteurId        INT   IDENTITY      NOT NULL
          , AuteurNom       VARCHAR(48)         NOT NULL
        , CONSTRAINT AUTEUR_PK PRIMARY KEY (AuteurId)
        , CONSTRAINT AUTEUR_NOM_AK UNIQUE (AuteurNom) 
    )
    ;
    
    CREATE TABLE LIVRE
    (
            LivreId         INT   IDENTITY      NOT NULL
          , LivreTitre      VARCHAR(48)         NOT NULL
        , CONSTRAINT LIVRE_PK PRIMARY KEY (LivreId)
        , CONSTRAINT LIVRE_TITRE_AK UNIQUE (LivreTitre) 
    )
    ;
    
    CREATE TABLE AUTEUR_LIVRE
    (
            AuteurId        INT                 NOT NULL
          , LivreId         INT                 NOT NULL
        , CONSTRAINT AUTEUR_LIVRE_PK PRIMARY KEY (AuteurId, LivreId)
        , CONSTRAINT AUTEUR_LIVRE_AUTEUR_FK FOREIGN KEY (AuteurId)
              REFERENCES AUTEUR (AuteurId)
        , CONSTRAINT AUTEUR_LIVRE_LIVRE_FK FOREIGN KEY (LivreId)
              REFERENCES LIVRE (LivreId)
    )
    ;
    

    Quelques auteurs (du fait d’IDENTITY, SQL Server pond les valeurs des clés primaires) :

    INSERT INTO AUTEUR (AuteurNom) VALUES
        ('Hubert de la Pâte Feuilletée')
      , ('Maurice Champo')
      , ('Raoul Volfoni')
      , ('Alphonse Amédée Delafoy')
    
    

    Quelques livres :

    INSERT INTO LIVRE (LivreTitre) VALUES
        ('Moi, double scalp')
      , ('La dépanneuse est en panne')
      , ('J''éparpille, je ventile façon puzzle') 
      , ('Je jouais au hockey sur gazon')
    

    Quelques associations (on part de la règle selon laquelle deux auteurs ne peuvent pas avoir le même nom, de même que deux livres ne peuvent pas avoir le même titre, cf. les clé alternatives AUTEUR_NOM_AK et LIVRE_TITRE_AK) :

    INSERT INTO AUTEUR_LIVRE (AuteurId, LivreId)
        SELECT (SELECT AuteurId FROM AUTEUR WHERE AuteurNom = 'Hubert de la Pâte Feuilletée')
             , (SELECT LivreId FROM LIVRE WHERE LivreTitre = 'Moi, double scalp') 
    
    INSERT INTO AUTEUR_LIVRE (AuteurId, LivreId)
        SELECT (SELECT AuteurId FROM AUTEUR WHERE AuteurNom = 'Hubert de la Pâte Feuilletée')
             , (SELECT LivreId FROM LIVRE WHERE LivreTitre = 'La dépanneuse est en panne') 
    
    INSERT INTO AUTEUR_LIVRE (AuteurId, LivreId)
        SELECT (SELECT AuteurId FROM AUTEUR WHERE AuteurNom = 'Raoul Volfoni')
             , (SELECT LivreId FROM LIVRE WHERE LivreTitre = 'La dépanneuse est en panne') 
    
    INSERT INTO AUTEUR_LIVRE (AuteurId, LivreId)
        SELECT (SELECT AuteurId FROM AUTEUR WHERE AuteurNom = 'Raoul Volfoni')
             , (SELECT LivreId FROM LIVRE WHERE LivreTitre = 'J''éparpille, je ventile façon puzzle')
    
    INSERT INTO AUTEUR_LIVRE (AuteurId, LivreId)
        SELECT (SELECT AuteurId FROM AUTEUR WHERE AuteurNom = 'Alphonse Amédée Delafoy')
             , (SELECT LivreId FROM LIVRE WHERE LivreTitre = 'Je jouais au hockey sur gazon')  
    

    Au résultat (Raoul et Hubert sont co-auteurs de 'La dépanneuse est en panne') :

    AuteurId    LivreId
    --------    -------
    1           1
    1           2
    3           2
    3           3
    4           4
    

    Comme ça n’est pas très facile à décrypter, on peut déclarer une vue (table virtuelle) :

    CREATE VIEW AUTEUR_LIVRE_V (AuteurNom, LivreTitre)
    AS 
    SELECT AuteurNom, LivreTitre
    FROM   AUTEUR_LIVRE AS x 
      JOIN AUTEUR AS y ON x.AuteurId = y.AuteurId
      JOIN LIVRE AS z ON x.LivreId = z.LivreId
    ;
    

    Et avoir une vision décryptée du contenu de la table :
    SELECT * FROM AUTEUR_LIVRE_V
    
    =>

    AuteurNom                        LivreTitre
    ----------------------------     ------------------------------------
    Hubert de la Pâte Feuilletée     Moi, double scalp
    Hubert de la Pâte Feuilletée     La dépanneuse est en panne
    Raoul Volfoni                    La dépanneuse est en panne
    Raoul Volfoni                    J'éparpille, je ventile façon puzzle
    Alphonse Amédée Delafoy          Je jouais au hockey sur gazon
    

    Citation Envoyé par Artemus
    Je pense que vous feriez mieux de faire votre demande dans le forum consacré à la modélisation
    Ben... C’est justement là que linoa57 a posté...


    Citation Envoyé par Artemus
    La table "auteur-inter" ne sert à rien car un livre est toujours rattaché à un et un seul auteur.
    C’est ton point de vue, mais linoa57 en a un autre (plus réaliste...)


    Citation Envoyé par Artemus
    Je préfère une organisation hiérarchique
    Peut-être, car tous les goûts sont dans la nature, mais avec les bases de données relationnelles, on a quand même changé de siècle et de paradigme...

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 337
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 337
    Points : 39 723
    Points
    39 723
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Citation Envoyé par Artemus24 Voir le message
    La table "auteur-inter" ne sert à rien car un livre est toujours rattaché à un et un seul auteur.
    C’est ton point de vue, mais linoa57 en a un autre (plus réaliste...)
    Point de vue que je confirme, il se trouve que j'anime depuis de nombreuses années une bibliothèque dans mes heures de loisirs. Les ouvrages (pas seulement les livres) ayant plusieurs auteurs sont légion
    Citons par exemple - par analogie avec l'actualité récente - "Paris brule-t-il" de Dominique Lapierre et Larry Collins

    Notons également qu'il existe quelques ouvrages dont les auteurs ne sont pas connus, il faut dans ce cas prévoir une cardinalité mini de zéro

    Pour autoriser plus de cas fonctionnels, on peut modéliser une relation ternaire entre document (que je préfère à "livre" comme expliqué plus haut), intervenant et rôle
    Un document connait un à plusieurs intervenants, chaque intervenant exerce un à plusieurs rôles
    Ce rôle, pour les documents écrits peut être auteur, dessinateur, coloriste, rédacteur de préface
    Pour un CD on aura des rôles tels que interprète, compositeur, preneur de son...
    Pour un DVD on aura des rôles tels que acteur, metteur en scène...

    DOCUMENT 1,n --- intervenir --- 0,n --- INTERVENANT
    ........ROLE 0,n --------┘


    Citation Envoyé par Artemus24 Voir le message
    Je préfère une organisation hiérarchique, où l'auteur est la table mère et le livre, donc rattaché à l'auteur, est la table fille.
    Mais dans ce cas là, la clef primaire de votre table livre devrait être un identifiant "auto incrémenté" !
    Et il y aura qu'une clef étrangère de nom "id_auteur" qui va pointer sur la table "auteur".
    Pour identifier le livre, vous utiliserez cette clef primaire, et non un couple (id_auteur, id_livre).
    Il me semble que les SGBD hiérarchiques ne proposaient pas d'auto-incrément.
    Si dans cette remarque "hiérarchique" doit être compris comme "utilisation d'un héritage", alors c'est un non sens : auteur et livre n'ont rien en commun, le livre n'est aucunement un sous-type de l'auteur
    De plus, en cas d'héritage le sous-type hérite de l'identifiant du sur-type

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 133
    Points
    53 133
    Billets dans le blog
    6
    Par défaut
    Couple littéraires célèbres :
    Boileau Narcejac : https://fr.wikipedia.org/wiki/Boileau-Narcejac
    Pierre Souvestre et Marcel Alain (Fantomas)
    Dominique Lapierre et Larry Collins (déjà cité…) "Ô Jérusalem", "Le 5e cavalier", "Cette nuit la liberté" en sus de "Paris brûle t-il ?"...
    Quand ce ne sont pas des recueil comportant de nombreux auteurs.
    Exemple : Anthologie du fantastique T1 et T2, recueillis par Roger Caillois (Gallimard) comportant plus de 50 auteurs différents !
    http://www.gallimard.fr/Catalogue/GA...du-fantastique
    Autre exemple :
    https://www.amazon.fr/grande-antholo.../dp/2258036526

    Bouquin scientifiques :
    https://www.amazon.fr/Guide-SQL-Stan.../dp/0201964260

    Et concernant les miens, ils sont tous pluri auteurs !
    https://www.amazon.fr/SQL-Server-201...dp/2212135920/
    https://www.amazon.fr/SQL-édition-Sy...dp/2744076309/
    https://www.amazon.fr/Modélisation-b...dp/2212674872/


    Une autre solution est la suivante :
    1) prendre les deux attributs AuteurID et LivreID et une faire une contrainte d'unicité NOT NULL
    2) laisser ces deux attributs être des FOREIGN KEY
    3) rajouter une clef auto incrémentée propre à cette table d'association.

    A +

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 897
    Points : 53 133
    Points
    53 133
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Je préfère une organisation hiérarchique, où l'auteur est la table mère et le livre, donc rattaché à l'auteur, est la table fille.
    Mais dans ce cas là, la clef primaire de votre table livre devrait être un identifiant "auto incrémenté" !
    Et il y aura qu'une clef étrangère de nom "id_auteur" qui va pointer sur la table "auteur".
    Pour identifier le livre, vous utiliserez cette clef primaire, et non un couple (id_auteur, id_livre).
    Parfaitement idiot car il y a de nombreux ouvrages en plusieurs tomes…..

    Il faudrait alors considérer l'œuvre avant de considérer sa matérialisation qui est le livre !

    Exemple "le saigneur des agneaux" de JRR Tolkien (notez mes petites fautes dans le titre !!!!

    A +

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut à tous.

    Citation Envoyé par fsmrel
    Ben... C’est justement là que linoa57 a posté...
    Et non, avant d'être déplacé, ce sujet était dans le forum mysql.
    Je suis présent que dans les forums mysql & firebird et c'est tout.

    Citation Envoyé par fsmrel
    C’est ton point de vue, mais linoa57 en a un autre (plus réaliste...)
    Désolé, mais j'ai complètement oublié qu'un livre peut-être écrit par plusieurs auteurs.

    Citation Envoyé par Escartefigue
    Notons également qu'il existe quelques ouvrages dont les auteurs ne sont pas connus, il faut dans ce cas prévoir une cardinalité mini de zéro
    Il suffit de nommer cet auteur par ce nom générique : "anonyme".

    Citation Envoyé par Escartefigue
    Il me semble que les SGBD hiérarchiques ne proposaient pas d'auto-incrément.
    Je ne m'en souviens pas trop mais je crois que vous avez raison.

    Citation Envoyé par Escartefigue
    Si dans cette remarque "hiérarchique" doit être compris comme "utilisation d'un héritage", alors c'est un non sens
    Non, je parlais pas d'un héritage, mais d'une relation mère-fille à l'instar des parents et des enfants.

    Citation Envoyé par SQPRO
    Parfaitement idiot car il y a de nombreux ouvrages en plusieurs tomes…..
    Le fait qu'un livre soit en plusieurs tomes ne posent aucun problème.
    Mais comme dit plut haut, j'ai complètement oublié qu'un livre peut-être écrit par plusieurs auteurs.
    Encore que l'on peut attribuer à ce livre, un seul auteur, celui qui vient en premier alphabétiquement.

    Je ferais aussi la même remarque avec des auteurs homonymes, comme M. Frédéric Durand :
    --> https://fr.wikipedia.org/wiki/Fr%C3%...%C3%A9crivain)
    --> https://fr.wikipedia.org/wiki/Fr%C3%...%A9rick_Durand

    Et des livres ayant le même titre, par exemple "les petits" de Christine Angot et "les Petits" de Frédérique Clémençon.
    --> https://bibliobs.nouvelobs.com/actua...eme-titre.html

    J'ai un peu cherché mais je n'ai pas trouvé de livres ayant le même titre mais écrit par des auteurs homonymes.

    @+

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 112
    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 112
    Points : 31 586
    Points
    31 586
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Artemus24
    Et non, avant d'être déplacé, ce sujet était dans le forum mysql.
    Au temps pour moi !

Discussions similaires

  1. Pb de Table : doublons et clé primaire
    Par flagfight dans le forum Access
    Réponses: 2
    Dernier message: 10/05/2006, 19h48
  2. creation d'une table avec une clé primaire multiple
    Par oursquetaire dans le forum Oracle
    Réponses: 2
    Dernier message: 23/12/2005, 13h29
  3. Réponses: 13
    Dernier message: 14/09/2005, 16h21
  4. Import data d'Excel ds 2 table lié par clé primaire
    Par lord_paco dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 10/05/2005, 09h31
  5. [postgresql]creer une table avec plusieurs clés primaire??
    Par perlgirl dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/11/2004, 17h24

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