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 :

propriété calculée dans un MCD et 1ere forme normale


Sujet :

Schéma

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut propriété calculée dans un MCD et 1ere forme normale
    Bonjour,


    J'ai appris que dans un MCD, pour respecter la première forme normale, il n'est pas permis qu'une propriété soit une propriété calculée.

    Or dans un exercice donné, je vois deux entités PRODUIT et FACTURE reliés par l'association FACTURER.

    L'entité PRODUIT possède entre autres la propriété "prix de vente".
    L'entité FACTURE possède entre autres le propriété "remise consentie" et l'association FACTURER possède la propriété "prix facturé".
    La justification en est qu'un prix facturé peut être différent d'un prix de vente et qu'il est donc nécessaire de faire figurer la propriété "prix facturé" dans l'association FACTURER.
    Or cette propriété est calculée puisqu'il s'agit du prix de vente * remise consentie.
    Ceci n'est pas permis si l'on veut respecter la première forme normale.
    S'agit il d'une erreur ou pas.

    Je vous remercie de votre aide.

    Bien cordialement.

    Nathalie
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  2. #2
    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
    Bonjour harbonne,


    Citation Envoyé par harbonne
    J'ai appris que dans un MCD, pour respecter la première forme normale, il n'est pas permis qu'une propriété soit une propriété calculée.
    Ce que vous appris est parfaitement fantaisiste. Il faudrait que vous vérifiiez vos sources.

    Je vous donne la définition du professeur Georges Gardarin :
    «Une relation est en première forme normale si tout attribut contient une valeur atomique.»
    Cette définition qui a 20 ans est celle que donnent les auteurs sérieux.

    Disons, pour citer Codd :
    «Les valeurs fournies par les domaines sur lesquels chaque relation est définie doivent être atomiques du point de vue du SGBD.»
    "atomique" veut dire : non décomposable par le SGBD.

    Si vous remplaciez votre valeur calculée en exposant au SGBD une liste de valeurs au sein du même attribut, il y aurait infraction à la 1ère forme normale.
    Si votre valeur calculée est toute seule au sein de l’attribut, il n’y a pas de problème.
    (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. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut première forme normale
    Bonjour et merci encore.

    En fait par propriété calculée on signifie liste de valeurs .
    Par exemple , si la propriété qte est la propriété de l'association Commander entre les entités Client et Produit, on comprend qu'elle contient une somme de quantités différentes qui correspond à la somme des quantités commandées par un client.

    C'est uniquement dans un tel cas de propriété multivaluee que le "calcul"( ici la somme des valeurs de la proprité qte) est interdit.

    Cela me permet de bien me refixer les définitions telles qu'on doit les comprendre.

    Merci à vous encore de vote aide.

    Cordialement.
    Nathalie Harbonne
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut premiere forme normale
    Rebonjour,

    Je reprends votre réponse à ce niveau:
    Si vous remplaciez votre valeur calculée en exposant au SGBD une liste de valeurs au sein du même attribut, il y aurait infraction à la 1ère forme normale.
    Si votre valeur calculée est toute seule au sein de l’attribut, il n’y a pas de problème.
    Voulez vous dire que si, à la place d'écrire au niveau du SGBD une somme de quantités ( propriété de l'association Commander), j'écris uniquement un montant total, cela pourrait convenir?
    Je n'en suis pas certaine.

    Merci de bien vouloir répondre à cete question.

    Cordialement.

    Nathalie
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 11
    Points : 11
    Points
    11
    Par défaut propriété calculée dans un MCD
    Bonjour,

    J'aimerais bien partager le même jugement et définition avec Fsmrel....... Dans la table Article on a le PRIX DE VENTE; dans la table FACTURE la REMISE SUR LE PRIX. on ne peut connaitre le prix réel de vente d'un article qu'en concatenant les deux clés des tables ARTICLE ET FACTURE. Si le prix réel de vente d'un article est calculé par la formule prix de vente* remise, il est tout simplement une information calculée au même titre qu'un total général que l'on affiche généralement (dans un formulaire) en fin d'une facture. Qui oserais créer un champ dans une table facture pour y stocker le total général?

    Lors de la création du modèle physique, la relation Facturer deviendra forcément une table, qui aura pour clé la concaténation des ID des tables Articles et Facture. Or si je connais ce couple d'ID le connais forcément le prix réel de vente, et il ne reste qu'à multiplier avec la quantité pour savoir le montant encaisé.

  6. #6
    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
    Il n'est pas forcément inutile de stocker le prix facturé.
    Si le prix de vente du produit change après l'émission de la facture, on ne peut plus connaître le prix réellement facturé.

    Remarque au passage : L'association en présence ici serait plus logique entre Produit et LigneFacture. Généralement on dissocie la facture de sa décomposition en lignes. Idem pour les commandes et les livraisons.
    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 !

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut première forme normale
    Rebonjour,

    Je ne dis pas qu'il n'est pas utile d'utiliser la propriété prix facturé et les raisons que vous avez précisées sont tout à fait exactes.
    Mon problème est de savoir si j'ai le droit ou pas de faire figurer la propriété 'prix facturé' dans l'association Facturer.
    Je lis dans le message adressé par Gaby Presta ceci
    Si le prix réel de vente d'un article est calculé par la formule prix de vente* remise, il est tout simplement une information calculée au même titre qu'un total général que l'on affiche généralement (dans un formulaire) en fin d'une facture
    ce qui signifie que d'après lui la propriété "prix facturé" n'a pas lieu d'être dans le MCD, car elle est une propriété calculée AU MEME TITRE qu'une propriété qui serait constituée d'une liste de valeurs.

    Donc qu'en est il finalement, c'est cela qui m'intéresse.
    Puis je ou non utiliser la propriété "prix facturé" dans l'association "FACTURER" d'après la premier forme normale??

    Merci beaucoup à vous de votre aide.

    Cordialement.
    Nathalie
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  8. #8
    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
    Citation Envoyé par harbonne Voir le message
    Puis je ou non utiliser la propriété "prix facturé" dans l'association "FACTURER" d'après la premier forme normale?
    D'après ce que j'ai expliqué plus haut, le prix facturé devient une propriété atomique puisqu'on ne peut pas la déduire à coup sûr du calcul qui a permis d'en fixer la valeur au départ puisque ces valeurs peuvent changer au cours du temps.
    Donc pour moi la réponse est oui.

    Il en serait tout autrement s'il s'agissait de stocker le prix de vente d'un produit qui serait calculé à partir du prix hors taxes et du taux de TVA. Même si le prix HT ou la TVA changent, il est toujours possible de calculer le prix auquel ON VA VENDRE le produit donc le stockage du prix de vente est inutile.

    Par contre le prix auquel ON A VENDU un produit à un moment donné dépend de paramètres qui peuvent avoir changé depuis. Il semble donc possible, et même souhaitable, de stocker le prix vendu.
    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 !

  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 harbonne Voir le message
    En fait par propriété calculée on signifie liste de valeurs.
    Par exemple , si la propriété qte est la propriété de l'association Commander entre les entités Client et Produit, on comprend qu'elle contient une somme de quantités différentes qui correspond à la somme des quantités commandées par un client.
    Une somme de quantités n’est pas une liste de quantités. Une liste est l’énumération des quantités.



    Citation Envoyé par CinePhil Voir le message
    Il n'est pas forcément inutile de stocker le prix facturé.
    Si le prix de vente du produit change après l'émission de la facture, on ne peut plus connaître le prix réellement facturé.
    Remarque au passage : L'association en présence ici serait plus logique entre Produit et LigneFacture. Généralement on dissocie la facture de sa décomposition en lignes. Idem pour les commandes et les livraisons.
    Voilà le bon sens incarné. Mais, il s’agit ici d’un problème relevant de la modélisation conceptuelle (qui a quand même pour effet salutaire d’éliminer les problèmes potentiels de viol de 1NF).



    Revenons-en à ce qu’écrit Nathalie et supposons que par "somme" elle veuille dire "énumération". Il est temps de faire des croquis et/ou de passer à SQL.

    Nathalie propose la mise en œuvre d’une table Commander ayant pour propriétés Client, Produit, Quantite.

    1) J'interprète d'abord la chose de la façon suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE Commander (
          Client    CHAR(8)     NOT NULL  
         ,Produit   CHAR(8)     NOT NULL
         ,Quantite  INTEGER     NOT NULL ) ;
    Si Quantite est une somme de quantités élémentaires, disons 100, 50, 500, Quantite prendra la valeur 650 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Commande (Client, Produit, Quantite)
              Albert  Crayon   650
    Tout va bien, on ne peut pas mieux respecter la 1NF. (Évidemment, comme diront Cinephil et Gaby presta, la modélisation laisse à désirer, mais il s’agit d’un autre débat.)

    2) Si l’attribut Quantite doit permettre de lister les quantités élémentaires, alors la structure de la table doit évoluer :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE Commander (
          Client    CHAR(8)        NOT NULL  
         ,Produit   CHAR(8)        NOT NULL
         ,Quantite  VARCHAR(1000)  NOT NULL ) ;
    et la représentation tabulaire prend l’allure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Commande (Client, Produit, Quantite)
              Albert  Crayon   100,50,500
    Mais à la lettre, la 1NF est toujours respectée ! En effet, "100,50,500" n’est pour le SGBD qu’une banale chaîne de caractères dont il n’est pas capable d’interpréter le contenu. Le type VARCHAR(1000) est atomique et seul nos sens sont capables de percevoir une différence et nous conduire à considérer que dans l'esprit, la 1NF est violée.
    Ainsi, la remarque que j’ai citée plus haut, et due à Cinephil, nous incitera à modéliser différemment, mais je répète que la 1NF n’a rien à voir dans cette histoire.

    3) Maintenant, vous violerez la 1NF sans vous cacher, si votre SGBD, à l’instar de PostgreSQL vous permet d’écrire quelque chose du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE Commander (
          Client    CHAR(8)     NOT NULL  
         ,Produit   CHAR(8)     NOT NULL
         ,Quantite  INTEGER[]   NOT NULL ) ;
    
    INSERT INTO Commander 
         VALUES ("Albert", "Crayon", ARRAY [100, 50, 500]) ;

    Cette fois-ci, l'atomicité a volé en éclats.
    (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
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    Les FN n'ont pas été pensées pour les modèles EA, mais pour le modèle relationnel.
    Codd a relevé que certains schémas (patterns dans le papier d'origine de Codd) revenaient de façon recurrente dans les bases de données qui posaient des problèmes.
    Il en a déduit (et d'autres ensuite après lui d'après ses communications initiales) certaines règles connues sous le nom de formes normales. Ces règles sont destinées à prévenir l'apparition de tels schémas dans les modèles relationnels.
    La 1ere forme normale n'a jamais été définie aussi précisément que les suivantes. Initialement Codd l'appelle 'Communication Form' et elle est principalement destinée à faciliter l'échange de données sous forme de fichiers plats entre applications.
    Je ne me rappelle pas avoir lu 1 définition plus précise faite par Codd ensuite. Mais ça ne veut pas dire qu'elle n'existe pas. FSMREL pourra sans doute nous en dire plus à ce sujet.
    De ce flou vient tout le mal. Beaucoup d'interprétations, certaines fantaisistes, ont été faites.
    L'impact des FN sur le modèle EA est indiscutable. Il serait inconscient de ne pas les avoir à l'esprit lors de la modèlisation conceptuelle, mais il faut se rappeler qu'elles ont été établies pour normaliser le modèle physique, et quelquefois il n'est pas possible de justifier une bonne pratique MCD/ERD en se basant strictement sur la définition des FN.
    Pour autant le grand principe de tout ça c'est que la redondance 'cémal'.
    Si l'information est présente n fois, elle sera fausse n fois.
    Une bonne illustration avec le montant facturé évoqué dans cette discussion.
    C'est une donnée calculée. Même si STRICTO SENSU elle est atomique (et donc qu'elle respecte la 1FN) elle est décomposable, ce qui fait que les données de base sont présentes plusieurs fois dans la base.
    (Qté * Prix pour faire simple. 1 éventuel tx de remise ne change rien).
    Comme le fait remarquer CinePhil si on ne la stocke pas on ne peut plus retrouver le montant payé le jour de la facture si le prix change. Mais si on la stocke on a potentiellement deux montants. Lequel est juste ?
    Celui qui est calculable avec la valeur courante du prix ? Celui qui est stocké ? Qui certifie que le montant calculé stocké l'a été avec le prix en vigueur au moment de la facture ? Qui certifie que le prix courant n'est pas celui qui aurait du servir à calculer le montant le jour de la facture ? En fait qui certifie que le montant stocké est juste ?
    Dans cet exemple, si le prix n'est pas une info immutable, il manque 1 entité dans le modèle. Il existe une DF entre date et prix qui doit amener à la création d'une entité Tarif. Ce qui permet de calculer le montant. Et si le prix est immutable on peut calculer le montant à tout moment.
    En conclusion
    1> Dans 1 système OLTP, non, une donnée calculée n'a pas à apparaitre dans un MCD.
    2> mais je rejoins l'avis de FSMREL, je ne pense pas que se soit justifiable en évoquant la FN1.

    Quant au niveau physique c'est autre chose. S'il est issu de façon ''pure'' depuis un MCD/MLD il ne contiendra pas de données calculées. Mais il est admis que pour certaines raisons, de performance notamment, on puisse normaliser un modèle.

    Mais c'est du tuning de DBA. Ca n'a plus rien à voir avec la conception.

    [EDIT]
    Citation Envoyé par CinePhil
    Remarque au passage : L'association en présence ici serait plus logique entre Produit et LigneFacture. Généralement on dissocie la facture de sa décomposition en lignes. Idem pour les commandes et les livraisons.
    Je ne suis pas sur qu'1 entité LigneFacture se justifie.
    On est au niveau MCD. L'association FACTURER est probablement de cardinalité n,n et deviendra 1 table (''LigneFacture'' si tu veux) au niveau physique.
    Citation Envoyé par harbonne
    deux entités PRODUIT et FACTURE reliés par l'association FACTURER.
    [/EDIT]

  11. #11
    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 TheLeadingEdge Voir le message
    Je ne me rappelle pas avoir lu 1 définition plus précise faite par Codd ensuite. Mais ça ne veut pas dire qu'elle n'existe pas. FSMREL pourra sans doute nous en dire plus à ce sujet.
    Extrait de E. F. Codd. “Further Normalization of the Data Base Relational Model”. IBM Research Report, RJ909, San Jose (August 31, 1971) :




    Vous retrouverez cette définition de la 1NF dans les commentaires de Date sur les écrits de Codd (à recopier avant que ça ne disparaisse...) :

    Thirty Years of Relational: The First Three Normal Forms



    Citation Envoyé par TheLeadingEdge Voir le message
    L'impact des FN sur le modèle EA est indiscutable. Il serait inconscient de ne pas les avoir à l'esprit lors de la modélisation conceptuelle, mais il faut se rappeler qu'elles ont été établies pour normaliser le modèle physique
    Tout à fait d’accord. Sauf sur un point : la théorie de la normalisation relève de la logique formelle (voyez les travaux de Fagin, Casey, Ullman, Delobel et autres) et concerne donc le niveau logique, tandis que le niveau physique est concerné par le fer à souder.

    Permettez-moi à ce sujet une incidente. Dans son ouvrage "Les machines à penser", Jacques Arsac écrit : « Dans le rapport qu’il écrivit à la demande du Premier ministre Pierre Mauroy, Maurice Nivat, un des meilleurs spécialistes mondiaux en informatique théorique, définit l’informatique comme la rencontre de la logique formelle et du fer à souder...»


    Citation Envoyé par TheLeadingEdge Voir le message
    Si l'information est présente n fois, elle sera fausse n fois.
    Une information présente n fois peut aussi être juste n fois, et pour citer Codd :
    If something is true, saying it twice doesn’t make it more true.


    Citation Envoyé par TheLeadingEdge Voir le message
    Quant au niveau physique c'est autre chose. S'il est issu de façon ''pure'' depuis un MCD/MLD il ne contiendra pas de données calculées
    Quitte à me répéter, j'entends qu’algèbre relationnelle et calcul des prédicats ne sont pas du niveau physique.
    Pour ma part je préfère écrire :
    Quant au niveau logique, c’est autre chose. S'il est issu de façon ''pure'' depuis un MCD il ne contiendra pas de données calculées.
    Cela dit, quelle stratégie adopter dans le contexte SQL ?

    Utilisons par exemple MS SQL Server et définissons les tables suivantes :
    Table Client (classique), issue du MCD.
    Table ReglementUnitaire, contenant le détail des règlements effectués par un client et issue du MCD.

    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
    Create Table Client
    (
          ClientId           Int           Not Null
        , ClientNom          Varchar(48)   Not Null
      , Constraint Client_PK Primary Key (ClientId)  
    ) ;
     
    Create Table ReglementUnitaire
    (
          ClientId              Int        Not Null
        , ReglementDate         Char(10)   Not Null
        , ReglementUnitaire     Money      Not Null
      , Constraint RU_PK Primary Key (ClientId, ReglementDate)  
      , Constraint RU_Client_FK Foreign Key (ClientId) 
               References Client(CLientId)
    ) ;
    Ajoutons une table, appelons-la ReglementTotal, chargée d'héberger le montant total des règlements effectués par chaque client. Cette table n'est pas issue du MCD, elle est ajoutée par le DBA.
    La première forme normale est scrupuleusement respectée, mais on a droit à une superbe redondance, puisqu’à tout moment, pour chaque client, la valeur prise par l’attribut ReglementTotal de la table ReglementTotal doit être égale à la somme des valeurs prises par l’attribut ReglementUnitaire de la table ReglementUnitaire.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Create Table ReglementTotal
    (
          ClientId           Int           Not Null
        , ReglementTotal     Money         Not Null
      , Constraint RT_PK Primary Key (ClientId)
      , Constraint RT_Client_FK Foreign Key (ClientId) 
               References Client(CLientId)
                   On delete Cascade  
    ) ;
    L’enjeu est de faire en sorte que le SGBD garantisse à lui seul la cohérence du contenu des tables ReglementTotal et ReglementUnitaire, donc sans intervention de qui que ce soit.
    En ce sens, on définira deux triggers. Le premier sera utilisé pour qu’à chaque fois qu’un client est créé, il y ait insertion d’une ligne dans la table ReglementTotal pour ce client, avec un montant à zéro :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Create Trigger TotalInit On Client
      After Insert
        As Select CLientId 
           From   Inserted
      ; 
      Insert Into ReglementTotal
             Select  ClientId, 0
             From    Inserted ;

    Le deuxième trigger permettra de synchroniser la table ReglementTotal sur la table ReglementUnitaire, à chaque fois que celle-ci sera mise à jour :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Create Trigger TotalSynchro On ReglementUnitaire
      After Insert, Update, Delete
        As Select ClientId 
           From   ReglementUnitaire
      Update ReglementTotal 
        Set ReglementTotal = 
              (Select Sum (r.ReglementUnitaire)
               From   ReglementUnitaire r  
               Where ReglementTotal.ClientId = r.ClientId)
        Where  Exists (Select  *  
                       From    ReglementUnitaire r
                       Where   ReglementTotal.ClientId = r.ClientId
                      ) ;
    Ce trigger reste à tester dans tous les coins, mais l’idée est là. Il est sans aucun doute améliorable, mais ceci est du ressort des pros de SQL.

    A noter que si l’on veut que l’utilisateur n’ait pas connaissance de la table ReglementTotal, mais ait une vision globale des données des clients, il suffit de lui proposer une vue :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Create View LeClient (ClientId, ClientNom, ClientTotalReglement) As
    Select x.ClientId, x.ClientNom, y.ReglementTotal  
    From   Client As x Inner Join ReglementTotal as y
            On x.ClientId = y.ClientId ;


    Citation Envoyé par TheLeadingEdge Voir le message
    il est admis que pour certaines raisons, de performance notamment, on puisse normaliser un modèle.
    En tant que DBA, permettez-moi d’en douter, au moins au vu des aménagements que j’ai proposés pour ce cas particulier de redondance. Évidemment, reste à monter un prototype orienté performance, qui puisse infirmer ce que je j’ai proposé, mais ceci est autre histoire. Quant à la solution de rechange, je ne la vois pas.


    Citation Envoyé par TheLeadingEdge Voir le message
    Je ne suis pas sur qu'1 entité LigneFacture se justifie.
    On est au niveau MCD. L'association FACTURER est probablement de cardinalité n,n et deviendra 1 table (''LigneFacture'' si tu veux) au niveau physique.
    Merci pour cette piqûre de rappel. Nous avons trop souvent tendance à mettre en œuvre une entité-type LigneFacture, mais il arrive que cela soit nécessaire, par exemple parce que la ligne de facture peut elle-même être décomposée en engagements sur ligne de facture et autres joyeusetés et en l’occurrence, il s’agit de respecter la 1NF...
    (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. [AC-2007] Calcul d'un champ texte sous forme de nombre dans requête
    Par alu1308 dans le forum IHM
    Réponses: 2
    Dernier message: 14/08/2013, 09h38
  2. [2.x] [Form] Calcul dans une formulaire
    Par blacksf dans le forum Symfony
    Réponses: 5
    Dernier message: 22/08/2012, 17h38
  3. [NF] redondances dans les entités et 1ere forme normale
    Par sarah_insat dans le forum Schéma
    Réponses: 5
    Dernier message: 12/05/2008, 13h04
  4. Pb de reception de calcul dans forms principale
    Par edonis dans le forum VBA Access
    Réponses: 3
    Dernier message: 25/09/2007, 19h35
  5. expression de calcul dans un form
    Par 3wicha dans le forum IHM
    Réponses: 7
    Dernier message: 24/08/2007, 15h02

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