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 :

Inventaire livres bibliothèque personnelle


Sujet :

Schéma

  1. #21
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 088
    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 088
    Points : 31 342
    Points
    31 342
    Billets dans le blog
    16
    Par défaut
    Bonjour à tous,

    L’association ternaire PA_participer est valide si et seulement si le prédicat suivant est vérifié (règle à intégrer au corpus) :

    Le contributeur C participe à l’oeuvre O pour y exercer explicitement la fonction F.

    A défaut, la quatrième forme normale serait violée et PA_participer à décomposer en associations binaires.
    (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.

  2. #22
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 383
    Points : 208
    Points
    208
    Par défaut
    Bonjour à tous,

    Avec looping, j'ai décomposé la relation [PA_participer] :

    Nom : mcdfonctioncontributeurdecomposition.jpg
Affichages : 96
Taille : 22,5 Ko

    Citation Envoyé par fsmrel
    Le contributeur C participe à l’œuvre O pour y exercer explicitement la fonction F
    J'avoue ne pas saisir la subtilité. Dans ma problématique, un contributeur peut participer à chaque œuvre en tant qu'auteur et/ou traducteur et/ou préfacier et/ou illustrateur. Plusieurs fonctions pour un même contributeur sont donc possibles pour une même œuvre. Par exemple l'auteur Stephen King préface (ou postface) régulièrement ses propres œuvres. Par ailleurs, un contributeur peut exercer une fonction telle qu'auteur dans une œuvre et une autre fonction telle que traducteur dans une autre. Par exemple Charles Baudelaire est l'auteur que nous connaissons, mais également le traducteur des écrits d'Edgar Poe.
    Je ne sais pas si ces précisions suffisent à régler la question de savoir si la quatrième forme normale est respectée ou non, et si la décomposition s'impose ou non.

  3. #23
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 088
    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 088
    Points : 31 342
    Points
    31 342
    Billets dans le blog
    16
    Par défaut
    Je prends un exemple proposé par Chris Date.

    Prédicat :

    Le cours CourseNo peut être donné par le professeur TeacherNo et on se servira du support de cours TextNo.

    MCD :
     
     
    Modifions le prédicat ainsi :

    Le cours CourseNo peut être donné par le professeur TeacherNo et on se servira du support de cours TextNo, quel que soit le professeur.

    Le MCD doit devenir celui-ci pour que la 4NF soit respectée :
     
     
    Dans le contexte de la théorie relationnelle, pour normaliser la table CTX en 4NF, on effectue la projection de la table CTX pour obtenir les tables CT et CX. Si on tient à présenter à l’utilisateur la table CTX, on le fera au moyen d’une vue de jointure (CT join CX).
    (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.

  4. #24
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    @François : je ne vois pas où se situerait la faille dans la ternaire telle que l'a modélisée Almoha. Je ne vois aucun viol de 4NF possible.

  5. #25
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 088
    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 088
    Points : 31 342
    Points
    31 342
    Billets dans le blog
    16
    Par défaut
    @Capitaine

    Tu as parfaitement raison.

    Suite aux interrogations d’almoha, j’ai pris l’exemple des cours pour montrer le risque qu’il peut y avoir quand une ternaire est à casser pour en faire des binaires (indépendance des profs et des supports de cours que ces profs doivent utiliser). C’est en quelque sorte une piqûre de rappel, suite à de situations réelles que j’ai vécues, où la 4NF fut mise à mal.

    Dans le cas soumis par almoha, pas de problème. Hergé fut l’auteur et l’illustrateur de ses BD, tout va bien.
    (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. #26
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 383
    Points : 208
    Points
    208
    Par défaut
    @fsmrel & @escartefigue : je note donc que la modélisation soumise relative aux fonctions emporte votre adhésion.

    Je passe à une autre problématique, pointée par @SQL pro :

    Citation Envoyé par SQLpro
    1) une édition peut contenir plusieurs œuvres (notamment les collections "Bouquins", "Omnibus"... les anthologies...) cardinalité à revoir
    Rappel de la R002 : une édition fait paraître une et une seule œuvre

    Effectivement, cette règle ne prenait pas en compte le cas des anthologies et recueils de nouvelles, qui sont des types d’édition rassemblant plusieurs œuvres.

    Ce qui selon moi induit la logique suivante :

    Chaque édition ne concerne pas forcément une œuvre puisqu’une édition peut concerner un recueil.
    et réciproquement chaque édition ne concerne pas forcément un recueil puisqu’une édition peut concerner une œuvre.

    Ma tentative de conceptualisation :

    Nom : v7-Book_Looping_recueil.jpg
Affichages : 75
Taille : 53,9 Ko

    Qu'en pensez-vous ? Merci.

  7. #27
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Quand on parle d'édition contenant plusieurs œuvres, s'agit-il de collections d'un éditeur (par exemple "les guides du naturaliste" chez "Delachaux et Niestlé") ? Des différents tomes d'une même œuvre (par exemple "l'Assommoir " parmi les "Rougon-Macquart") ?
    Merci de donner des exemples.

  8. #28
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 383
    Points : 208
    Points
    208
    Par défaut
    La notion d’édition rassemblant plusieurs œuvres renvoie à celle d’anthologie, c’est-à-dire une compilation d'œuvres (romans, poèmes, nouvelles, essais…). Dans ma conception, cette notion ne semble pas directement liée à celles de collection et de tome (je peux me tromper).

    => Le recueil de nouvelles « Histoires extraordinaires » parue aux éditions Le Livre de Poche dans leur collection « Classiques », rassemble plusieurs nouvelles, c’est-à-dire plusieurs œuvres, comme « Double assassinat dans la rue Morgue », « La lettre volée » etc.
    => La logique est la même pour les recueils de poèmes, comme « Les fleurs du mal », ou les compilations de romans (par exemple « Puck, Lutin de la colline et autres récits » de Rudyard Kipling, paru aux éditions Robert Laffont dans leur collection Bouquins).

    Une même anthologie peut compiler des œuvres de différents types (romans, nouvelles…). Les contributeurs peuvent être multiples au sein d’une même anthologie.

    Je reviens sur les notions de collection et de tome. Pour la collection, je pensais à une mise en relation avec les entités [ED_Editeur] et [EO_edition]. Mais peut-être les choses ne sont pas aussi simples.
    Quant à l’implémentation de la notion de tome, c’est à ce stade un peu confus dans mon esprit, notamment sur les relations avec les entités en place. Si l’on considère que le découpage de l’œuvre en tomes est voulu par l’auteur, la relation pourrait partir de l’entité [OE_Œuvre]. Si l’on considère que le découpage en tomes résulte plutôt d’un choix éditorial (commercial), alors la relation pourrait partir de l’entité [EO_edition]. Ce choix éditorial peut s’illustrer dans le cas où une œuvre étrangère, parue en VO sans découpage, est éditée en français en plusieurs tomes (par exemple le roman de plus de 1000 pages « IT » de Stephen King). Entre ces deux hypothèses, je considère que le cas le plus fréquent est le découpage de l’œuvre à l’initiative de l’auteur. Je précise enfin qu’une anthologie peut elle aussi paraitre en plusieurs tomes (Les Intégrales San-Antonio par exemple).

  9. #29
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    Pour la collection, le MCD qui concerne une médiathèque et dont j'ai communiqué le lien propose une solution.

    Pour les tomes, même si c'est une volonté de l'auteur, l'éditeur devra s'y soumettre, ce faisant, on peut gérer la chose au niveau de l'édition.

    Pour les anthologies, en effet, c'est donc une toute autre notion que les tomes et les collections.

  10. #30
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 383
    Points : 208
    Points
    208
    Par défaut
    Pour la collection, je me penche sur le sujet grâce au lien communiqué.

    C'est d'accord pour la gestion des tomes à partir de l'entité edition.

    En ce qui concerne les anthologies (recueil dans le MCD), que pensez-vous de la modélisation proposée dans le message #26 ? Merci.

  11. #31
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    En l'état, le recueil pourrait être associé à plusieurs éditions, éventuellement de plusieurs éditeurs, ce qui ne convient pas.

    il faut modifier la cardinalité 1,n en 1,1, voire 1,1(R) de [RE_recueil] vers (exister). Je plaiderais plutôt pour une identification relative - donc 1,1(R) - dans la mesure où il ne saurait exister un recueil sans édition.

  12. #32
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 383
    Points : 208
    Points
    208
    Par défaut
    En suivant votre recommandation, le script est le suivant pour les tables en relation :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    CREATE TABLE OE_oeuvre(
       OE_ident COUNTER,
       OE_titre VARCHAR(50)  NOT NULL,
       PRIMARY KEY(OE_ident)
    );
    CREATE TABLE EO_edition(
       EO_ident COUNTER,
       EO_date DATE NOT NULL,
       EO_titre VARCHAR(50)  NOT NULL,
       OE_ident INT,
       ED_ident INT NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(ED_ident) REFERENCES ED_editeur(ED_ident)
    );
    CREATE TABLE RE_recueil(
       EO_ident INT,
       RE_ident COUNTER,
       RE_titre VARCHAR(50)  NOT NULL,
       PRIMARY KEY(EO_ident, RE_ident),
       UNIQUE(EO_ident),
       FOREIGN KEY(EO_ident) REFERENCES EO_edition(EO_ident)
    );
    CREATE TABLE CO_contenir(
       OE_ident INT,
       EO_ident INT,
       RE_ident INT,
       PRIMARY KEY(OE_ident, EO_ident, RE_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(EO_ident, RE_ident) REFERENCES RE_recueil(EO_ident, RE_ident)
    );

    En voulant tester, c'est malheureusement l'impasse :

    Nom : Table_OE_oeuvre.jpg
Affichages : 54
Taille : 5,3 Ko

    Nom : table RE_recueil.jpg
Affichages : 53
Taille : 4,8 Ko

    Nom : table CO_contenir.jpg
Affichages : 53
Taille : 5,7 Ko

    La difficulté survient dans la table EO_edition :

    Nom : table EO_edition.jpg
Affichages : 54
Taille : 10,4 Ko
    qui me demande de pointer l'identifiant d'une œuvre… Cela convient s'il s'agit d'une édition ne concernant qu'une seule œuvre mais pas s'il s'agit d'un recueil. Rappel de ma problématique : une édition peut concerner une seule œuvre ou être un recueil en contenant plusieurs (des nouvelles par exemple). Merci.

  13. #33
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    Voici un modèle qui fonctionne sous MySQL (je n'ai pas MS-Access pour tester).
    J'ai identifié RE_recueil relativement à EO_edition et ajouté l'entité pivot manquante pour la contrainte (X)

    Ce qui donne ce MCD :

    Nom : Sans titre.png
Affichages : 49
Taille : 20,3 Ko

    Et ce script :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    CREATE TABLE ED_editeur(
       ED_ident INT AUTO_INCREMENT,
       ED_nom VARCHAR(128) NOT NULL,
       PRIMARY KEY(ED_ident)
    );
     
    CREATE TABLE ET_etagere(
       ET_ident INT AUTO_INCREMENT,
       PRIMARY KEY(ET_ident)
    );
     
    CREATE TABLE OE_oeuvre(
       OE_ident INT AUTO_INCREMENT,
       OE_titre VARCHAR(128) NOT NULL,
       PRIMARY KEY(OE_ident)
    );
     
    CREATE TABLE EO_edition(
       EO_ident INT AUTO_INCREMENT,
       EO_date DATE NOT NULL,
       OE_ident INT,
       ED_ident INT NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(ED_ident) REFERENCES ED_editeur(ED_ident)
    );
     
    CREATE TABLE EP_edition_possedee(
       EO_ident INT,
       EP_isbn CHAR(13) NOT NULL,
       EP_resume VARCHAR(255) NOT NULL,
       EO_ident_parent INT,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(EO_ident) REFERENCES EO_edition(EO_ident),
       FOREIGN KEY(EO_ident_parent) REFERENCES EO_edition(EO_ident)
    );
     
    CREATE TABLE EX_exemplaire(
       EO_ident INT,
       EX_seqn SMALLINT,
       EX_date_acq DATE NOT NULL,
       PRIMARY KEY(EO_ident, EX_seqn),
       FOREIGN KEY(EO_ident) REFERENCES EP_edition_possedee(EO_ident)
    );
     
    CREATE TABLE RE_recueil(
       EO_ident INT,
       RE_titre VARCHAR(50) NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(EO_ident) REFERENCES EO_edition(EO_ident)
    );
     
    CREATE TABLE RG_ranger(
       EO_ident INT,
       EX_seqn SMALLINT,
       CA_date DATE,
       ET_ident INT NOT NULL,
       PRIMARY KEY(EO_ident, EX_seqn, CA_date),
       FOREIGN KEY(EO_ident, EX_seqn) REFERENCES EX_exemplaire(EO_ident, EX_seqn),
       FOREIGN KEY(ET_ident) REFERENCES ET_etagere(ET_ident)
    );

    Aucun problème pour insérer dans [EO]

    Dans votre modèle, il y a une erreur d'identification du recueil : soit la PK est celle de l'édition (choix que j'ai retenu) auquel cas elle ne doit pas être un compteur, soit elle est autonome et c'est un compteur

  14. #34
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    J'avais oublié l'association (CO_contenir)
    C'est ajouté dans la version ci-dessous :

    Nom : Sans titre.png
Affichages : 49
Taille : 21,2 Ko


    Et voici également un script dans lequel j'ai supprimé étagères et rangement qui nous intéressent peu à ce stade et ajouté quelques insertions dans ED, OE et EO, sans souci donc

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    CREATE TABLE ED_editeur(
       ED_ident INT AUTO_INCREMENT,
       ED_nom VARCHAR(128) NOT NULL,
       PRIMARY KEY(ED_ident)
    );
    insert into ED_editeur (ED_nom)
    values ('Gallimard')
         , ('Seuil')
         , ('Dargaud')
    ;  
    CREATE TABLE OE_oeuvre(
       OE_ident INT AUTO_INCREMENT,
       OE_titre VARCHAR(128) NOT NULL,
       PRIMARY KEY(OE_ident)
    );
    insert into OE_oeuvre (OE_titre)
    values ('Notre-Dame de Paris')
         , ('Le rouge et le noir')
         , ('Astérix le Gaulois')
    ;  
    CREATE TABLE EO_edition(
       EO_ident INT AUTO_INCREMENT,
       EO_date DATE NOT NULL,
       OE_ident INT,
       ED_ident INT NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(ED_ident) REFERENCES ED_editeur(ED_ident)
    );
    insert into EO_edition (EO_date, OE_ident, ED_ident)
    values ('2020-06-25', 1, 1)
         , ('2015-11-03', 2, 2)
         , ('2022-03-18', 1, 2)
         , ('1961-04-12', 3, 3)
    ;  
    CREATE TABLE EP_edition_possedee(
       EO_ident INT,
       EP_isbn CHAR(13) NOT NULL,
       EP_resume VARCHAR(255) NOT NULL,
       EO_ident_parent INT,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(EO_ident) REFERENCES EO_edition(EO_ident),
       FOREIGN KEY(EO_ident_parent) REFERENCES EO_edition(EO_ident)
    );
     
    CREATE TABLE EX_exemplaire(
       EO_ident INT,
       EX_seqn SMALLINT,
       EX_date_acq DATE NOT NULL,
       PRIMARY KEY(EO_ident, EX_seqn),
       FOREIGN KEY(EO_ident) REFERENCES EP_edition_possedee(EO_ident)
    );
     
    CREATE TABLE RE_recueil(
       EO_ident INT,
       RE_titre VARCHAR(50) NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(EO_ident) REFERENCES EO_edition(EO_ident)
    );
    CREATE TABLE CO_contenir(
       OE_ident INT,
       EO_ident INT,
       PRIMARY KEY(OE_ident, EO_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(EO_ident) REFERENCES RE_recueil(EO_ident)
    );

  15. #35
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 383
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par escartefigue
    ...ajouté quelques insertions dans ED, OE et EO, sans souci donc
    Merci, effectivement j'arrive à cet affichage :

    Nom : affichage_OE_EO_ED.jpg
Affichages : 37
Taille : 11,2 Ko

    Mais je bloque pour remonter jusqu'au recueil grâce à RE_recueil et CO_contenir. Mon objectif est en effet d'obtenir le titre du recueil avec les œuvres qui y sont contenues

  16. #36
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    Voici un exemple de script permettant de faire la liste des œuvres contenues dans chaque recueil (la dernière requête).
    Je n'ai conservé que les tables qui nous intéressent pour ce besoin, à savoir ED, EO, OE, CO et RE
    Encore une fois, c'est à la sauce MySQL, car je n'ai malheureusement pas Access sous la main, désolé. Il faudra donc faire des adaptations au dialecte Access (notamment group_concat qui est du jargon spécifique MySQL).

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    CREATE TABLE ED_editeur(
       ED_ident INT AUTO_INCREMENT,
       ED_nom VARCHAR(128) NOT NULL,
       PRIMARY KEY(ED_ident)
    );
    insert into ED_editeur (ED_nom)
    values ('Gallimard')
         , ('Seuil')
         , ('Dargaud')
    ;  
    CREATE TABLE OE_oeuvre(
       OE_ident INT AUTO_INCREMENT,
       OE_titre VARCHAR(128) NOT NULL,
       PRIMARY KEY(OE_ident)
    );
    insert into OE_oeuvre (OE_titre)
    values ('Notre-Dame de Paris')
         , ('Le rouge et le noir')
         , ('Astérix le Gaulois')
         , ('La serpe d''or')  
    ;  
    CREATE TABLE EO_edition(
       EO_ident INT AUTO_INCREMENT,
       EO_date DATE NOT NULL,
       OE_ident INT,
       ED_ident INT NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(ED_ident) REFERENCES ED_editeur(ED_ident)
    );
    insert into EO_edition (EO_date, OE_ident, ED_ident)
    values ('2020-06-25', 1, 1)
         , ('2015-11-03', 2, 2)
         , ('2022-03-18', 1, 2)
         , ('1961-04-12', 3, 3)
         , ('1962-06-01', 4, 3)  
         , ('1975-01-20', null, 3)
    ;  
    CREATE TABLE RE_recueil(
       EO_ident INT,
       RE_titre VARCHAR(50) NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(EO_ident) REFERENCES EO_edition(EO_ident)
    );
    insert into RE_recueil (EO_ident, RE_titre)
    values (5, 'Asterix - T1&2')
    ;  
    CREATE TABLE CO_contenir(
       OE_ident INT,
       EO_ident INT,
       PRIMARY KEY(OE_ident, EO_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(EO_ident) REFERENCES RE_recueil(EO_ident)
    );
    insert into CO_contenir(OE_ident, EO_ident)
    values (3, 5)
         , (4, 5)
    ;
    -- contenu des recueils 
    select RE.RE_titre   as "titre recueil"
         , EO.EO_date    as "edité le"
         , ED.ED_nom     as "éditeur"
         , group_concat(OE.OE_titre separator ', ')   as "oeuvres contenues"
    from        RE_recueil  as RE
    inner join  EO_edition  as EO
       on EO.EO_ident = RE.EO_ident
    inner join  ED_editeur  as ED
       on ED.ED_ident = EO.ED_ident
    inner join  CO_contenir as CO
       on CO.EO_ident = RE.EO_ident
    inner join  OE_oeuvre   as OE
       on OE.OE_ident = CO.OE_ident
    group by RE.RE_titre
           , EO.EO_date
           , ED.ED_nom


    Résultat :

    Nom : Sans titre.png
Affichages : 36
Taille : 3,4 Ko

  17. #37
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 383
    Points : 208
    Points
    208
    Par défaut
    Merci, j'ai lancé la requête sous MySQL (je verrai plus tard pour Access). L'analyse du résultat me conduit à formuler les remarques suivantes :

    - Dans la table RE_recueil, l'identifiant du recueil est relatif à celui de l'édition portant le n° 5, qui renvoie à l'œuvre n°4. Je comprends que vous avez procédé ainsi pour pouvoir récupérer la date d'édition correspondante ("édité le"), en l'occurrence il s'agit de la date la plus récente par rapport à celle de l'œuvre n° 3 (les œuvres 3 et 4 composant le recueil "Asterix - T1&2"). Sauf à me tromper, vous avez sans doute considéré que cette date la plus récente pouvait correspondre à la date de parution de recueil. En réalité, cette dernière a son existence propre. Ne vaudrait-il pas mieux la faire figurer dans l'entité [RE_recueil] ? Et choisir une PK sous forme autonome de type compteur pour ne pas être obligé de rattacher "arbitrairement" une édition ?

    - Du fait de la cardinalité 0,1 de l'entité [EO_edition] vers l'association (exister), la clé étrangère OE_ident peut être "null" dans la table EO_edition. Or je ne saisis pas comment il est possible qu'une édition ne puisse pas être rattachée à une œuvre …
    Dans mon esprit, le choix de la cardinalité 0, 1 avait été dicté par ce postulat :

    Citation Envoyé par "Almoha
    Chaque édition ne concerne pas forcément une œuvre puisqu’une édition peut concerner un recueil.
    et réciproquement chaque édition ne concerne pas forcément un recueil puisqu’une édition peut concerner une œuvre.
    Je me demande dès lors si je n'ai pas commis des erreurs dans les cardinalités. Je précise que l'objectif final est d'afficher tout à la fois les éditions "mono-œuvre" et les éditions de type recueil.

  18. #38
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    bonjour,

    Les cardinalités du MCD ne sont pas en cause. La date d'édition erronée est due au fait que dans mes ordres INSERT, je me suis trompé de valeur pour l'identifiant d'édition du recueil dans les tables RE et CO : le recueil correspond à l'identifiant n°6 et non pas au n°5 !
    Après avoir corrigé cette coquille, on obtient bien la date d'édition du recueil.

    Voici le script corrigé :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    CREATE TABLE ED_editeur(
       ED_ident INT AUTO_INCREMENT,
       ED_nom VARCHAR(128) NOT NULL,
       PRIMARY KEY(ED_ident)
    );
    insert into ED_editeur (ED_nom)
    values ('Gallimard')
         , ('Seuil')
         , ('Dargaud')
    ;  
    CREATE TABLE OE_oeuvre(
       OE_ident INT AUTO_INCREMENT,
       OE_titre VARCHAR(128) NOT NULL,
       PRIMARY KEY(OE_ident)
    );
    insert into OE_oeuvre (OE_titre)
    values ('Notre-Dame de Paris')
         , ('Le rouge et le noir')
         , ('Astérix le Gaulois')
         , ('La serpe d''or')  
    ;  
    CREATE TABLE EO_edition(
       EO_ident INT AUTO_INCREMENT,
       EO_date DATE NOT NULL,
       OE_ident INT,
       ED_ident INT NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(ED_ident) REFERENCES ED_editeur(ED_ident)
    );
    insert into EO_edition (EO_date, OE_ident, ED_ident)
    values ('2020-06-25', 1, 1)    -- Notre-Dame de Paris / Gallimard
         , ('2015-11-03', 2, 2)    -- Le rouge et le noir / Seuil
         , ('2022-03-18', 1, 2)    -- Notre-Dame de Paris / Seuil
         , ('1961-04-12', 3, 3)    -- Astérix le Gaulois / Dargaud
         , ('1962-06-01', 4, 3)    -- La serpe d'Or / Dargaud
         , ('1975-01-20', null, 3) -- recueil / Dargaud
    ;  
    CREATE TABLE RE_recueil(
       EO_ident INT,
       RE_titre VARCHAR(50) NOT NULL,
       PRIMARY KEY(EO_ident),
       FOREIGN KEY(EO_ident) REFERENCES EO_edition(EO_ident)
    );
    insert into RE_recueil (EO_ident, RE_titre)
    values (6, 'Asterix - T1&2')
    ;  
    CREATE TABLE CO_contenir(
       OE_ident INT,
       EO_ident INT,
       PRIMARY KEY(OE_ident, EO_ident),
       FOREIGN KEY(OE_ident) REFERENCES OE_oeuvre(OE_ident),
       FOREIGN KEY(EO_ident) REFERENCES RE_recueil(EO_ident)
    );
    insert into CO_contenir(OE_ident, EO_ident)
    values (3, 6)
         , (4, 6)
    ;
    -- contenu des recueils 
    select RE.RE_titre   as "titre recueil"
         , RE.EO_ident
         , EO.EO_date    as "edité le"
         , ED.ED_nom     as "éditeur"
         , group_concat(OE.OE_titre separator ', ')   as "oeuvres contenues"
    from        RE_recueil  as RE
    inner join  EO_edition  as EO
       on EO.EO_ident = RE.EO_ident
    inner join  ED_editeur  as ED
       on ED.ED_ident = EO.ED_ident
    inner join  CO_contenir as CO
       on CO.EO_ident = RE.EO_ident
    inner join  OE_oeuvre   as OE
       on OE.OE_ident = CO.OE_ident
    group by RE.RE_titre
           , RE.EO_ident
           , EO.EO_date
           , ED.ED_nom

  19. #39
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 383
    Points : 208
    Points
    208
    Par défaut
    Merci, je comprends mieux la logique . Notamment pourquoi la clé étrangère OE_ident dans une édition de type recueil a une valeur NULL.
    Une question complémentaire me vient à l'esprit dans le cas d'un recueil comportant des œuvres traduites en français. Comment pourrait-on faire sorte de récupérer pour chaque œuvre, outre le titre en français présent dans OE, le titre en VO (toujours mentionné dans l'édition possédée) et la date d'édition en VO (si mentionnée). Merci.

  20. #40
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 266
    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 266
    Points : 39 407
    Points
    39 407
    Billets dans le blog
    9
    Par défaut
    Pour ce besoin, il faut associer une langue à l’œuvre et une langue à l'édition.
    Il faut également ajouter un titre dans l'édition.

    Voici un MCD enrichi pour prendre en compte cette évolution

    Nom : Sans titre.png
Affichages : 19
Taille : 26,7 Ko

Discussions similaires

  1. Mld pour inventaire livre
    Par cold-apok dans le forum Schéma
    Réponses: 1
    Dernier message: 25/09/2007, 01h42
  2. [langage] Je cherche un bon livre ?
    Par Anonymous dans le forum Langage
    Réponses: 13
    Dernier message: 09/04/2003, 13h16
  3. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35
  4. Réponses: 2
    Dernier message: 17/03/2002, 19h00

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