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. #61
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 128
    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 128
    Billets dans le blog
    16
    Par défaut
    Bonjour almoa,

    Citation Envoyé par almoa
    Supposons par exemple que j’enregistre dans mon application une édition originale (e1) d’une œuvre française en grand format (GF). J’enregistre ses caractéristiques propres. Potentiellement une édition étrangère (e2) de cette œuvre (traduite du français vers une autre langue) peut exister (GF ou poche). De même potentiellement il peut exister une édition française de la même œuvre en poche (e3) ou alors en GF (e4) mais d’un autre éditeur. Il est alors important de distinguer deux cas de figure :

    a) Je possède une édition liée (e2 ou e3 ou e4) à e1 (1 % des cas) : cette édition doit être enregistrée avec toutes ses caractéristiques propres (titre, éditeur, année parution, contributeur…), comme c’est le cas de toutes les éditions possédées. A l’affichage dans l’application, il devra m’être signalé qu’il existe une édition liée possédée que je peux afficher à son tour.

    b) Je ne possède pas l’édition liée (e2 ou e3 ou e4) à e1 (99 % des cas) : lors de l’enregistrement de l’édition que je possède, il s’agit seulement de faire référence à l’édition liée (e2 ou e3 ou e4) en notant son titre (si différent : titre VO), éditeur et année de parution. Je trouve ces références dans l’édition possédée généralement dans la page mentionnant le copyright. A l’affichage de l’édition possédée, il sera fait mention desdites références.
    Cas (a) il faudrait donc créer e2, e3, e4 en tant qu’éditions non possédées et établir un lien entre e1 et ces éditions ;

    Cas (b) il faut donc créer e2, e3, e4 en tant qu’éditions possédées et établir un lien entre e1 et ces éditions.

    Ci-joint une vue d’une partie d’un MCD en cours d’élaboration. A vous de préciser ce qui ne va pas...

    (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. #62
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    394
    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 : 394
    Par défaut
    Bonjour fsmrel,

    J'ai essayé de construire dans Looping la partie du MCD proposé. Le MLD généré est le suivant :

    Nom : 2024-12-21 15_23_03-Looping - [Biblio-Dec-2024.loo].png
Affichages : 72
Taille : 42,0 Ko

    et le script SQL est le suivant :

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    CREATE TABLE Ouvrage(
       OuvrageId SERIAL,
       OuvrageTitre VARCHAR(100)  NOT NULL,
       PRIMARY KEY(OuvrageId)
    );
     
    CREATE TABLE Editeur(
       EditeurId SERIAL,
       EditeurNom VARCHAR(100) ,
       PRIMARY KEY(EditeurId)
    );
     
    CREATE TABLE EditionType(
       EditionTypeId SERIAL,
       EditionTypeLibelle VARCHAR(100) ,
       PRIMARY KEY(EditionTypeId)
    );
     
    CREATE TABLE Format(
       FormatId SERIAL,
       FormatLibelle VARCHAR(100) ,
       PRIMARY KEY(FormatId)
    );
     
    CREATE TABLE Contributeur(
       ContributeurId SERIAL,
       ContributeurNom VARCHAR(100) ,
       PRIMARY KEY(ContributeurId)
    );
     
    CREATE TABLE ContributionType(
       ContributionTypeId SERIAL,
       ContributionTypeLibelle VARCHAR(100) ,
       PRIMARY KEY(ContributionTypeId)
    );
     
    CREATE TABLE Edition(
       OuvrageId INTEGER,
       EditionNumero SERIAL,
       AnneParution DATE,
       EditeurId INTEGER NOT NULL,
       PRIMARY KEY(OuvrageId, EditionNumero),
       FOREIGN KEY(OuvrageId) REFERENCES Ouvrage(OuvrageId),
       FOREIGN KEY(EditeurId) REFERENCES Editeur(EditeurId)
    );
     
    CREATE TABLE EditionNonPossedee(
       Id_EditionNonPossedee SERIAL,
       OuvrageId INTEGER NOT NULL,
       EditionNumero INTEGER NOT NULL,
       PRIMARY KEY(Id_EditionNonPossedee),
       UNIQUE(EditionNumero),
       FOREIGN KEY(OuvrageId, EditionNumero) REFERENCES Edition(OuvrageId, EditionNumero)
    );
     
    CREATE TABLE EditionPossedee(
       Id_EditionPossedee SERIAL,
       ISBN13 VARCHAR(13) ,
       EditionDateAchat DATE,
       FormatId INTEGER NOT NULL,
       OuvrageId INTEGER NOT NULL,
       EditionNumero INTEGER NOT NULL,
       PRIMARY KEY(Id_EditionPossedee),
       UNIQUE(EditionNumero),
       FOREIGN KEY(FormatId) REFERENCES Format(FormatId),
       FOREIGN KEY(OuvrageId, EditionNumero) REFERENCES Edition(OuvrageId, EditionNumero)
    );
     
    CREATE TABLE EdiEnfantFrancais(
       Id_EdiEnfantFrancais SERIAL,
       Id_EditionPossedee_SourceGrandFormatFrançais INTEGER NOT NULL,
       Id_EditionPossedee_EnfantDeParentFrançais INTEGER NOT NULL,
       PRIMARY KEY(Id_EdiEnfantFrancais),
       UNIQUE(Id_EditionPossedee_SourceGrandFormatFrançais),
       UNIQUE(Id_EditionPossedee_EnfantDeParentFrançais),
       FOREIGN KEY(Id_EditionPossedee_SourceGrandFormatFrançais) REFERENCES EditionPossedee(Id_EditionPossedee),
       FOREIGN KEY(Id_EditionPossedee_EnfantDeParentFrançais) REFERENCES EditionPossedee(Id_EditionPossedee)
    );
     
    CREATE TABLE EdiEnfantDeParentEtranger(
       Id_EdiEnfantDeParentEtranger SERIAL,
       Id_EditionPossedee_EnfantDeParentPasEnFrançais INTEGER NOT NULL,
       PRIMARY KEY(Id_EdiEnfantDeParentEtranger),
       UNIQUE(Id_EditionPossedee_EnfantDeParentPasEnFrançais),
       FOREIGN KEY(Id_EditionPossedee_EnfantDeParentPasEnFrançais) REFERENCES EditionPossedee(Id_EditionPossedee)
    );
     
    CREATE TABLE Referencer(
       Id_EditionPossedee INTEGER,
       Id_EditionNonPossedee INTEGER,
       PRIMARY KEY(Id_EditionPossedee, Id_EditionNonPossedee),
       FOREIGN KEY(Id_EditionPossedee) REFERENCES EditionPossedee(Id_EditionPossedee),
       FOREIGN KEY(Id_EditionNonPossedee) REFERENCES EditionNonPossedee(Id_EditionNonPossedee)
    );
     
    CREATE TABLE Edi_Type(
       Id_EditionPossedee INTEGER,
       EditeurId INTEGER,
       EditionTypeId INTEGER,
       AnneeParution DATE,
       PRIMARY KEY(Id_EditionPossedee, EditeurId, EditionTypeId),
       FOREIGN KEY(Id_EditionPossedee) REFERENCES EditionPossedee(Id_EditionPossedee),
       FOREIGN KEY(EditeurId) REFERENCES Editeur(EditeurId),
       FOREIGN KEY(EditionTypeId) REFERENCES EditionType(EditionTypeId)
    );
     
    CREATE TABLE Edi_Con(
       Id_EditionPossedee INTEGER,
       ContributeurId INTEGER,
       ContributionTypeId INTEGER,
       PRIMARY KEY(Id_EditionPossedee, ContributeurId, ContributionTypeId),
       FOREIGN KEY(Id_EditionPossedee) REFERENCES EditionPossedee(Id_EditionPossedee),
       FOREIGN KEY(ContributeurId) REFERENCES Contributeur(ContributeurId),
       FOREIGN KEY(ContributionTypeId) REFERENCES ContributionType(ContributionTypeId)
    );

    J'ai peut-être fait des erreurs dans la transcription du MCD :

    - La contrainte d'unicité porte sur "EditionNumero". Ne devrait-elle pas plutôt porter sur le couple (OuvrageId, EditionNumero) qui est déjà la clé primaire de la table [Edition] ?

    - J'ai du mal à comprendre la conception des tables [EdiEnfantFrancais] et [EdiEnfantDeParentEtranger]. Je voyais plus une colonne "Id_EditionPossedee_Parent" dans la table EditionPossedee (mais problème elle pourrait être NULL...)

    - La présence de "AnneeParution" dans la table [Edi_Type] ne serait-elle pas redondante car déjà présente dans la table [Edition] ?

    Par ailleurs, je ne suis pas sûr de saisir ce que recoupe la notion de "types d'édition" dans la table [EditionType].

    Merci par avance de votre éclairage.

  3. #63
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 128
    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 128
    Billets dans le blog
    16
    Par défaut
    Bonjour almoha,

    Votre MLD diffère quelque peu du mien, lequel est le suivant, obtenu à partir de mon dernier MCD :  
     
     
    Au stade MCD, Les entités-types EditionPossedee et EditionNonPossedee sont des spécialisations de l’entité-type Edition, en conséquence de quoi elles héritent de l’identifiant de celle-ci {OuvrageId, EditionNumero}.
     
    Ceci vaut au stade du MLD : les tables EditionPossedee et EditionNonPossedee ont pour clé primaire la paire {OuvrageId, EditionNumero}, qui est aussi clé étrangère en relation avec la table Edition.  
     
    Les attributs Id_EditionPossedee et Id_EditionNonPossedee que vous utilisez pour les tables EditionPossedee et EditionNonPossedee n’ont pas lieu d’être et doivent disparaître. En créant votre propre MCD, vous avez sans doute pensé généralisation et non pas spécialisation : il serait opportun que vous le présentiez.
     
    Le code SQL issu de mon MLD :
     
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    CREATE TABLE Editeur(
       EditeurId SMALLINT,
       EditeurNom SMALLINT NOT NULL,
       CONSTRAINT Editeur_PK PRIMARY KEY(EditeurId),
       CONSTRAINT Editeur_AK UNIQUE(EditeurNom)
    );
     
    CREATE TABLE Format(
       FormatId SMALLINT,
       FormatLibelle VARCHAR(50) NOT NULL,
       CONSTRAINT Format_PK PRIMARY KEY(FormatId),
       CONSTRAINT Format_AK UNIQUE(FormatLibelle)
    );
     
    CREATE TABLE Contributeur(
       ContributeurId SMALLINT,
       ContributeurNom VARCHAR(50) NOT NULL,
       CONSTRAINT Contributeur_PK PRIMARY KEY(ContributeurId),
       CONSTRAINT Contributeur_AK UNIQUE(ContributeurNom)
    );
     
    CREATE TABLE EditionType(
       EditionTypeId SMALLINT,
       EditionTypeLibelle VARCHAR(50) NOT NULL,
       CONSTRAINT EditionType_PK PRIMARY KEY(EditionTypeId),
       CONSTRAINT EditionType_AK UNIQUE(EditionTypeLibelle)
    );
     
    CREATE TABLE ContributionType(
       ContributionTypeId SMALLINT,
       ContributionTypeLibelle VARCHAR(50) NOT NULL,
       CONSTRAINT ContributionType_PK PRIMARY KEY(ContributionTypeId),
       CONSTRAINT ContributionType_AK UNIQUE(ContributionTypeLibelle)
    );
     
    CREATE TABLE Ouvrage(
       OuvrageId SMALLINT,
       OuvrageTitre VARCHAR(50) NOT NULL,
       CONSTRAINT Ouvrage_PK PRIMARY KEY(OuvrageId)
    );
     
    CREATE TABLE Edition(
       OuvrageId SMALLINT,
       EditionNumero INT,
       EditeurId SMALLINT NOT NULL,
       CONSTRAINT Edition_PK PRIMARY KEY(OuvrageId, EditionNumero),
       CONSTRAINT Edition_Ouvrage_FK FOREIGN KEY(OuvrageId) REFERENCES Ouvrage(OuvrageId),
       CONSTRAINT Edition_Editeur_FK FOREIGN KEY(EditeurId) REFERENCES Editeur(EditeurId)
    );
     
    CREATE TABLE EditionPossedee(
       OuvrageId SMALLINT,
       EditionNumero INT,
       ISBN13 VARCHAR(13) NOT NULL,
       EditionDateAchat DATE NOT NULL,
       FormatId SMALLINT NOT NULL,
       CONSTRAINT EditionPossedee_PK PRIMARY KEY(OuvrageId, EditionNumero),
       CONSTRAINT EditionPossedee_AK UNIQUE(ISBN13),
       CONSTRAINT EditionPossedee_Edition_FK FOREIGN KEY(OuvrageId, EditionNumero) REFERENCES Edition(OuvrageId, EditionNumero),
       CONSTRAINT EditionPossedee_Format_FK FOREIGN KEY(FormatId) REFERENCES Format(FormatId)
    );
     
    CREATE TABLE EditionNonPossedee(
       OuvrageId SMALLINT,
       EditionNumero INT,
       CONSTRAINT EditionNonPossedee_PK PRIMARY KEY(OuvrageId, EditionNumero),
       CONSTRAINT EditionNonPossedee_Edition_FK FOREIGN KEY(OuvrageId, EditionNumero) REFERENCES Edition(OuvrageId, EditionNumero)
    );
     
    CREATE TABLE EdiEnfantDeParentEtranger(
       OuvrageId_EnfantDeParentPasEnFrançais SMALLINT,
       EditionNumero_EnfantDeParentPasEnFrançais INT,
       CONSTRAINT EdiEnfantDeParentEtranger_PK PRIMARY KEY(OuvrageId_EnfantDeParentPasEnFrançais, EditionNumero_EnfantDeParentPasEnFrançais),
       CONSTRAINT EdiEnfantDeParentEtranger_EditionPossedee_EnfantDeParentPasEnFrançais_FK FOREIGN KEY(OuvrageId_EnfantDeParentPasEnFrançais, EditionNumero_EnfantDeParentPasEnFrançais) REFERENCES EditionPossedee(OuvrageId, EditionNumero)
    );
     
    CREATE TABLE EdiEnfantFrançais(
       OuvrageId_EnfantDeParentFrançais SMALLINT,
       EditionNumero_EnfantDeParentFrançais INT,
       OuvrageId_SourceGrandFormatFrançais SMALLINT NOT NULL,
       EditionNumero_SourceGrandFormatFrançais INT NOT NULL,
       CONSTRAINT EdiEnfantFrançais_PK PRIMARY KEY(OuvrageId_EnfantDeParentFrançais, EditionNumero_EnfantDeParentFrançais),
       CONSTRAINT EdiEnfantFrançais_AK UNIQUE(OuvrageId_SourceGrandFormatFrançais, EditionNumero_SourceGrandFormatFrançais),
       CONSTRAINT EdiEnfantFrançais_EditionPossedee_EnfantDeParentFrançais_FK FOREIGN KEY(OuvrageId_EnfantDeParentFrançais, EditionNumero_EnfantDeParentFrançais) REFERENCES EditionPossedee(OuvrageId, EditionNumero),
       CONSTRAINT EdiEnfantFrançais_EditionPossedee_SourceGrandFormatFrançais_FK FOREIGN KEY(OuvrageId_SourceGrandFormatFrançais, EditionNumero_SourceGrandFormatFrançais) REFERENCES EditionPossedee(OuvrageId, EditionNumero)
    );
     
    CREATE TABLE Edi_Con(
       OuvrageId SMALLINT,
       EditionNumero INT,
       ContributeurId SMALLINT,
       ContributionTypeId SMALLINT,
       CONSTRAINT Edi_Con_PK PRIMARY KEY(OuvrageId, EditionNumero, ContributeurId, ContributionTypeId),
       CONSTRAINT Edi_Con_EditionPossedee_FK FOREIGN KEY(OuvrageId, EditionNumero) REFERENCES EditionPossedee(OuvrageId, EditionNumero),
       CONSTRAINT Edi_Con_Contributeur_FK FOREIGN KEY(ContributeurId) REFERENCES Contributeur(ContributeurId),
       CONSTRAINT Edi_Con_ContributionType_FK FOREIGN KEY(ContributionTypeId) REFERENCES ContributionType(ContributionTypeId)
    );
     
    CREATE TABLE Edi_Type(
       OuvrageId SMALLINT,
       EditionNumero INT,
       EditeurId SMALLINT,
       EditionTypeId SMALLINT,
       AnneeParution INT NOT NULL,
       CONSTRAINT Edi_Type_PK PRIMARY KEY(OuvrageId, EditionNumero, EditeurId, EditionTypeId),
       CONSTRAINT Edi_Type_EditionPossedee_FK FOREIGN KEY(OuvrageId, EditionNumero) REFERENCES EditionPossedee(OuvrageId, EditionNumero),
       CONSTRAINT Edi_Type_Editeur_FK FOREIGN KEY(EditeurId) REFERENCES Editeur(EditeurId),
       CONSTRAINT Edi_Type_EditionType_FK FOREIGN KEY(EditionTypeId) REFERENCES EditionType(EditionTypeId)
    );
     
    CREATE TABLE Referencer(
       OuvrageId SMALLINT,
       EditionNumero INT,
       OuvrageId_1 SMALLINT,
       EditionNumero_1 INT,
       CONSTRAINT Referencer_PK PRIMARY KEY(OuvrageId, EditionNumero, OuvrageId_1, EditionNumero_1),
       CONSTRAINT Referencer_EditionPossedee_FK FOREIGN KEY(OuvrageId, EditionNumero) REFERENCES EditionPossedee(OuvrageId, EditionNumero),
       CONSTRAINT Referencer_EditionNonPossedee_1_FK FOREIGN KEY(OuvrageId_1, EditionNumero_1) REFERENCES EditionNonPossedee(OuvrageId, EditionNumero)
    );
     
     
    Histoire d’éviter d’avoir des noms d’attributs à rallonge, tels que OuvrageId_EnfantDeParentFrançais, EditionNumero_EnfantDeParentFrançais, etc., une fois que vous en avez noté la sémantique vous pouvez raccourcir les suffixes, comme je l’ai fait ci-dessous (voire carrément les supprimer) :
     
     
    Code SQL correspondant :
     
    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
    CREATE TABLE EditionPossedee(
       OuvrageId SMALLINT,
       EditionNumero INT,
       ISBN13 VARCHAR(13) NOT NULL,
       EditionDateAchat DATE NOT NULL,
       FormatId SMALLINT NOT NULL,
       CONSTRAINT EditionPossedee_PK PRIMARY KEY(OuvrageId, EditionNumero),
       CONSTRAINT EditionPossedee_AK UNIQUE(ISBN13),
       CONSTRAINT EditionPossedee_Edition_FK FOREIGN KEY(OuvrageId, EditionNumero) REFERENCES Edition(OuvrageId, EditionNumero),
       CONSTRAINT EditionPossedee_Format_FK FOREIGN KEY(FormatId) REFERENCES Format(FormatId)
    );
     
    CREATE TABLE EdiEnfantFrançais(
       OuvrageId_EPF SMALLINT,
       EditionNumero_EPF INT,
       OuvrageId_SGFF SMALLINT NOT NULL,
       EditionNumero_SGFF INT NOT NULL,
       CONSTRAINT EdiEnfantFrançais_PK PRIMARY KEY(OuvrageId_EPF, EditionNumero_EPF),
       CONSTRAINT EdiEnfantFrançais_AK UNIQUE(OuvrageId_SGFF, EditionNumero_SGFF),
       CONSTRAINT EdiEnfantFrançais_EditionPossedee_EPF_FK FOREIGN KEY(OuvrageId_EPF, EditionNumero_EPF) REFERENCES EditionPossedee(OuvrageId, EditionNumero),
       CONSTRAINT EdiEnfantFrançais_EditionPossedee_SGFF_FK FOREIGN KEY(OuvrageId_SGFF, EditionNumero_SGFF) REFERENCES EditionPossedee(OuvrageId, EditionNumero)
    );
     
    CREATE TABLE EdiEnfantDeParentEtranger(
       OuvrageId_EPNF SMALLINT,
       EditionNumero_EPNF INT,
       CONSTRAINT EdiEnfantDeParentEtranger_PK PRIMARY KEY(OuvrageId_EPNF, EditionNumero_EPNF),
       CONSTRAINT EdiEnfantDeParentEtranger_EditionPossedee_EPNF_FK FOREIGN KEY(OuvrageId_EPNF, EditionNumero_EPNF) REFERENCES EditionPossedee(OuvrageId, EditionNumero)
    );
     
    Citation Envoyé par almoha
    J'ai du mal à comprendre la conception des tables [EdiEnfantFrancais] et [EdiEnfantDeParentEtranger]. Je voyais plus une colonne "Id_EditionPossedee_Parent" dans la table EditionPossedee (mais problème elle pourrait être NULL...)
     
    En fait, le MCD que j’ai proposé n’est qu’une vue d’un MCD plus vaste. Par exemple, l’entité-type EdiEnfantDeParentEtranger pourrait faire l’objet à son tour d’une spécialisation en entités-types EdiEnfantDeParentEtrangerTraduit et EdiEnfantDeParentEtrangerPasTraduit ; elle pourrait être à l’origine d’une association avec EditionPossedee (parenté pas en français) : ces possibilités sont liées aux réponses aux questions que j’ai posées.
     
    Citation Envoyé par almoha
    Je voyais plus une colonne "Id_EditionPossedee_Parent" dans la table EditionPossedee (mais problème elle pourrait être NULL...)
    Null est au Modèle Relationnel de Données (alias Théorie Relationnelle) ce qu’est Quasimodo à Phoebus (ou encore Hilarion Lefuneste à Achille Talon). Vox in deserto, je passe mon temps à alerter au sujet de ce porteur de tares, inhibiteur des optimiseurs des SGBD, semeur de m... quant à la logique classique, empêcheur de l’utilisation des lois de De Morgan, etc.
     
    Citation Envoyé par almoha
    La présence de "AnneeParution" dans la table [Edi_Type] ne serait-elle pas redondante car déjà présente dans la table [Edition] ?
    Dans votre MLD, oui, mais pas dans le mien, car dans mon MCD l’entité-type Edition est dépourvue de cet attribut.
     
    Citation Envoyé par almoha
    je ne suis pas sûr de saisir ce que recoupe la notion de "types d'édition" dans la table [EditionType]
     
    Le temps ayant passé, je ne sais plus à quelle règle de gestion cela correspond... Si j’en ai le temps, je repasserai en revue vos règles figurant dans le
    post #53. En attendant, faisons comme si cette partie n’existait pas, jusqu’à ce que le besoin s’en fasse sentir...
    (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. #64
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    394
    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 : 394
    Par défaut
    Bonjour fsmrel,

    Durant le mois écoulé, j’ai continué à réfléchir sur le sujet. J’ai un peu aménagé le MCD :

    - Simplification de la partie relative aux éditions "enfants et parents" des éditions possédées. J’ai opté pour une seule relation réflexive « connecter ». En effet il m’importe seulement de déterminer si une édition est "connectée" à une ou plusieurs autres éditions. C’est le cas si elles se rattachent toutes à la même œuvre et si elles sont toutes possédées (quelle que soit la nature du lien les unissant).

    - Ajout des concepts de langue et de traduction :
    1. Une œuvre est écrite dans une seule langue originale.
    2. Une œuvre peut être traduite dans 0, 1 ou plusieurs langues. Une traduction concerne une seule œuvre et une seule langue.
    3. Une édition est publiée dans une seule langue. Je ne souhaite pas gérer les éditions bilingues.
    4. Un contributeur peut participer à 1 ou à plusieurs éditions. Une édition peut impliquer 1 à plusieurs contributeurs.
    5. Chaque contribution d'un contributeur à une édition est associée à un type de contribution.
    6. Un contributeur peut participer à 0,1 ou à plusieurs traductions. Une traduction peut impliquer 0 à plusieurs contributeurs.

    Le MCD correspondant :

    Nom : Biblio MCD Janv 2025.jpg
Affichages : 34
Taille : 103,5 Ko

    Le MLD textuel qui en découle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Editeur = (EditeurId SERIAL, EditeurNom VARCHAR(100) );
    Format = (FormatId SERIAL, FormatLibelle VARCHAR(100) );
    Contributeur = (ContributeurId SERIAL, ContributeurNom VARCHAR(100) );
    ContributionType = (ContributionTypeId SERIAL, ContributionTypeLibelle VARCHAR(100) );
    Langue = (Langueid SERIAL, CodeLangue CHAR(2) , NomLangue VARCHAR(100) );
    Oeuvre = (OeuvreId SERIAL, TitreOriginal VARCHAR(100) , #Langueid);
    Traduction = (#Langueid, #OeuvreId, TitreTraduit VARCHAR(255) );
    Edition = (#OeuvreId, EditionNumero SERIAL, AnneParution DATE, #Langueid, #EditeurId);
    EditionNonPossedee = (#(#OeuvreId, EditionNumero));
    EditionPossedee = (#(#OeuvreId, EditionNumero), ISBN13 VARCHAR(13) , EditionDateAchat DATE, #FormatId);
    Referencer = (#(#(#OeuvreId, EditionNumero)), #(#(#OeuvreId_1, EditionNumero_1)));
    Edi_Con = (#(#(#OeuvreId, EditionNumero)), #ContributeurId, #ContributionTypeId);
    connecter = (#(#(#OeuvreId, EditionNumero)), #(#(#OeuvreId_1, EditionNumero_1)));
    Tra_Con = (#ContributeurId, #(#Langueid, #OeuvreId));
    Le script PostgreSQL de création des tables :
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    CREATE TABLE Editeur(
       EditeurId SERIAL,
       EditeurNom VARCHAR(100)  NOT NULL,
       PRIMARY KEY(EditeurId),
       UNIQUE(EditeurNom)
    );
     
    CREATE TABLE Format(
       FormatId SERIAL,
       FormatLibelle VARCHAR(100)  NOT NULL,
       PRIMARY KEY(FormatId),
       UNIQUE(FormatLibelle)
    );
     
    CREATE TABLE Contributeur(
       ContributeurId SERIAL,
       ContributeurNom VARCHAR(100)  NOT NULL,
       PRIMARY KEY(ContributeurId)
    );
     
    CREATE TABLE ContributionType(
       ContributionTypeId SERIAL,
       ContributionTypeLibelle VARCHAR(100)  NOT NULL,
       PRIMARY KEY(ContributionTypeId),
       UNIQUE(ContributionTypeLibelle)
    );
     
    CREATE TABLE Langue(
       Langueid SERIAL,
       CodeLangue CHAR(2) ,
       NomLangue VARCHAR(100) ,
       PRIMARY KEY(Langueid)
    );
     
    CREATE TABLE Oeuvre(
       OeuvreId SERIAL,
       TitreOriginal VARCHAR(100)  NOT NULL,
       Langueid INTEGER NOT NULL,
       PRIMARY KEY(OeuvreId),
       FOREIGN KEY(Langueid) REFERENCES Langue(Langueid)
    );
     
    CREATE TABLE Traduction(
       Langueid INTEGER,
       OeuvreId INTEGER,
       TitreTraduit VARCHAR(255)  NOT NULL,
       PRIMARY KEY(Langueid, OeuvreId),
       FOREIGN KEY(Langueid) REFERENCES Langue(Langueid),
       FOREIGN KEY(OeuvreId) REFERENCES Oeuvre(OeuvreId)
    );
     
    CREATE TABLE Edition(
       OeuvreId INTEGER,
       EditionNumero SERIAL,
       AnneParution DATE,
       Langueid INTEGER NOT NULL,
       EditeurId INTEGER NOT NULL,
       PRIMARY KEY(OeuvreId, EditionNumero),
       FOREIGN KEY(OeuvreId) REFERENCES Oeuvre(OeuvreId),
       FOREIGN KEY(Langueid) REFERENCES Langue(Langueid),
       FOREIGN KEY(EditeurId) REFERENCES Editeur(EditeurId)
    );
     
    CREATE TABLE EditionNonPossedee(
       OeuvreId INTEGER,
       EditionNumero INTEGER,
       PRIMARY KEY(OeuvreId, EditionNumero),
       FOREIGN KEY(OeuvreId, EditionNumero) REFERENCES Edition(OeuvreId, EditionNumero)
    );
     
    CREATE TABLE EditionPossedee(
       OeuvreId INTEGER,
       EditionNumero INTEGER,
       ISBN13 VARCHAR(13) ,
       EditionDateAchat DATE,
       FormatId INTEGER NOT NULL,
       PRIMARY KEY(OeuvreId, EditionNumero),
       UNIQUE(ISBN13),
       FOREIGN KEY(OeuvreId, EditionNumero) REFERENCES Edition(OeuvreId, EditionNumero),
       FOREIGN KEY(FormatId) REFERENCES Format(FormatId)
    );
     
    CREATE TABLE Referencer(
       OeuvreId INTEGER,
       EditionNumero INTEGER,
       OeuvreId_1 INTEGER,
       EditionNumero_1 INTEGER,
       PRIMARY KEY(OeuvreId, EditionNumero, OeuvreId_1, EditionNumero_1),
       FOREIGN KEY(OeuvreId, EditionNumero) REFERENCES EditionPossedee(OeuvreId, EditionNumero),
       FOREIGN KEY(OeuvreId_1, EditionNumero_1) REFERENCES EditionNonPossedee(OeuvreId, EditionNumero)
    );
     
    CREATE TABLE Edi_Con(
       OeuvreId INTEGER,
       EditionNumero INTEGER,
       ContributeurId INTEGER,
       ContributionTypeId INTEGER,
       PRIMARY KEY(OeuvreId, EditionNumero, ContributeurId, ContributionTypeId),
       FOREIGN KEY(OeuvreId, EditionNumero) REFERENCES EditionPossedee(OeuvreId, EditionNumero),
       FOREIGN KEY(ContributeurId) REFERENCES Contributeur(ContributeurId),
       FOREIGN KEY(ContributionTypeId) REFERENCES ContributionType(ContributionTypeId)
    );
     
    CREATE TABLE connecter(
       OeuvreId INTEGER,
       EditionNumero INTEGER,
       OeuvreId_1 INTEGER,
       EditionNumero_1 INTEGER,
       PRIMARY KEY(OeuvreId, EditionNumero, OeuvreId_1, EditionNumero_1),
       FOREIGN KEY(OeuvreId, EditionNumero) REFERENCES EditionPossedee(OeuvreId, EditionNumero),
       FOREIGN KEY(OeuvreId_1, EditionNumero_1) REFERENCES EditionPossedee(OeuvreId, EditionNumero)
    );
     
    CREATE TABLE Tra_Con(
       ContributeurId INTEGER,
       Langueid INTEGER,
       OeuvreId INTEGER,
       PRIMARY KEY(ContributeurId, Langueid, OeuvreId),
       FOREIGN KEY(ContributeurId) REFERENCES Contributeur(ContributeurId),
       FOREIGN KEY(Langueid, OeuvreId) REFERENCES Traduction(Langueid, OeuvreId)
    );

    Ci-après un script d’insertion d’un jeu de données qui insère 4 œuvres :

    - 2 œuvres françaises :

    • Titre original « La fille de la nuit » : 2 éditions sont possédées, 1 en poche, 1 en grand format => la relation « connecter » est donc sollicitée ;
    • Titre original « Connemara » : 1 édition possédée (format poche) et 1 édition non possédée (éditeur grand format) => la relation « referencer » est donc sollicitée.

    - 2 œuvres étrangères :

    • Titre original « San Ti » : 1 édition possédée au format poche, traduite en français – titre traduit «Le problème à trois corps » ; 2 éditions non possédées : 1 édition traduite en français et 1 édition en version originale CH => la relation « referencer » est donc sollicitée ;
    • Titre original « Salem’s Lot » : 2 éditions possédées : 1 au format poche, traduite en français – titre traduit «Salem », et 1 au format poche édition originale EN => la relation « connecter » est donc sollicitée ; 1 édition non possédée : édition en version originale EN => la relation « referencer » est donc sollicitée.

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    INSERT INTO editeur (editeurid, editeurnom) VALUES (1, 'Le Livre de Poche');
    INSERT INTO editeur (editeurid, editeurnom) VALUES (2, 'Le Masque');
    INSERT INTO editeur (editeurid, editeurnom) VALUES (3, 'Babel');
    INSERT INTO editeur (editeurid, editeurnom) VALUES (4, 'Actes Sud');
    INSERT INTO editeur (editeurid, editeurnom) VALUES (5, 'Chongqing');
    INSERT INTO editeur (editeurid, editeurnom) VALUES (6, 'Presses Pocket');
    INSERT INTO editeur (editeurid, editeurnom) VALUES (7, 'Alta');
    INSERT INTO editeur (editeurid, editeurnom) VALUES (8, 'New English Library');
    INSERT INTO editeur (editeurid, editeurnom) VALUES (9, 'DoubleDay');
     
     
    INSERT INTO langue (langueid, codelangue, nomlangue) VALUES (1, 'FR', 'Français');
    INSERT INTO langue (langueid, codelangue, nomlangue) VALUES (8, 'ZH', 'Chinois');
    INSERT INTO langue (langueid, codelangue, nomlangue) VALUES (9, 'EN', 'Anglais');
     
     
    INSERT INTO oeuvre (oeuvreid, titreoriginal, langueid) VALUES (1, 'La fille de la nuit', 1);
    INSERT INTO oeuvre (oeuvreid, titreoriginal, langueid) VALUES (2, 'Connemara', 1);
    INSERT INTO oeuvre (oeuvreid, titreoriginal, langueid) VALUES (9, 'San Ti', 8);
    INSERT INTO oeuvre (oeuvreid, titreoriginal, langueid) VALUES (10, 'Salem''s Lot', 9);
     
     
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (1, 1, '1996-01-01', 1, 2);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (1, 2, '2000-01-01', 1, 1);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (2, 1, '2022-01-01', 1, 4);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (2, 2, '2023-01-01', 1, 3);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (9, 1, '2006-01-01', 8, 5);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (9, 2, '2016-01-01', 1, 4);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (9, 4, '2018-01-01', 1, 3);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (10, 5, '1988-01-01', 1, 6);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (10, 6, '1977-01-01', 1, 7);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (10, 7, '1976-01-01', 9, 8);
    INSERT INTO edition (oeuvreid, editionnumero, anneparution, langueid, editeurid) VALUES (10, 8, '1975-01-01', 9, 9);
     
     
    INSERT INTO format (formatid, formatlibelle) VALUES (1, 'Poche');
    INSERT INTO format (formatid, formatlibelle) VALUES (2, 'Grand format');
    INSERT INTO format (formatid, formatlibelle) VALUES (3, 'Numérique');
     
     
    INSERT INTO editionpossedee (oeuvreid, editionnumero, isbn13, editiondateachat, formatid) VALUES (1, 1, '9782702478424', '2022-01-01', 2);
    INSERT INTO editionpossedee (oeuvreid, editionnumero, isbn13, editiondateachat, formatid) VALUES (1, 2, '9782253170075', '2023-01-01', 1);
    INSERT INTO editionpossedee (oeuvreid, editionnumero, isbn13, editiondateachat, formatid) VALUES (2, 2, '9782330178994', '2023-01-15', 1);
    INSERT INTO editionpossedee (oeuvreid, editionnumero, isbn13, editiondateachat, formatid) VALUES (9, 4, '9782330113551', '2024-01-15', 1);
    INSERT INTO editionpossedee (oeuvreid, editionnumero, isbn13, editiondateachat, formatid) VALUES (10, 5, '9782266029612', '1997-01-01', 1);
    INSERT INTO editionpossedee (oeuvreid, editionnumero, isbn13, editiondateachat, formatid) VALUES (10, 7, '9782266029613', '2020-01-01', 1);
     
     
    INSERT INTO connecter (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (1, 1, 1, 2);
    INSERT INTO connecter (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (1, 2, 1, 1);
    INSERT INTO connecter (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (10, 5, 10, 7);
    INSERT INTO connecter (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (10, 7, 10, 5);
     
     
    INSERT INTO contributeur (contributeurid, contributeurnom) VALUES (1, 'Serge Brussolo');
    INSERT INTO contributeur (contributeurid, contributeurnom) VALUES (2, 'Nicolas Mathieu');
    INSERT INTO contributeur (contributeurid, contributeurnom) VALUES (3, 'Jacques Nabil');
    INSERT INTO contributeur (contributeurid, contributeurnom) VALUES (10, 'Liu Cixin');
    INSERT INTO contributeur (contributeurid, contributeurnom) VALUES (11, 'Gwennaël Gaffric');
    INSERT INTO contributeur (contributeurid, contributeurnom) VALUES (12, 'Stephen King');
    INSERT INTO contributeur (contributeurid, contributeurnom) VALUES (13, 'Christiane Thiollier');
    INSERT INTO contributeur (contributeurid, contributeurnom) VALUES (14, 'Joan Bernard');
     
     
    INSERT INTO contributiontype (contributiontypeid, contributiontypelibelle) VALUES (1, 'Auteur');
    INSERT INTO contributiontype (contributiontypeid, contributiontypelibelle) VALUES (2, 'Traducteur');
    INSERT INTO contributiontype (contributiontypeid, contributiontypelibelle) VALUES (3, 'Illustrateur');
     
     
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (1, 1, 1, 1);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (1, 2, 1, 1);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (2, 2, 2, 1);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (1, 1, 3, 3);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (1, 2, 3, 3);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (9, 4, 10, 1);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (9, 4, 11, 2);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (10, 5, 12, 1);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (10, 5, 13, 2);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (10, 5, 14, 2);
    INSERT INTO edi_con (oeuvreid, editionnumero, contributeurid, contributiontypeid) VALUES (10, 7, 12, 1);
     
     
    INSERT INTO editionnonpossedee (oeuvreid, editionnumero) VALUES (2, 1);
    INSERT INTO editionnonpossedee (oeuvreid, editionnumero) VALUES (9, 1);
    INSERT INTO editionnonpossedee (oeuvreid, editionnumero) VALUES (9, 2);
    INSERT INTO editionnonpossedee (oeuvreid, editionnumero) VALUES (10, 6);
    INSERT INTO editionnonpossedee (oeuvreid, editionnumero) VALUES (10, 8);
     
     
    INSERT INTO referencer (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (2, 2, 2, 1);
    INSERT INTO referencer (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (9, 4, 9, 1);
    INSERT INTO referencer (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (9, 4, 9, 2);
    INSERT INTO referencer (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (10, 5, 10, 6);
    INSERT INTO referencer (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (10, 5, 10, 8);
    INSERT INTO referencer (oeuvreid, editionnumero, oeuvreid_1, editionnumero_1) VALUES (10, 7, 10, 8);
     
     
    INSERT INTO traduction (langueid, oeuvreid, titretraduit) VALUES (1, 10, 'Salem');
    INSERT INTO traduction (langueid, oeuvreid, titretraduit) VALUES (1, 9, 'Le problème à trois corps');
     
     
    INSERT INTO tra_con (contributeurid, langueid, oeuvreid) VALUES (13, 1, 10);
    INSERT INTO tra_con (contributeurid, langueid, oeuvreid) VALUES (14, 1, 10);
    INSERT INTO tra_con (contributeurid, langueid, oeuvreid) VALUES (11, 1, 9);

    Une requête PostgreSQL d’affichage aux fins de test (obtenue avec l’aide d’un générateur) qui montre toutes les données, avec les éditions et leurs liens éventuels :
    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
    SELECT 
        o.OeuvreId AS "ID Oeuvre",
        o.TitreOriginal AS "Titre Original",
    	t.TitreTraduit AS "Titre Traduit",
        l.CodeLangue AS "Langue Originale",
        l.NomLangue AS "Nom Langue Originale",
        e.EditionNumero AS "Numéro Edition",
        e.AnneParution AS "Année Parution",
        l2.CodeLangue AS "Langue Edition",
        l2.NomLangue AS "Nom Langue Edition",
        ed.EditeurNom AS "Nom Editeur",
        ep.ISBN13 AS "ISBN",
        ep.EditionDateAchat AS "Date Achat",
        f.FormatLibelle AS "Format",
    (
        SELECT STRING_AGG(
            contrib_info,
            '; '
            ORDER BY sort_order, contrib_info
        )
        FROM (
            SELECT DISTINCT ON (c.ContributeurNom, ct.ContributionTypeLibelle)
                CONCAT(c.ContributeurNom, ' (', ct.ContributionTypeLibelle, ')') AS contrib_info,
                CASE 
                    WHEN ct.ContributionTypeLibelle = 'Auteur' THEN 1
                    WHEN ct.ContributionTypeLibelle = 'Traducteur' THEN 2
                    ELSE 3
                END AS sort_order
            FROM Edi_Con ec
            JOIN Contributeur c ON ec.ContributeurId = c.ContributeurId
            JOIN ContributionType ct ON ec.ContributionTypeId = ct.ContributionTypeId
            WHERE ec.OeuvreId = o.OeuvreId AND ec.EditionNumero = e.EditionNumero
            ORDER BY c.ContributeurNom, ct.ContributionTypeLibelle, sort_order
        ) subquery
    ) AS "Nom Contributeur"
    ,
        CASE 
            WHEN ep.OeuvreId IS NOT NULL THEN 'possédée'
            ELSE 'non possédée'
        END AS "Statut",
        COALESCE(cn1.OeuvreId_1, cn2.OeuvreId) AS "Connecté vers OeuvreId",
        COALESCE(cn1.EditionNumero_1, cn2.EditionNumero) AS "Connecté vers EditionNumero",
        STRING_AGG(
            DISTINCT 
            CONCAT(r1.OeuvreId_1, '-', r1.EditionNumero_1),
            '; '
        ) AS "referencevers",
        STRING_AGG(
            DISTINCT 
            CONCAT(r2.OeuvreId, '-', r2.EditionNumero),
            '; '
        ) AS "referencesource"
     
    FROM Edition e
    LEFT JOIN EditionPossedee ep ON e.OeuvreId = ep.OeuvreId AND e.EditionNumero = ep.EditionNumero
    LEFT JOIN Oeuvre o ON e.OeuvreId = o.OeuvreId
    LEFT JOIN Langue l ON o.LangueId = l.LangueId
    LEFT JOIN Langue l2 ON e.LangueId = l2.LangueId
    LEFT JOIN Editeur ed ON e.EditeurId = ed.EditeurId
    LEFT JOIN Format f ON ep.FormatId = f.FormatId
    LEFT JOIN Connecter cn1 ON e.OeuvreId = cn1.OeuvreId AND e.EditionNumero = cn1.EditionNumero
    LEFT JOIN Connecter cn2 ON e.OeuvreId = cn2.OeuvreId_1 AND e.EditionNumero = cn2.EditionNumero_1
    LEFT JOIN Traduction t ON o.OeuvreId = t.OeuvreId AND t.LangueId = l2.LangueId
    LEFT JOIN Referencer r1 ON r1.OeuvreId = ep.OeuvreId AND r1.EditionNumero = ep.EditionNumero
    LEFT JOIN Referencer r2 ON r2.OeuvreId_1 = e.OeuvreId AND r2.EditionNumero_1 = e.EditionNumero
    GROUP BY 
        o.OeuvreId, o.TitreOriginal, l.CodeLangue, l.NomLangue, e.EditionNumero, 
        e.AnneParution, l2.CodeLangue, l2.NomLangue, ed.EditeurNom, ep.ISBN13, 
        ep.EditionDateAchat, f.FormatLibelle, ep.OeuvreId, cn1.OeuvreId_1, 
        cn1.EditionNumero_1, cn2.OeuvreId, cn2.EditionNumero, t.TitreTraduit
    ORDER BY o.OeuvreId, e.EditionNumero;

    Pour le concept de traduction, je m'aperçois que la modélisation ne gère pas le cas où une œuvre fait l'objet de deux éditions dont chacune est traduite par un traducteur différent. Je pense qu'il faudrait que la clé composite de la table Traduction devienne (Langueid, OeuvreId, EditionNumero). A votre avis, comment adapter le MCD pour ce faire ? Je suis également preneur de toutes autres remarques. Merci.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Mld pour inventaire livre
    Par cold-apok dans le forum Schéma
    Réponses: 1
    Dernier message: 25/09/2007, 02h42
  2. [langage] Je cherche un bon livre ?
    Par Anonymous dans le forum Langage
    Réponses: 13
    Dernier message: 09/04/2003, 14h16
  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, 16h35
  4. Réponses: 2
    Dernier message: 17/03/2002, 20h00

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