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 :

Modélisation propriétaire-ancien propriétaire


Sujet :

Schéma

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Modélisation propriétaire-ancien propriétaire
    Bonjour à tous, je travaille actuellement sur un MCD se rapportant à une galerie d'art. Or, j'ai un petit problème, je dois traduire sur le MCD la phrase suivante "la galerie conserve les informations sur le propriétaire actuel et sur tous les anciens propriétaires d'un tableau"
    j'ai une entité tableau, une entité propriétaire, une entité ancien propriétaire ainsi qu'une une classe d'association "posseder" entre propriétaire et tableau.
    Comment modéliser le fait qu'un tableau a appartenu a un (ou plus)ancien propriétaire et que ce dernier l'a ensuite transmis au propriétaire actuel?
    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 17
    Points : 14
    Points
    14
    Par défaut
    Bonjour bobharris,

    Je suis débutant sur Merise mais je pesne avoir une petite idée.

    Tu pourrais peut-être relier à "Posséder" un entité contenant la date d'acquisition du tableau.
    Sur le MLD ça se traduirait par une table associative contenant l'ID_TABLEAU, l'ID_PROPRIETAIRE et la DATE_ACQUISITION.

    De cette façon, il est possible de connaître tout l'historique des propriétaires pour un tableau donné.

    Je me trompe ?

    Luis

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 902
    Points : 6 026
    Points
    6 026
    Par défaut
    C'est en effet une solution (relation porteuse d'attributs).

    On pourra s'interroger sur la pertinence d'un attribut date_vente permettant de retrouver immédiatement le propriétaire actuel (colonne non valorisée=null) plutôt qu'en cherchant la valeur maximum de DATE_ACQUISITION pour un tableau donné.

    Elle permet également de supprimer l'entité "ancien proprietaire" si elle ne sert pas à autre chose.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses. Il faudrait que les informations relatives au propriétaite actuel et aux anciens propriétaitres soient conservées pour chaque tableau, donc une entité ancien propriétaire semble indispensable non?

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Non. Avec le principe décrit par MikeMeilleur et qi130, tous les propriétaires (anciens et actuels) sont dans la même entité/table et c'est la date d'acquisition maxi qui permet de retrouver le dernier propriétaire connu.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,

    Citation Envoyé par qi130 Voir le message
    On pourra s'interroger sur la pertinence d'un attribut date_vente permettant de retrouver immédiatement le propriétaire actuel (colonne non valorisée=null) plutôt qu'en cherchant la valeur maximum de DATE_ACQUISITION pour un tableau donné.
    Hum... Vous connaissez ma position quant au bonhomme NULL.

    Nous savons que passer par l’opérateur MAX est plus ou moins performant selon le SGBD, mais pour des raisons de symétrie, on peut être amené à rechercher le plus ancien propriétaire du tableau, auquel cas il suffit de remplacer MAX par MIN, alors qu’avec la date de vente on serait contraint aussi de passer par MIN.

    => Aller dans le sens de CinePhil.

    Un MCD possible :


    MLD correspondant :




    Code SQL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE TABLEAU (
       TableauId            INT                  NOT NULL,
       TableauNom           VARCHAR(48)          NOT NULL,
       Etc                  VARCHAR(48)          NOT NULL,
       Constraint TABLEAU_PK PRIMARY KEY  (TableauId)
    ) ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE PROPRIETAIRE (
       ProprioId            INT                  NOT NULL,
       ProprioNom           VARCHAR(48)          NOT NULL,
       Etc                  VARCHAR(48)          NOT NULL,
       Constraint PROPRIETAIRE_PK PRIMARY KEY  (ProprioId)
    ) ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE ACQUISITION (
       TableauId            INT                  NOT NULL,
       ProprioId            INT                  NOT NULL,
       DateAcquisition      DATE                 NOT NULL,
       Constraint ACQUISITION_PK PRIMARY KEY (TableauId, ProprioId, DateAcquisition),
       Constraint ACQUISITION_TABLEAU_FK FOREIGN KEY (TableauId)
          REFERENCES Tableau (TableauId),
       Constraint ACQUISITION_PROPRIETAIRE_FK FOREIGN KEY (ProprioId)
          REFERENCES PROPRIETAIRE (ProprioId)
    ) ;

    Un jeu d’essai :

    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
    INSERT INTO TABLEAU VALUES (1, 'Le Café de Paris', 'Jean Béraud') ;
    INSERT INTO TABLEAU VALUES (2, 'L’Avocat de Village', 'Pieter Brueghel le Jeune') ;
    INSERT INTO TABLEAU VALUES (3, 'Les Noces Villageoises', 'Pieter Brueghel le Jeune') ;
    INSERT INTO TABLEAU VALUES (4, 'Autoportrait', 'Antoine van Dyck') ;
    INSERT INTO TABLEAU VALUES (5, 'La Famille Lomellini', 'Antoine van Dyck') ;
    INSERT INTO TABLEAU VALUES (6, 'Autoportrait', 'Jean Béraud') ;
     
    INSERT INTO PROPRIETAIRE VALUES (1, 'CinepPhil', 'Collectionneur éclairé') ;
    INSERT INTO PROPRIETAIRE VALUES (2, 'qi130', 'Expert confirmé senior') ;
    INSERT INTO PROPRIETAIRE VALUES (3, 'bobharris', 'galeriste') ;
    INSERT INTO PROPRIETAIRE VALUES (4, 'DVP', 'Mâtin, quels forums') ;
    INSERT INTO PROPRIETAIRE VALUES (5, 'fsmrel', 'brocanteur') ;
     
    INSERT INTO ACQUISITION VALUES (3, 3, '1995-01-15') ;
    INSERT INTO ACQUISITION VALUES (3, 2, '1997-03-24') ;
    INSERT INTO ACQUISITION VALUES (3, 1, '2005-12-31') ;
    INSERT INTO ACQUISITION VALUES (3, 4, '2010-08-12') ;
    INSERT INTO ACQUISITION VALUES (3, 2, '2010-10-01') ;
    INSERT INTO ACQUISITION VALUES (3, 5, '2010-11-07') ;
     
    INSERT INTO ACQUISITION VALUES (1, 3, '1995-01-15') ;
    INSERT INTO ACQUISITION VALUES (1, 4, '2004-02-29') ;
     
    INSERT INTO ACQUISITION VALUES (5, 5, '1990-07-14') ;
     
    INSERT INTO ACQUISITION VALUES (2, 1, '1999-12-31') ;
    INSERT INTO ACQUISITION VALUES (2, 3, '2000-01-01') ;


    Recherche du dernier acquéreur d’un tableau donné.
    Qui est le dernier acquéreur des 'Noces Villageoises de Brueghel ?
    Exemple avec MySQL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT x.ProprioNom, MAX(y.DateAcquisition) 
    FROM   PROPRIETAIRE AS x 
           JOIN ACQUISITION AS y 
               ON x.ProprioId = y.ProprioId
           JOIN TABLEAU AS z
               ON y.TableauId = z.TableauId
    WHERE  z.TableauNom = 'Les Noces Villageoises'
      AND  z.Artiste = 'Pieter Brueghel le Jeune' ;

    Si on utilise SQL Server 2008 qui rejette cette requête, on peut utiliser quelque chose du genre :

    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
    SELECT x.ProprioNom, y.DateAcquisition 
    FROM   PROPRIETAIRE AS x JOIN ACQUISITION AS y 
               ON x.ProprioId = y.ProprioId
           JOIN TABLEAU AS z
               ON y.TableauId = z.TableauId
    WHERE  z.TableauNom = 'Les Noces Villageoises'
      AND  z.Artiste = 'Pieter Brueghel le Jeune'
      AND  y.DateAcquisition =   
                 SELECT MAX(y.DateAcquisition)
                 FROM   PROPRIETAIRE AS x JOIN ACQUISITION AS y 
                           ON x.ProprioId = y.ProprioId
                        JOIN TABLEAU AS z
                           ON y.TableauId = z.TableauId
                 WHERE  z.TableauNom = 'Les Noces Villageoises'
                   AND  z.Artiste = 'Pieter Brueghel le Jeune') ;

    Requête que les spécialistes de SQL Server sauront améliorer.

    Quoi qu’il en soit, pour retrouver le plus ancien propriétaire su tableau, il suffit de remplacer l’opérateur MAX par l’opérateur MIN.

    Immanquablement, on en arrive à poser des questions du genre :
    Qui était possesseur de tel tableau à telle date ?
    Exemple de requête (l’opérateur MIN n’est pas inintéressant) :
    Qui possédait Les Noces villageoises de Brueghel au 1er janvier 1996 ?
    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
    SELECT x.ProprioNom, y.DateAcquisition 
    FROM   PROPRIETAIRE AS x JOIN ACQUISITION AS y 
               ON x.ProprioId = y.ProprioId
           JOIN TABLEAU AS z
               ON y.TableauId = z.TableauId
    WHERE  z.TableauNom = 'Les Noces Villageoises'
      AND  z.Artiste = 'Pieter Brueghel le Jeune'
      AND  y.DateAcquisition =   
               (SELECT MIN(y.DateAcquisition)
                FROM   PROPRIETAIRE AS x JOIN ACQUISITION AS y 
                           ON x.ProprioId = y.ProprioId
                       JOIN TABLEAU AS z
                           ON y.TableauId = z.TableauId
                WHERE  z.TableauNom = 'Les Noces Villageoises'
                  AND  z.Artiste = 'Pieter Brueghel le Jeune'          
                  AND  y.DateAcquisition > '1996-01-01') ;

    Les spécialistes SQL amélioreront ce code...
    (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.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour cette réponse ultra complète! j'y vois plus clair maintenant!
    autre petite question: est ce possible d'avoir une relation ternaire réflexive?

    j'ai l'entité TABLEAU liée à une entité EXPOSITION par l'association PRETER.
    avec les cardinalités 0,n et 1,n

    j'aimerais qu'on garde une trace de la situation où plusieurs tableaux aient été associés dans une même expo. ma première idée était de faire une association réflexive ASSOCIER sur l'entité TABLEAU, classe d'association également ratachée à l'entité EXPO, le tout sur du 0,n
    Est-ce raisonnable?

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Les associations-types réflexives sont faites pour traiter des généalogies, des hiérarchies, des nomenclatures (une aile d’avion est composée d’ailerons qui à leur tour sont composés de charnières, rivets etc., de longerons, etc.), c'est-à-dire de toutes ces choses à caractère récursif.

    S’il s’agit seulement de savoir quels tableaux ont été exposés ensemble, on n’est pas dans cette logique. A moins que quelque chose m’ait échappé, je verrais les choses ainsi :

    MCD :



    L’entité-type EXPOSITION décrit les éléments invariants d’une exposition.
    L’entité-type EXPO_EDITION décrit les éléments d’une exposition qui varient dans le temps. Cette entité-type est une déclinaison de la précédente, c’est une entité-type « faible » et elle est identifiée relativement (cf. la clé primaire de la table qui en est issue). Avec Power AMC, l’identification relative est symbolisée par la mise entre parenthèses de la cardinalité 1,1 portée par la patte connectant EXPOSITION et EXPO_EDITION. L’exemple typique de l’identification relative est celui des factures et des lignes de facture.


    MLD :



    D’où le code SQL complétant celui déjà fourni :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE EXPOSITION (
       ExpoId               INT                  NOT NULL,
       ExpoNom              VARCHAR(48)          NOT NULL,
       Etc                  VARCHAR(48)          NOT NULL,
       CONSTRAINT EXPOSITION_PK PRIMARY KEY (ExpoId)) ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE EXPO_EDITION (
       ExpoId               INT                  NOT NULL,
       EditionId            INT                  NOT NULL,
       ExpoDebut            DATE                 NOT NULL,
       ExpoFin              DATE                 NOT NULL,
       Notes                VARCHAR(48)          NOT NULL,
       CONSTRAINT EXPO_EDITION_PK PRIMARY KEY (ExpoId, EditionId),
       CONSTRAINT EXPO_EDITION_FK FOREIGN KEY (ExpoId)
          REFERENCES EXPOSITION (ExpoId)) ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE PRET (
       TableauId            INT                  NOT NULL,
       ExpoId               INT                  NOT NULL,
       EditionId            INT                  NOT NULL,
       Notes                VARCHAR(48)          NOT NULL,
       CONSTRAINT PRET_PK PRIMARY KEY (TableauId, ExpoId, EditionId),
       CONSTRAINT PRET_TABLEAU_FK FOREIGN KEY (TableauId)
          REFERENCES TABLEAU (TableauId),
       CONSTRAINT PRET_EXPO_FK FOREIGN KEY (ExpoId, EditionId)
          REFERENCES EXPO_EDITION (ExpoId, EditionId)) ;

    Un début de jeu d’essai :

    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
    INSERT INTO EXPOSITION VALUES (1, 'Salon des développeurs', 'créé en 2002 par Untel et Untel') ;
    INSERT INTO EXPOSITION VALUES (2, 'Salon des modérateurs ', 'vous y verrez des drôles de choses') ;
    INSERT INTO EXPOSITION VALUES (3, 'Salon du Relationland', 'En hommage à Lewis Carroll') ;
    INSERT INTO EXPOSITION VALUES (4, 'Salon du SQLland', 'La tératologie informatique') ;
     
    INSERT INTO EXPO_EDITION VALUES (1, 1, '1998-10-01', '1998-10-30', 'Rien à signaler') ;
    INSERT INTO EXPO_EDITION VALUES (1, 2, '2010-07-01', '2010-10-31', 'Que de monde !') ;
    INSERT INTO EXPO_EDITION VALUES (4, 1, '2010-08-01', '2010-11-30', '') ;
    INSERT INTO EXPO_EDITION VALUES (3, 1, '2009-01-01', '2009-01-15', 'Il faisait froid') ;
    INSERT INTO EXPO_EDITION VALUES (3, 2, '2010-01-01', '2010-01-31', 'Tout baigne') ;
     
    INSERT INTO PRET VALUES (3, 1, 1, 'Rien à signaler') ;
    INSERT INTO PRET VALUES (2, 1, 1, 'Rien à signaler') ;
    INSERT INTO PRET VALUES (3, 1, 2, 'Fort prisé') ;
    INSERT INTO PRET VALUES (1, 1, 2, 'Mal situé') ;
    INSERT INTO PRET VALUES (2, 1, 2, 'Rien à signaler') ;
    INSERT INTO PRET VALUES (3, 3, 1, 'Attention au radiateur') ;
    INSERT INTO PRET VALUES (3, 3, 2, 'OK') ;


    Quels tableaux ont été exposés ensemble lors de l'édition 2010 du salon des développeurs ?


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  x.TableauNom, x.Artiste, y.Notes 
    FROM    TABLEAU AS x JOIN PRET AS y
                ON x.TableauId = y.TableauId
            JOIN EXPO_EDITION AS z
                ON y.ExpoId = z.ExpoId
               AND y.EditionId = z.EditionId
            JOIN EXPOSITION AS t
                ON z.ExpoId = t.ExpoId
    WHERE   t.ExpoNom = 'Salon des développeurs'
      AND   YEAR(z.ExpoDebut) = 2010 ;

    Réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TableauNom               Artiste                    Notes
    ----------------------   ------------------------   ---------------
    Le Café de Paris         Jean Béraud                Mal situé
    L’Avocat de Village      Pieter Brueghel le Jeune   Rien à signaler
    Les Noces Villageoises   Pieter Brueghel le Jeune   Fort prisé
    (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.

  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 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par bobharris Voir le message
    je ne comprends pas trop le "CIF". C'est pour contrainte d'intégrité fonctionnelle? je n'arrive pas à voir quel est le lien
    CIF est effectivement l’abréviation de « Contrainte d’intégrité fonctionnelle ». Il s’agit d’une contrainte d’unicité, dont la définition varie d’un auteur à l’autre. Par exemple, selon la FAQ Merise, la CIF n’est à utiliser que dans le cas des associations-types ternaires. L’auteur de cette rubrique consacrée à la CIF est Dominique Nanci, l’un des pères de Merise. Cela dit, dans l’ouvrage de référence commis par ses amis Tardieu, Rochfeld et Colletti : La Méthode Merise, Tome 1, Principes et outils , on trouve des cas d’utilisation de la CIF avec des associations-types binaires, par exemple celui-ci :



    Dans cet exemple, la CIF exprime non seulement une contrainte d’unicité (une police fait référence à un seul assuré) mais aussi le fait qu’il ne peut pas y avoir de changement de référence, une police ne peut pas changer d’assuré, c’est « à la vie à la mort ». De son côté, la DF (Dépendance Fonctionnelle) exprime aussi une contrainte d’unicité, mais le changement de référence est possible : au fil du temps, l’agent qui s’occupe d’une police donnée n’est pas forcément toujours le même. La différence entre CIF et DF est donc caractérisée par un critère de stabilité dans le temps.

    Une question à titre d’exemple : Une salle d’exposition peut-elle changer de bâtiment ?

    Dans mon message précédent, j’avais évoqué la CIF à propos des factures et lignes de facture. En effet, entre une facture et ses lignes, c’est évidemment à la vie à la mort.

    J’avais aussi parlé des données invariantes d’une exposition par opposition aux données qui changent dans le temps, et avais défini deux entités-types à cet effet : EXPOSITION et EXPO_EDITION, mais après tout, votre représentation convient, à savoir le triplet :
    [TABLEAU]---0,N---(PRETER)---1,N---[EXPOSITION]

    Une observation : selon votre MCD, un tableau peut n’être prêté qu’une fois dans sa vie. Est-ce bien ce que vous voulez signifier ?


    Citation Envoyé par bobharris Voir le message
    Ne reste donc plus qu'à traduire sur le schéma "des expositions mettent en relation plusieurs tableaux"
    Si c'est bien la relation PRETER qui est impliquée, la solution figure en principe dans mon message précédent (voyez le jeu d’essai et la requête SQL qui est évidemment à aménager du fait de la disparition de la table EXPO_EDITION) :
    Citation Envoyé par fsmrel Voir le message
    Quels tableaux ont été exposés ensemble lors de l'édition 2010 du salon des développeurs ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TableauNom               Artiste                    Notes
    ----------------------   ------------------------   ---------------
    Le Café de Paris         Jean Béraud                Mal situé
    L’Avocat de Village      Pieter Brueghel le Jeune   Rien à signaler
    Les Noces Villageoises   Pieter Brueghel le Jeune   Fort prisé


    Citation Envoyé par bobharris Voir le message
    "et quand ils sont gérés par la galerie, celle -ci souhaite en garder une trace"
    Qu’entendez-vous par « gérés » ? Voulez-vous dire qu’il s’agit des tableaux impliqués à l'occasion des expositions organsinées par votre galerie ? Par les diverses galeries ? Merci de rendre plus explicite votre propos. Je ne suis pas très au fait de l'organisation des expositions...

    N.B. Quand le MCD sera stabilisé, il y aura des contraintes à prévoir, pour s'assurer que le propriétaire qui confie un tableau pendant une période donnée est bien propriétaire du tableau à ce moment-là. De même, on doit s'assurer qu'un tableau exposé pendant une période dans une salle a bien été prêté pendant cette période.

    A suivre...
    (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.

  10. #10
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    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 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Je ne sais pas ce qui s’est passé, mais votre message comportant les précisions que vous aviez apportées à ma demande a disparu. L'auriez-vous supprimé ? Je réponds quand même.

    Je pensais changer la cardinalité entre Tableau et Confier pour du 1,n. Est-ce de cela que vous vouliez parler?
    Oui.


    En fait la galerie se voit confier des tableaux par les propriétaires, et se charge donc de les gérer pendant ce laps de temps (exposition en salle ou prêt à des expositions); Ce que je voulais donc dire c'est qu'on voudrait garder une trace du fait que deux tableaux aient été associés dans une même exposition pendant le laps de temps où la galerie doit 'en occuper. (Cela ne concerne donc plus deux tableaux qui ont été récupérés par les propriétaires)
    Quand vous dites : « exposition en salle ou prêt à des expositions », j’interprète le « ou » comme étant exclusif : quand un tableau est exposé, il ne peut pas l’être simultanément dans une salle de la galerie, et hors les murs, à l’occasion d’un prêt que fait la galerie, par exemple à un musée. Donc, quand je parlais de contraintes à mettre en place, cela a trait notamment à ce genre de situation, en effet, nous ne nous situons pas dans un univers quantique...

    J’en reviens maintenant à votre 1er problème :

    Citation Envoyé par bobharris Voir le message
    Ne reste donc plus qu'à traduire sur le schéma "des expositions mettent en relation plusieurs tableaux"
    Concernant les prêts, j’avais considéré le problème comme résolu, mais j’y reviendrai, car les périodes pendant lesquelles les tableaux sont exposés sont à prendre en compte.

    Pour changer un peu, traitons des tableaux exposés dans les salles (de la galerie je suppose) ? Je pars de l’hypothèse qu’on en reste au niveau de la galerie, donc qu’on ne descend pas au niveau des bâtiments et des salles. Je pars aussi de l’hypothèse que si les dates d’entrée et de sortie dans la galerie (par le truchement des entrées/sorties en salles) ont au moins une journée en commun, les tableaux ont cohabité.

    Exemple :

    • Le désespéré de Courbet a séjourné dans la salle 4 du 10 janvier au 25 février 2001,
    • A questionable vintage de Charles Spencelayh a séjourné dans la salle 1 du 15 janvier au 23 janvier 2001, puis dans la salle 2 du 23 janvier au 28 janvier 2001, puis dans la salle 3 du 14 juillet au 14 août 2001,
    • Le sculpteur de Courbet a séjourné dans la salle 1 du 1er au 24 février 2001,
    • La Grande Baigneuse d’Ingres a séjourné dans la salle 2 du 1er juin au 24 août 2001.

    Avec l’ensemble de tables (dans lequel TABLEAU_SALLE correspond à votre entité-type Exposer) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE TABLEAU (
      TableauId INT NOT NULL,
      TableauNom VARCHAR(48) NOT NULL,
      Artiste VARCHAR(48) NOT NULL,
      PRIMARY KEY (TableauId)) ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE SALLE (
      SalleId INT NOT NULL,
      SalleNom VARCHAR(48) NOT NULL,
      PRIMARY KEY (SalleId)) ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLEAU_SALLE (
      TableauId INT NOT NULL,
      SalleId INT NOT NULL,
      DateEntree DATE NOT NULL,
      DateSortie DATE NOT NULL,
      PRIMARY KEY (TableauId, DateEntree), 
      CONSTRAINT TABLEAU_SALLE_TABLEAU_FK
        FOREIGN KEY (TableauId)
        REFERENCES TABLEAU (TableauId),
      CONSTRAINT TABLEAU_SALLE_SALLE_FK
        FOREIGN KEY (SalleId)
        REFERENCES SALLE (SalleId)) ;
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO TABLEAU VALUES (1, 'Le Café de Paris', 'Jean Béraud') ;
    INSERT INTO TABLEAU VALUES (2, 'L’Avocat de Village', 'Pieter Brueghel le Jeune') ;
    INSERT INTO TABLEAU VALUES (3, 'Les Noces Villageoises', 'Pieter Brueghel le Jeune') ;
    INSERT INTO TABLEAU VALUES (4, 'Autoportrait', 'Antoine van Dyck') ;
    INSERT INTO TABLEAU VALUES (5, 'La Famille Lomellini', 'Antoine van Dyck') ;
    INSERT INTO TABLEAU VALUES (6, 'Autoportrait', 'Jean Béraud') ;
    INSERT INTO TABLEAU VALUES (7, 'A questionable vintage', 'Charles Spencelayh') ;
    INSERT INTO TABLEAU VALUES (8, 'Le Désespéré', 'Gustave Courbet') ;
    INSERT INTO TABLEAU VALUES (9, 'Le Sculpteur', 'Gustave Courbet') ;
    INSERT INTO TABLEAU VALUES (10, 'La Grande Baigneuse', 'Jean-Baptiste Ingres') ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO SALLE VALUES (1, 'Salle Ingres') ;
    INSERT INTO SALLE VALUES (2, 'Salle Caillebotte') ;
    INSERT INTO SALLE VALUES (3, 'Salle Gauguin') ;

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO TABLEAU_SALLE VALUES (7, 1, '2001-01-25', '2001-02-28') ;
    INSERT INTO TABLEAU_SALLE VALUES (7, 2, '2001-07-14', '2001-08-14') ;
    INSERT INTO TABLEAU_SALLE VALUES (8, 1, '2001-01-10', '2001-02-25') ;
    INSERT INTO TABLEAU_SALLE VALUES (9, 1, '2001-02-01', '2001-02-24') ;
    INSERT INTO TABLEAU_SALLE VALUES (10, 2, '2001-06-01', '2001-08-24') ;

    Et avec, par exemple, la requête SQL suivante :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     SELECT z.TableauNom, z.Artiste, x.DateEntree, x.DateSortie
         , t.TableauNom, t.Artiste, y.DateEntree, y.DateSortie
    FROM   TABLEAU_SALLE AS x 
           JOIN  TABLEAU_SALLE AS y
           JOIN  TABLEAU AS z
           ON    x.TableauId = z.TableauId 
           JOIN  TABLEAU AS t
           ON    y.TableauId = t.TableauId 
    WHERE  x.DateEntree <= y.DateSortie 
      AND  x.DateSortie >= y.DateEntree
      AND  NOT (x.TableauId = y.TableauId AND x.SalleId = y.SalleId)
      AND  x.TableauId > y.TableauId ;

    On produit le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TableauNom           Artiste               DateEntree  DateSortie   TableauNom              Artiste             DateEntree  DateSortie   
    -------------------  --------------------  ----------  ----------   ----------------------  ------------------  ----------  ----------  
    Le Désespéré         Gustave Courbet       2001-01-10  2001-02-25   A questionable vintage  Charles Spencelayh  2001-01-15  2001-01-23
    Le Désespéré         Gustave Courbet       2001-01-10  2001-02-25   A questionable vintage  Charles Spencelayh  2001-01-25  2001-02-28
    Le Sculpteur         Gustave Courbet       2001-02-01  2001-02-24   A questionable vintage  Charles Spencelayh  2001-01-25  2001-02-28
    La Grande Baigneuse  Jean-Baptiste Ingres  2001-06-01  2001-08-24   A questionable vintage  Charles Spencelayh  2001-07-14  2001-08-14
    Le Sculpteur         Gustave Courbet       2001-02-01  2001-02-24   Le Désespéré            Gustave Courbet     2001-01-10  2001-02-25

    Question annexe : quel SGBD utilisez-vous (ou comptez utiliser) ?
    (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.

Discussions similaires

  1. Changement de propriétaire
    Par Florent PORRAS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/08/2004, 15h25
  2. [SmartCard] APDU => CLA propriétaire
    Par ludovic.fernandez dans le forum Développement
    Réponses: 3
    Dernier message: 29/04/2003, 14h13
  3. Propriétaire d'un fichier en NTFS
    Par numberwan dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2003, 08h22
  4. Propriétaire de dossier
    Par mixi dans le forum Langage
    Réponses: 4
    Dernier message: 23/01/2003, 14h15
  5. Réponses: 2
    Dernier message: 26/06/2002, 13h16

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