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 :

[NF]décomposition d'une entité non en FNBC


Sujet :

Schéma

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 976
    Points : 139
    Points
    139
    Par défaut [NF]décomposition d'une entité non en FNBC
    Pour finir avec mon problème de décomposition d'une entité qui n'est pas en FNBc, je reprendrais l'explication donnée au niveau de ce cours p 3
    http://wwwens.uqac.ca/~pdelisle/8inf...ers/Cours6.pdf
    qui dit que si une entité n'est pas en fnbc, on divise chaque entité qui ne répond pas au critère en deux entités distinctes.
    La nouvelle entité aura comme identifiant la propriété ordinaire dont
    provient la dépendance et comme propriété la partie de l'identifiant qui en dépend.

    -on remplace la partie de l'identifiant concernée par la propriété ordinaire ( qui est devenu l'identifiant de l'autre entité)

    Ex :CLAVIER(marqueclavier,nombretouches,typeclavier)
    Si on suppose qu'il y a une DF entr le type de clavier et le nombre de touches, il faut diviser de la façon suivante
    CLAVIER(marqueclavier,typeclavier)
    TOUCHES(typeclavier,nombretouches)

    Mon problème est le suivant : dans un MCd on ne peut pas trouver deux fois la même propriété or la propriété typeclavier apparaît deux fois dans notre cas.

    De plus normalement au niveau del'entité CLAVIER, elle ne doit pas être soulignée.Est ce exact?
    Comment puis je faire pour respecter le fait que propriété ne doive pas apparaître deux fois dans le MCd et la règle de décomposition?
    Dois je en déduire qu'une telle situation ( problème de non respect dela FNBC)ne peut se produire que quand on est déjà à l'étape du MLD?

    Merci à nouveau beaucoup de votre aide.

    Cordialement.
    Nathalie

  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 114
    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 114
    Points : 31 602
    Points
    31 602
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Si on suppose qu'il y a une DF entre le type de clavier et le nombre de touches, il faut diviser de la façon suivante
    CLAVIER(marqueclavier, typeclavier)
    TOUCHES(typeclavier, nombretouches)

    Mon problème est le suivant : dans un MCd on ne peut pas trouver deux fois la même propriété or la propriété typeclavier apparaît deux fois dans notre cas.
    1) On ne divise pas : on effectue une projection (par application du théorème de Heath). Plus généralement votre cours est très approximatif à tous points de vue. La théorie relationnelle, c’est quand même des maths, ce qui exige un minimum de rigueur.

    2) Toujours dans le cadre de la théorie relationnelle, l’opérateur JOIN est l’opérateur par excellence. Par exemple, pour recomposer votre table initiale, vous écrirez : CLAVIER JOIN TOUCHES et la jointure naturelle se fera sur la base des attributs ayant même nom (attribut typeclavier en l’occurrence) et qui sont de même type (ce sur quoi votre cours a du reste fait l’impasse, comme nous le faisons tous la plupart du temps...)

    3) En ayant écrit
    CLAVIER (marqueclavier, typeclavier)
    TOUCHES (typeclavier, nombretouches)
    vous avez décrit des en-têtes de tables (au type des attributs près). Vous êtes au niveau du MLD et non du MCD. En plus, puisqu’il existe la DF typeclavier → nombretouches, seul l’attribut typeclavier entre dans la composition de la clé primaire de TOUCHES, en vertu de quoi, par respect du principe de l'irréductibilité des clés candidates, l’attribut nombretouches ne doit pas être souligné (au demeurant, le concept de clé primaire ne fait plus partie de la théorie, il n’y a que des clés candidates, mais passons).

    4) Si l’on remonte au niveau du MCD, TheLeadingEdge devrait confirmer qu’on est en présence de 2 entités-types :
    MARQUECLAVIER (marqueclavier, ...),
    TYPECLAVIER (typeclavier, nombretouches, ...).
    Ces entités-types sont en relation par le biais de l’association-type CLAVIER, laquelle n’est porteuse d’aucune propriété identifiante. En effet, l’identifiant d’une association-type est l’union (au sens de la théorie des ensembles) des identifiants des entités-types participantes (cf. la page 9 de la référence : Ministère de l'Industrie, Mission à l'Informatique, Centre Technique Informatique, Méthode de Définition d'un Système d'Informations, Fascicule 4. Juin 1979. Le terme employé dans ce fascicule n’est pas "union" mais "concaténation", moins formel).
    Les propriétés identifiantes d’une association-type ne sont jamais représentées, puisque cela introduirait une redondance (d’où parfois la nécessité d’utiliser des entités-types factices, telles que l’inénarrable Date). Quoi qu’il en soit, la propriété typeclavier n’apparaît plus qu’une fois (dans l’entité-type TYPECLAVIER).

    Si vous dérivez ce MCD en MLD, cette fois-ci l’attribut typeclavier apparaît 2 fois dans le MLD et vous pourrez effectuer toutes les jointures que vous voulez :
    MARQUECLAVIER (marqueclavier, ...)
    TYPECLAVIER (typeclavier, nombretouches, ...)
    CLAVIER (marqueclavier, typeclavier)

    Je vous prie de noter que l'attribut marqueclavier figure lui aussi deux fois dans le MLD mais une seule fois en tant que propriété dans le MCD.


    Dois je en déduire qu'une telle situation (problème de non respect de la FNBC) ne peut se produire que quand on est déjà à l'étape du MLD?
    Certes non ! les problèmes de normalisation se posent au niveau Entité/Association, au niveau des diagrammes de classes UML, au niveau de banals fichiers, etc. S’ils se posent au niveau du MLD, c’est que celui-ci n’a fait qu’en hériter, façon patate chaude. La théorie relationnelle offre depuis 1971 les outils d'investigation permettant de révéler ces problèmes et de les résoudre. Normaliser une table revient à la décomposition de celle-ci par une opération de projection. En conséquence de cette scissiparité, par rétroconception mécanique, le MCD obtenu ne sera évidemment pas le même que celui qui aura servi à produire le MLD et sera plus pur au plan de la normalisation.

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 976
    Points : 139
    Points
    139
    Par défaut décomposition d'une entité qui n'est pas en fnbc: autre exemple
    Bonjour,

    Je vous remercie encore beaucoup de votre aide et de vos explications très claires.

    Je comprends que le cours de référence n'est pas bon et qu'il va falloir que j'utilise sans complexe les notions de mathématiques à la base de la théorie relationnelle au niveau de mon cours ( j'essaye de limiter les dégats qui ont été faits et sur lesquels j'espère pouvoir revenir).

    Lorsque je vous demande si le problème de non respect de la FNBC ne peut se produire que quand on est déjà à l'étape du MLD, c'est parce que justement dans le cas de l'association type "CLAVIER" , si celle ci est modélisée c'est qu'on en est arrivé à l'étape du MLD.

    J'ai vu dans un autre cours, cet exemple(http://www.bd.enst.fr/polyv7/chap5.htm)

    Bien que la relation soit en 3ème forme normale, il existe encore des redondances dues au fait qu'un attribut non clé détermine une partie de la clé. Afin d'éliminer ce type de redondance, BOYCE et CODD ont introduit une nouvelle forme normale :
    Définition : Forme Normale de BOYCE-CODD (BCNF) :
    Une relation est en BCNF si et seulement si les seules dépendances fonctionnelles élémentaires sont celles dans lesquelles une clé détermine un attribut. Pour l'exemple précédent une décomposition en BCNF serait :
    PLAGE (NOMP,CANTON) et GEO(CANTON,REGION)

    Théorème de décomposition en BCNF :
    Toute relation admet au moins une décomposition en BCNF qui est sans perte ; cependant, une telle décomposition ne préserve généralement pas les dépendances fonctionnelles. Dans l'exemple précédent on ne préserve pas la première DF
    On note bien qu'il existe deux fois la propriété "CANTON" , une fois la "décomposition" effectuée.

    Que dois je en déduire, que je suis déjà au niveau du MLD et que l'exemple pris n'est pas représentatif de ce qui peut exister au niveau du MCD???

    Merci beaucoup de votre aide.

    Cordialement.
    Nathalie

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


    Que dois je en déduire, que je suis déjà au niveau du MLD et que l'exemple pris n'est pas représentatif de ce qui peut exister au niveau du MCD???
    Je reprends l’exemple des plages, donné au paragraphe V.2.5 dans la référence que vous nous avez fournie :
    http://www.bd.enst.fr/polyv7/chap5.htm

    Cet exemple n’est pas génial, notamment parce que lorsque l’on modélise, on n’identifie pas une plage par son nom, même chose pour une région ou un canton. Mais, allons-y quand même, malgré cette façon de procéder : au niveau du MCD, identifions donc une plage par son nom et admettons, même si cela peut paraître douteux, qu’à un nom de plage donné puisse correspondre plus d’une région et qu’à une région corresponde plus d’une plage (ce dernier point paraissant quand même beaucoup plus vraisemblable). Dans la même logique, identifions la région par son nom.
    On aura donc affaire à deux entités-types : PLAGE et REGION, en relation via une association-type que l’on appellera R. Chaque patte de l’association-type est porteuse d’une cardinalité maximale N : tout baigne (si je puis dire !)



    Toujours au niveau du MCD, mettons en œuvre une entité-type CANTON, identifiée par son nom : à un canton donné on peut associer plus d’une plage, et à ce même canton peuvent correspondre plusieurs régions (cas par exemple du canton de Breteuil, que l’on retrouve dans l’Eure ou dans l’Oise, même si ça n’est pas au bord de la mer). Incidemment, on pourra trouver étrange qu'à une plage puissent être associés plus d'un canton, mais votre cours l'exige, sinon la DF définie plus loin {NPLAGE, NREGION} → {NCANTON} ne serait plus élémentaire et il n'y aurait plus de problème de BCNF (tout juste un banal problème de 2NF...)

    L’association-type R devient donc une ternaire, mais tout va bien, on est encore dans une situation que l’on maîtrise.



    Selon cette configuration, lors de la dérivation du MCD, on produira une table R dont la clé sera composée du triplet des clés des tables PLAGE, REGION, CANTON :
    R {NPLAGE, NREGION, NCANTON}
    R respecte la BCNF car toutes les DF qu’elle comporte sont triviales.

    Maintenant, bien qu'elle ne soit pas exactement formulée ainsi, on nous impose la règle curieuse suivante : "Pour une plage et une région données, on a un et un seul canton". En tout état de cause, toujours pas de souci, on met en œuvre une CIF permettant de prendre en compte cette règle.



    Selon cette configuration, lors de la dérivation du MCD, on produira une table R dont la clé sera composée du couple des clés des tables PLAGE, REGION :
    R {NPLAGE, NREGION, NCANTON}
    R respecte la BCNF car le déterminant de la seule DF non triviale qu’elle comporte {NPLAGE, NREGION} {NCANTON} est une surclé de R (c’est même une clé candidate).

    Bien. Allons-y maintenant pour hisser le drapeau rouge. Dans le cours est énoncée, sous forme de DF, une règle supplémentaire, selon laquelle "Un canton détermine une région" (Il faudra donc supprimer un canton Breteuil, mais le problème n’est pas là...)
    Cette règle conduit à la mise en œuvre d’une CIF supplémentaire :



    Lors de la dérivation du MCD, on produira une table R dont la clé sera à nouveau composée du couple des clés des tables PLAGE, REGION :
    R {NPLAGE, NREGION, NCANTON}
    Mais la nouvelle règle de gestion se traduit par une DF : {NCANTON} → {NREGION} et cette fois-ci, la BCNF est violée car la DF n’est pas triviale et le déterminant {NCANTON} n’est pas surclé de R.

    Dans cet exercice, on se rend compte que l’anomalie a été révélée au niveau du MLD, mais en réalité un œil exercé l’aura déjà débusquée au niveau du MCD, du fait de l’existence simultanée des deux CIF qui se courent l’une après l’autre. Je répète donc ce que j’ai écrit dans mon précédent message :
    Les problèmes de normalisation se posent au niveau Entité/Association, au niveau des diagrammes de classes UML, au niveau de banals fichiers, etc. S’ils se posent au niveau du MLD, c’est que celui-ci n’a fait qu’en hériter, façon patate chaude...

    Les choix possibles :

    1) Revoir le système d’identification au niveau du MCD, car le vrai problème est là.

    2) En admettant que l’on ne remette pas en cause ce système, alors soit on normalise et on perd une règle de gestion ("Pour une plage et une région données, on a un et un seul canton"), soit on ne normalise pas et on conserve la règle.

    Si on choisit de normaliser, la règle de gestion n’est pas forcément perdue. En effet, si elle ne peut plus être garantie par le jeu classique de l’intégrité référentielle (ce qui est sous-entendu dans tous les ouvrages et cours, y-compris celui que vous mentionnez, même si les auteurs n’en ont pas conscience), elle le sera grâce à la mise en œuvre d’une assertion (au sens de la norme SQL) ou d’un trigger si le SGBDR ne propose pas l’instruction CREATE ASSERTION, mais seulement l’instruction CREATE TRIGGER.

    L’avantage de cette solution est qu’elle permet d’éliminer les redondances provoquées par le viol de la BCNF, mais elle a le gros inconvénient d’obliger à modifier le MCD, ce qui peut se révéler économiquement coûteux, si le projet est déjà bien avancé.



    Si l’on choisit plutôt de violer la BCNF, on s’en sortira encore grâce à une assertion ou un trigger permettant de s’assurer cette fois-ci que la DF {NCANTON} → {NREGION} sera toujours respectée. L’avantage de cette solution est qu’elle permet de ne pas toucher au MCD.

    Exemple de trigger avec SQL Server 2005 :
    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
    16
     
    Create Trigger T1 On R Instead of Insert As
        Select  ' '   
        From    Inserted x
              , R y    
         Where  x.NCANTON = y.NCANTON
         And    x.NREGION <> y.NREGION ; 
    If @@Rowcount > 0
        Begin 
           Raiserror ('Viol BCNF !',10,1) 
        Return
    End
        Insert into R 
            Select *
            From Inserted
    Go
    Vous retiendrez que si la BCNF n’est pas respectée et que l’on veuille rectifier le tir, alors le MCD sera nécessairement à modifier. Quod erat demonstrandum.

    Pour l’anecdote, le paragraphe en cause du cours que vous référencez comporte des passages étonnants :

    Supposons en outre que deux plages d'une même région ne puissent pas porter le même nom et qu'il n'existe pas deux cantons de même nom. La relation se note :
    PLAGE (NOMP, REGION, CANTON)
    Je ne vois pas le rapport.


    Et encore :
    Pour l'exemple précédent une décomposition en BCNF serait :
    PLAGE (NOMP, CANTON) et GEO (CANTON, REGION)
    Je vous laisse le soin de découvrir l'erreur...

    Bref, l'auteur fera bien d'y remettre bon ordre...

    Bon courage à vous et ne m'en veuillez pas pour les quelques erreurs qu'à mon tour j'aurais pu commettre.

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 976
    Points : 139
    Points
    139
    Par défaut modélisation en ordre
    Merci infiniment de votre aide.

    Débutant dans l'enseignement( on fait peut être mieux comme référence mais je ne cherche qu'à enseigner au mieux en m'améliorant), j'ai considéré la référence ci-contre comme une référence sérieuse et ai donc transmis de mauvaises informations.
    Comment puis je rectifier le tir, à présent?

    Pouvez vous me donner un réél exemple de non respect de Boyce codd au niveau du MCd et de la rectification effectuée en fonction des règles de normalisation.

    J'ai vraiment besoin de m'appuyer sur des références sérieuses pour "confectionner" mon cours, mais il se trouve que ce que j'ai trouvé n'est pas forcément ce qu'ily a de mieux!

    Merci infiniment encore.

    Je reprendrai pas à pas toutes vos explications.

    Bien cordialement et avec tout mon respect pour votre patience et dévouement.

    Nathalie

  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 114
    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 114
    Points : 31 602
    Points
    31 602
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Imaginons que vous fassiez partie d’une société de services en ingénierie informatique, organisée en départements où s’agitent de nombreux ingénieurs spécialisés dans les SGBD (j'ai donné...)

    Considérons les règles de gestion suivantes :

    — Un ingénieur peut être compétent pour plusieurs SGBD.
    — Un ingénieur fait partie d’un seul département.
    — Un SGBD peut être maîtrisé par plusieurs ingénieurs.
    — Un département peut être concerné par plusieurs SGBD.
    — Un département peut employer plusieurs des ingénieurs compétents.

    Et finalement la règle qui tue :

    Pour un département et un SGBD, parmi les ingénieurs compétents du département, un seul d’entre eux est désigné comme responsable des choix stratégiques concernant ce SGBD, pour le compte du département.

    On nous demande de nous focaliser sur la table des choix stratégiques.

    Soit T cette table. Elle a pour attributs : SgbdId (identifiant du SGBD), DeptId (Identifiant du département), IngId (identifiant de l’ingénieur responsable). On admettra que ces trois attributs sont du type Integer.
    Elle a pour clé candidate le couple {SgbdId, DeptId}. Sa structure est la suivante :
    T ({SgbdId Integer, DeptId Integer, IngId Integer}
    Que l’on simplifiera en
    T {SgbdId, DeptId, IngId}
    On peut en fournir une représentation en extension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    T {SgbdId, DeptId, IngId}
        s1      d1      i1
        s2      d2      i2
        s1      d2      i3
        s3      d2      i3
        s4      d2      i3
       ...     ...     ...
    Je vous laisse le soin de montrer que T n'est pas en BCNF.

    Je vous rappelle la définition :

    Une table R est en forme normale de Boyce-Codd (BCNF), si pour chaque DF : A → B satisfaite par R :
     Ou bien la DF est triviale,
     Ou bien le déterminant A est une surclé de R.

    Je vous laisse encore le soin de retrouver la définition de la DF triviale et de la surclé, j’en ai assez parlé sur ce forum, voyez par exemple
    http://www.developpez.net/forums/sho...03&postcount=4


    J'ai vraiment besoin de m'appuyer sur des références sérieuses
    La plus sérieuse, la plus rigoureuse, celle à laquelle je me réfère systématiquement : http://www.amazon.com/Introduction-D.../dp/0321197844

    Bonne et fructueuse lecture.

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 976
    Points : 139
    Points
    139
    Par défaut -référence proposée-entité non en FNBC
    Bonjour et meci infiniment de votre aide.

    Je vais bien travailler tout cela.

    La référence proposée est en anglais.

    Je comprends assez bien l'anglais mais n'y a t-il pas de risque de mal comprendre certaines choses , parfois, ce qui pourrait me porter préjudice.

    Cordialement.

    Nathalie Harbonne

  8. #8
    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,
    La référence proposée est en anglais.
    Bonne nouvelle : Il existe une traduction
    http://www.amazon.fr/Introduction-ba.../dp/2711748383

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Voici un TP que je donne dans mes cours aux Arts et Métiers, à l'ISEN Toulojn et à Orsys en modélisation de données...

    A +


    ********************************************************


    EXEMPLE DE PROBLÉMATIQUE LIÉ A LA FORME NORMALE DE BOYCE CODD

    Soit la relation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dispensaire :
    N° patient	date consultation	heure consultation	medecin		salle d'auscultation
    101		20/01/06		09:00			DUPONT		Pervenche
    203		20/01/06		10:00			DUPONT		Pervenche
    309		20/01/06		10:00			MARTIN		Tulipe
    407		22/01/06		09:00			DUPONT		Tulipe
    La relation Dispensaire à 3 clefs candidates :
    1 - (N° patient, date consultation)
    2 - (medecin, date consultation, heure consultation)
    3 - (salle d'auscultation, date consultation, heure consultation)

    Si nous choisissons (N° patient, date consultation) comme clef primaire de la relation, alors la relation prend la forme suivante :
    Dispensaire (N° patient, date consultation, heure consultation, medecin, salle d'auscultation)
    elle comporte alors les DF suivantes :
    1 - N° patient, date consultation → heure consultation, medecin, salle d'auscultation (clef primaire)
    2 - medecin, date consultation, heure consultation → N° patient (clef candidate)
    3 - salle d'auscultation, date consultation, heure consultation → medecin, N° patient (clef candidate)
    4 - medecin, date consultation → salle d'auscultation

    Travail à faire :

    Considérez la 4eme DF (medecin, date consultation → salle d'auscultation)...

    Que se passerait-il si l'on voulait changer la salle d'auscultation pour le médecin DUPONT à la date du 20/01/06 ?

    Proposez une nouvelle modélisation permettant d'éviter le problème.

  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 114
    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 114
    Points : 31 602
    Points
    31 602
    Billets dans le blog
    16
    Par défaut
    Bien que la barre soit mine de rien placée assez haut, l’exemple proposé par SQLpro est intéressant à plus d’un titre :

    — Au lieu de la seule et sempiternelle clé primaire, la relvar Dispensaire comporte plusieurs clés candidates.

    — Cette relvar comporte une DF "mortelle" : {medecin, date consultation} → {salle d’auscultation}.

    — La relvar viole la BCNF, c’est sûr, mais la normaliser conduirait à la perte d’une règle de gestion, comme on l’enseigne au sujet de la normalisation des relvars 3NF et non BCNF. En l'occurrence, il s'agit de la règle d'unicité exprimée par la 3e clé candidate : {salle d'auscultation, date consultation, heure consultation}.

    Cela dit, la question suivante est posée :
    Citation Envoyé par SQLpro
    Que se passerait-il si l'on voulait changer la salle d'auscultation pour le médecin DUPONT à la date du 20/01/06 ?
    Si l’on écrit de façon rationnelle, c'est-à-dire dans l’esprit relationnel (ensembliste), les choses de passent de façon tout à fait normale. Exemple de requête, en utilisant le style SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Update Dispensaire 
        Set Salle_auscultation = 'Rose'
        Where  medecin = 'DUPONT' 
          And  date_consultation = '20/01/06'
    La salle Rose étant disponible, tout se passe bien, la mise à jour est effectuée.

    Évidemment, si d’aventure on cherche à remplacer la salle Pervenche par la salle Tulipe, celle-ci n'étant pas libre, il doit y avoir rejet, puisque l’on violerait la règle de gestion exprimée par la 3e clé candidate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Update Dispensaire 
        Set Salle_auscultation = 'Tulipe'
        Where  medecin = 'DUPONT' 
          And  date_consultation = '20/01/06'
    => tentative de création d'une clé en double.

    Donc, à la question :
    Citation Envoyé par SQLpro
    Proposez une nouvelle modélisation permettant d'éviter le problème
    => Je réponds : Quel problème ?

    Indépendamment de cela, il est possible de normaliser, en décomposant Dispensaire en deux relvars. Je rappelle d’abord le théorème de Heath :
    Soit la relvar R {A, B, C} dans laquelle A, B et C sont des ensembles d’attributs de R.
    Si R satisfait à la DF : A → B, alors R est égale à la jointure de ses projections sur {A,B} et {A,C}.
    Par application de ce théorème, la relvar Dispensaire peut être décomposée par projection selon les deux relvars :
    R1 {D, M, S}, de clé candidate {D, M},
    R2 {D, M, H, P} de clés candidates {D, M, H} et {D, P}.
    L’intégrité référentielle permet de garantir que les couples {D, M} de R2 sont des couples de R1. Mais, on a perdu une règle de gestion, celle qui correspond à la 3e clé candidate. On peut bien sûr ajouter une relvar pour rattraper le coup :
    R3 {S, D, H, P}, de clés candidates {S, D, H} et {D, P}.
    Mais d’autres problèmes de cohérence se poseront. On ne fait que déplacer la difficulté, tout en compliquant les choses : le plus raisonnable est paradoxalement de violer la BCNF, à condition, pour garantir la DF mortelle, de fournir une assertion ad-hoc (ou un trigger si ça n’est pas possible).

    Exemple d’ajout devant provoquer un rejet de la part du SGBD eu égard à la DF mortelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Insert  Into Dispensaire Values (204, '20/01/06', '11:00', 'DUPONT', 'Tulipe') ;
    Pour que le rejet soit effectif, on peut utiliser un trigger du genre (cas de l’insertion, à aménager pour les modifications) :
    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
    16
    Create Trigger T1 On Dispensaire Instead of Insert As
        Select  'T1'   
        From    Inserted x
              , Dispensaire y    
         Where  x.medecin = y.medecin
         And    x.date_consultation = y.date_consultation
         And    x.salle_auscultation <> y.salle_auscultation ; 
    If @@Rowcount > 0
        Begin 
           Raiserror ('Viol BCNF !',10,1) 
        Return
    End
        Insert Into Dispensaire 
            Select *
            From Inserted
    GO

    Note concernant les clés candidates, primaires et alternatives

    Citation Envoyé par SQLpro
    La relation Dispensaire à 3 clefs candidates :
    1 - (N° patient, date consultation)
    2 - (medecin, date consultation, heure consultation)
    3 - (salle d'auscultation, date consultation, heure consultation)

    Si nous choisissons (N° patient, date consultation) comme clef primaire de la relation...
    A titre simplement d'information, je rappelle que le concept de clé primaire est, depuis une quinzaine d’années, mentionné dans la théorie relationnelle à titre purement historique. Il est vrai qu’à l’origine, Ted Codd mettait particulièrement en avant ce concept, mais dans un article paru dans InfoDB en 1993 (et repris dans http://www.amazon.com/Relational-Dat.../dp/0201824590 "The Primacy of Primary Keys: An Investigation", Chris Date explique qu’au nom du rasoir d’Ockham, clés primaires et alternatives peuvent être évacuées de la théorie et donc que les clés candidates suffisent à notre bonheur.

    Je cite encore et traduis Chris Date : "Que l’on retienne une clé candidate pour être clé primaire, relève de considérations purement psychologiques, sortant du champ du Modèle relationnel." (The Relational Database Dictionary).

    La phrase "Si nous choisissons..." n’apporte donc strictement rien pour l’exemple qui nous intéresse, lequel n'implique pas un langage en particulier, mais seulement le Modèle relationnel. A défaut, on pourrait penser que vous anticipez sur une relation clé primaire - clé étrangère entre les relvars R1 et R2 décrites plus haut, c'est-à-dire que l'on serait déjà au niveau SQL.

    Citation Envoyé par SQLpro
    1 - N° patient, date consultation → heure consultation, medecin, salle d'auscultation (clef primaire)
    2 - medecin, date consultation, heure consultation → N° patient (clef candidate)
    3 - salle d'auscultation, date consultation, heure consultation → medecin, N° patient (clef candidate)
    Pour des raisons de symétrie, quitte à parler de la clé primaire (1re clé dans l'exemple), parler des 2e et 3e clés de l'exemple en tant que clés alternatives. Clé primaire et clé alternative peuvent être perçues comme des spécialisations de la clé candidate (toujours d’un point de vue psychologique...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] non-détection d'une entité
    Par Agriesean dans le forum Symfony
    Réponses: 2
    Dernier message: 20/05/2013, 12h07
  2. Jointure sur un champ et non une entité
    Par shadypierre dans le forum Doctrine2
    Réponses: 3
    Dernier message: 24/09/2012, 14h00
  3. [2.x] Classe non trouvée au chargement d'une entite
    Par zoreol dans le forum Symfony
    Réponses: 5
    Dernier message: 17/05/2012, 13h54
  4. [DOM] [Xerces] Insertion d'une entité
    Par Traroth dans le forum Format d'échange (XML, JSON...)
    Réponses: 10
    Dernier message: 19/05/2008, 09h28
  5. Décomposition d'une chaine de caractères
    Par stephdiplo150 dans le forum C
    Réponses: 3
    Dernier message: 04/03/2004, 22h50

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