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
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é...
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...)
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...
Partager