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 :

Expliciter un évenement périodique dans un MCD


Sujet :

Schéma

  1. #41
    Membre à l'essai
    Inscrit en
    Juin 2013
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour Fsmrel,

    Citation Envoyé par fsmrel Voir le message
    Les résultats sont-ils conformes à ce que vous attendez ?
     
    Merci pour tous ces tests, on avance assurément dans le bon sens ! Je trouve dans vos réponses de nombreux éléments qui me rassurent pour le développement à venir de ma BDD. Et les méthodes "pas bourrin", bien que plus longues, sont également plus élégantes et fiables à mon sens Pour le test que vous avez développé, quelques points attirent mon attention :

    Citation Envoyé par fsmrel Voir le message
    (2) AFFECTATION_HISTO

    Situation initiale, concernant l’appareil 11 à remplacer :

    id_appareil   affectation_date_debut   affectation_date_fin   id_site
    -----------   ----------------------   --------------------   -------
    11            2010-02-01               2010-11-30             1
    11            2010-12-01               2015-03-31             2
    11            2015-04-01               2017-10-31             1
    11            2017-11-01               2019-05-31             1
    
    On peut voir ici que les 2 derniers tuples représentent, pour un même appareil, 2 périodes exactement successives au cours desquelles il se trouve sur un même site. J'imagine que cette situation ne devrait pas se présenter conformément à la 6è forme normale, et que ces 2 tuples devraient être "Packées" (?) Cela ne pose pas de problème dans le cadre de ce test mais je voulais m'assurer que j'avais bien compris le cours sur la 6è forme normale.



    Par ailleurs, nous nous trouvons dans une situation où - pour un appareil donné - toutes les dates mises bout-à-bout forment une continuité temporelle. Dans les faits, un appareil peut être remisé (hors site) pour x raison (réparation, étalonnage, réformé, ...). Est-il alors plus propre de créer un id_site décrivant le lieu de remise de l'appareil pour garder (et documenter) cette continuité temporelle, ou n'y a t-il aucune contre-indication à avoir des ruptures entre une affectation_date_fin et l'affectation_date_début suivante ?
    Actuellement l'option "discontinuités" est plus proche de ce qui est appliqué, mais l'option plus documentée ouvre des perspectives intéressantes !



    Mon dernier questionnement n'est pas des moindres et revient sur mon interrogation en fin de post #36
    Citation Envoyé par NAGOL Voir le message
    Je reçois des mesures en continu, stockées dans MESURER. Parfois, ces mesures me viennent avant même de savoir si un appareil a été changé (même marque, même modèle, ... simplement un autre exemplaire si le premier est en panne par exemple). Dans les faits, cela n'affecte pas la mesure. Celle-ci est par contre attribuée à un id_appareil qui n'est plus actif sur le site...
    Me sera t-il possible, après réception de la mesure, d'effectuer un update pour :
    1/ ajouter le nouvel "id_appareil" à APPAREIL, avec sa vraie date "affectation_date_debut"
    2/ lui attribuer rétroactivement les dernières mesures associées (à tort) à l'ancien appareil "id_appareil" dans MESURER (vu qu'on connait désormais "affectation_date_debut" du nouvel appareil)
    3/ archiver l'ancien "id_appareil" dans AFFECTATION_HISTO, sans perdre les mesures qui lui étaient associées avant l'affectation du nouvel appareil.
    Votre test confirme que l'étape 1/ est tout à fait réalisable. Néanmoins, suffit-il pour dire que les points 2/ et 3/ sont aussi validés dans votre résultat cité ci-dessous, soit :
    - les mesures stockées dans la relvar "MESURER "qui ont été prises avant le 01/04/2015 restent bien affectées au "bac à neige 001" (= appareil 11),
    - et que les mesures (stockées dans "MESURER") prises à partir du 01/04/2015 sont désormais affectées au "bac à neige 099" (= appareil 99) (alors qu'elles restaient initialement affectées à l'appareil 11 jusqu'au 31/05/2019, avant mise à jour) ?

    Citation Envoyé par fsmrel Voir le message
    Au résultat

    type_appareil    num_appareil    debut         fin           nom_site
    bac à neige      001             2010-12-01    2015-03-31    site 002
    bac à neige      001             2010-02-01    2010-11-30    site 001
    bac à neige      031             2019-02-01    9999-12-31    site 003
    bac à neige      031             2016-11-01    2019-01-31    site 001
    bac à neige      031             2014-04-01    2016-10-31    site 001
    bac à neige      031             2012-12-01    2014-03-31    site 002
    bac à neige      031             2007-02-01    2012-11-30    site 001
    bac à neige      099             2019-06-01    9999-12-31    site 002
    bac à neige      099             2017-11-01    2019-05-31    site 001
    bac à neige      099             2015-04-01    2017-10-31    site 001
    gouttière        001             2019-04-01    9999-12-31    site 002
    gouttière        001             2018-11-01    2019-03-31    site 001
    gouttière        001             2014-04-01    2018-10-31    site 001
    gouttière        001             2012-12-01    2014-03-31    site 002
    gouttière        001             2012-02-01    2012-11-30    site 001
    

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


    Citation Envoyé par NAGOL Voir le message
    On peut voir ici que les 2 derniers tuples représentent, pour un même appareil, 2 périodes exactement successives au cours desquelles il se trouve sur un même site. J'imagine que cette situation ne devrait pas se présenter conformément à la 6è forme normale, et que ces 2 tuples devraient être "Packées" (?)
    Des 2 tuples n’en faire qu’un n’a pas d’incidence sur la normalité de la relvar AFFECTATION_HISTO car cela n’affecte en rien le degré D de celle-ci (nombre d’attributs en composant l’en-tête). La relvar viole effectivement la 6NF, mais c’est parce qu’elle est décomposable en relvars de degrés < D, telle que la jointure de celles-ci redonne AFFECTATION_HISTO.

    Considérons en effet les projections A et B suivantes (de degré 3) de la relvar AFFECTATION_HISTO (de degré 4) :

    A = {id_appareil, affectation_date_debut, affectation_date_fin}

    SELECT id_appareil
         , affectation_date_debut
         , affectation_date_fin 
    FROM   AFFECTATION_HISTO
    
    B = {id_appareil, affectation_date_debut, id_site}

    SELECT id_appareil
         , affectation_date_debut
         , id_site 
    FROM   AFFECTATION_HISTO
    

    A et B ont même clé {id_appareil, affectation_date_debut}, c’est-à-dire celle de AFFECTATION_HISTO qui est donc égale à la jointure de A et B :

    SELECT x.id_appareil
         , x.affectation_date_debut
         , x.affectation_date_fin
         , y.id_site
    FROM   (SELECT id_appareil
                 , affectation_date_debut
                 , affectation_date_fin 
            FROM   AFFECTATION_HISTO) as x       
    JOIN   (SELECT id_appareil
                 , affectation_date_debut
                 , id_site 
            FROM   AFFECTATION_HISTO) as y
     ON  x.id_appareil = y.id_appareil 
     AND x.affectation_date_debut = y.affectation_date_debut 
    

    La 6NF est violée, mais on sait que ça n’est pas grave, contrairement à un viol de 5NF. Pour la respecter, on ne va quand même pas remplacer AFFECTATION_HISTO par ses projections A et B ! En revanche, on peut utiliser le type INTERVAL, en l’occurrence le type DATERANGE de PostgreSQL et définir ainsi la table :

    CREATE TABLE AFFECTATION_HISTO 
    (
          id_appareil              INT                      NOT NULL,
          affectation_intervalle   DATERANGE                NOT NULL,
          id_site                  INT                      NOT NULL,
       CONSTRAINT AFFECTATION_HISTO_PK PRIMARY KEY (id_appareil, affectation_intervalle),
       CONSTRAINT AFFECTATION_HISTO_SITE_FK FOREIGN KEY (id_site)
          REFERENCES SITE,
       CONSTRAINT AFFECTATION_HISTO_APPAREIL_FK FOREIGN KEY (id_appareil)
          REFERENCES APPAREIL ON DELETE CASCADE
    ) 
    ;
    
    Cette fois-ci la table n’est pas décomposable (par projection) sans perte, il n’existe pas de dépendance de jointure non triviale, la sixième forme normale est bien respectée.

    Les inserts :

    INSERT INTO AFFECTATION_HISTO (id_appareil, affectation_intervalle, id_site)
    VALUES
       (11, '[2010-02-01, 2010-11-30]', 1)
     , (11, '[2010-12-01, 2015-03-31]', 2)  
     , (11, '[2015-04-01, 2017-10-31]', 1)  
     , (11, '[2010-11-01, 2019-05-31]', 1)  
    ;
    
    Le résultat brut d’un SELECT * FROM AFFECTATION_HISTO :

    id_appareil   affectation_intervalle       id_site
    -----------   -------------------------    -------
    11            "[2010-02-01,2010-12-01)"    1
    11            "[2010-12-01,2015-04-01)"    2
    11            "[2015-04-01,2017-11-01)"    1
    11            "[2010-11-01,2019-06-01)"    1
    
    Le crochet ouvrant "[" signifie que la date de début est incluse, tandis que la parenthèse fermante ")" signifie que la date de fin est exclue.

    Cela dit, les deux dernières lignes sont bien toujours là : même appareil, même site et périodes consécutives. Que l’on condense (par PACK) ou décondense (par UNPACK) n’affecte donc pas la normalité de la relvar, mais a un effet sur la performance et l’encombrement, d’où l’utilité de l’opérateur PACK. On a évidemment tout intérêt à respecter le 2e impératif LDD et ne faire qu’un des deux tuples en cause. Seulement voilà, autant c’est facile à faire dans le cadre du modèle relationnel de données, disons avec Tutorial D, autant avec SQL l’affaire se corse.

    Avec Tutorial D, sous le capot, fusionner les lignes est automatisable grâce à « PACKED ON » :

     
    VAR AFFECTATION_HISTO
             BASE RELATION { id_appareil               INTEGER, 
                             id_site                   INTEGER, 
                             affectation_intervalle    INTERVAL_DATE } 
             PACKED ON  affectation_intervalle 
             WHEN UNPACKED ON  affectation_intervalle  
                 THEN KEY {id_appareil, affectation_intervalle} 
             KEY {id_appareil, affectation_intervalle} ; 
     
    Avec SQL, on est livré à soi-même, c’est-à-dire avoir par exemple à programmer des triggers... 


    Citation Envoyé par NAGOL Voir le message
    Actuellement l'option "discontinuités" est plus proche de ce qui est appliqué, mais l'option plus documentée ouvre des perspectives intéressantes !
    Je n’ai pas d’a priori quant à cette alternative. Maintenant, si l’option plus documentée ouvre des perspectives, vous pouvez effectivement mettre en oeuvre des sites d’un nouveau type. Cela dit, les notions d’altitude, de coordonnées, etc. ne concernent pas ces sites, il pourrait être opportun de mettre en oeuvre une spécialisation des sites, chaque entité-type spécialisée possédant ses attributs sémantiquement pertinents.

    Exemple :

    Nom : nagol_site_specialisation_mcd.png
Affichages : 189
Taille : 14,3 Ko

    Citation Envoyé par NAGOL Voir le message
    Votre test confirme que l'étape 1/ est tout à fait réalisable. Néanmoins, suffit-il pour dire que les points 2/ et 3/ sont aussi validés dans votre résultat cité ci-dessous, soit :
    - les mesures stockées dans la relvar "MESURER "qui ont été prises avant le 01/04/2015 restent bien affectées au "bac à neige 001" (= appareil 11)

    Une fois que l’appareil 99 a été créé, l’opération consistant à le doter de l’affectation actuelle ne pose pas de problème. Reprenons l’instruction :

    UPDATE AFFECTATION_ACTUELLE
        SET id_appareil = 99 
        WHERE id_appareil = 11
    ;
    
    Cette instruction répond au besoin fonctionnel. Du point de vue SQL, si l’appareil 11 existe dans la table AFFECTATION_ACTUELLE, il sera remplacé par l’appareil 99. Si l’appareil 11 n’existe pas dans la table, il ne se passera rien.


    Considérons maintenant l’opération :

    UPDATE AFFECTATION_HISTO
        SET id_appareil = 99 
          WHERE id_appareil = 11 
            AND  affectation_date_fin >= '2015-04-01'
    ;
    
    Opération soumise aux conditions suivantes

    (C1)   id_appareil = 11

    (C2)   affectation_date_fin >= '2015-04-01'

    Seules les lignes vérifiant (C1) et (C2) seront donc prises en compte.

    A cause de (C2), pour l’appareil 11 aucune affectation antérieure au 2015-04-01 ne sera modifiée par SQL.

    Pour les lignes vérifiant (C1) et (C2), la valeur 11 de l’attribut id_appareil y sera effectivement remplacée par la valeur 99. SQL n’aura aucune raison de rouspéter puisque seul l’attribut id_appareil sera touché, mais dans le respect l’intégrité référentielle, donc pas de problème.

    Si la condition (C1) n’est pas vérifiée (id_appareil différent de 11) ou bien si la condition (C2) n’est pas vérifiée (date de fin antérieure au 2015-04-01), SQL ne fera rien.

    Le problème pouvant subsister : celui du recouvrement des périodes, mais, Sahib, ceci est une autre histoire...


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

  3. #43
    Membre à l'essai
    Inscrit en
    Juin 2013
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour Fsmrel,

    Citation Envoyé par fsmrel Voir le message
    Le problème pouvant subsister : celui du recouvrement des périodes, mais, Sahib, ceci est une autre histoire...
    Je n'avais effectivement pas pensé aux effets possibles d'un tel événement (qui peut pourtant arriver : cas d'un tuilage avec les 2 appareils installés en simultané pour inter-comparaison). J'imagine la procédure avec un INSERT plutôt qu'un UPDATE dans AFFECTATION_ACTUELLE, jusqu'à ce que l'ancien appareil soit désinstallé (DELETE sur ce dernier). Et pour d'éventuelles modifications a posteriori touchant AFFECTATION_HISTO, un INSERT du nouvel appareil sur un pas de temps égal au tuilage + un UPDATE sur les dates qui suivent ce tuilage devrait faire l'affaire ?

    Citation Envoyé par fsmrel Voir le message
    Seules les lignes vérifiant (C1) et (C2) seront donc prises en compte
    Je suis bien en phase avec vous en ce qui concerne le respect de ces 2 conditions. Ma question portait plutôt sur la situation suivante :
    - à un instant donné, nous stockons dans MESURER.mesure une donnée rattachée à APPAREIL.id_appareil = 11
    - on se rend compte après coup que APPAREIL.id_appareil 11 a été changé, et qu'il s'agit maintenant du 99
    - on applique avec soin les INSERT (pour APPAREIL) et UPDATE (pour AFFECTATION_ACTUELLE, et AFFECTATION_HISTO) que vous avez évoqués plus tôt
    - ne faut-il pas alors réaliser un UPDATE pour que les données de MESURER.mesure soient bien affectées à APPAREIL.id_appareil = 99 (au lieu de 11) pour les dates de mesures comprises dans le pas de temps qui a été UPDATé dans AFFECTATION_HISTO ?

Discussions similaires

  1. Question sur une relation ternaire dans un MCD
    Par sylsau dans le forum Schéma
    Réponses: 5
    Dernier message: 05/03/2006, 20h00
  2. Probleme de cardinalité dans mon mcd/mpd
    Par bluecurve dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/03/2006, 08h12
  3. Représentation d'une vue dans un MCD
    Par fredhali2000 dans le forum Schéma
    Réponses: 8
    Dernier message: 16/02/2006, 09h45
  4. besoin d'aide pour intégrer une entité dans un MCD
    Par barkleyfr dans le forum Schéma
    Réponses: 17
    Dernier message: 13/10/2005, 13h29
  5. Tables de référence dans un MCD
    Par MomoZeAsticot dans le forum Schéma
    Réponses: 6
    Dernier message: 21/02/2005, 14h37

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