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 :

Discriminer une absence de choix d'un choix d'aucune valeur parmi un ensemble fini


Sujet :

Schéma

  1. #1
    Invité
    Invité(e)
    Par défaut Discriminer une absence de choix d'un choix d'aucune valeur parmi un ensemble fini
    Soit deux relations :
    PLANTE
    PROTECTION
    et la règle métier suivante :
    Une PLANTE peut avoir une et une seule PROTECTION.

    Voir le schéma schema1.png joint pour une représentation graphique.

    Ma question est la suivante :
    Comment améliorer cette modélisation pour pouvoir différencier les plantes pour lesquelles l’utilisateur n’a pas sélectionné de protection correspondante (par manque de temps, par absence de l’information, ...) des plantes pour lesquelles l’utilisateur sait formellement qu’aucune protection ne correspond ? Le but étant de faciliter la revue des plantes pour lesquelles l’utilisateur n’a pas répondu et de lui épargner de passer en revue toutes les plantes pour lesquelles il n’y a aucune protection valable.

    En réalité j’ai déjà une solution qui consiste à modéliser deux nouvelles règles :
    Une PLANTE peut ne pas avoir une ou plusieurs PROTECTIONS.
    Une PLANTE ne peut pas à la fois avoir et ne pas avoir une PROTECTION.

    Cela se traduit sur le second schéma schema2.png par une nouvelle relation PLANTE_ABSENCE_DE_PROTECTION ainsi qu’un trigger pour éviter de modéliser une chose et son contraire.

    A présent, pour indiquer qu'aucune protection ne correspond, il suffit d'indiquer que chacune des protections est absente. Cela me semble assez fastidieux même si une interface utilisateur bien réfléchie peut permettre de réaliser ces actions en un seul clic.

    Qu'en pensez-vous ?
    Images attachées Images attachées   
    Dernière modification par JPhi33 ; 10/05/2013 à 14h39. Motif: tag

  2. #2
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut Précisions.
    Bonjour Titinetine,

    Le plus simple serait de conserver ton premier schéma en ajoutant un flag Possede (champ oui/non) dans l'association Plante_Protection : l'association serait appelée "Lier protection" au lieu "Posséder protection".

    En JMerise, cela donnerait :



    donnant :
    Plante(IdPlante, ...)
    Protection(IdProtection, ...)
    Plante_Protection(#IdPlante, #IdProtection, Possede, ...)

    Les trois cas seront donc possibles :
    • couple plante/protection existe avec flag Possede=Vrai ==> la plante possède la protection ;
    • couple plante/protection existe avec flag Possede=Faux ==> la plante ne possède pas la protection ;
    • couple plante/protection n'existe pas ==> on ne sait pas si la plante possède la protection.
    Images attachées Images attachées  
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour Richard_35 et merci de votre réponse.

    En fait, j'utilise déjà ce que vous proposez mais pour un autre scénario qui ressemble de très près à celui-ci.

    Pour reprendre mon exemple, j'aurais à coup certain utilisé votre solution dans le cas où ma règle métier aurait été la suivante :
    Une PLANTE peut avoir une ou plusieurs PROTECTIONS.
    mais ma règle est la suivante :
    Une PLANTE peut avoir une et seulement une PROTECTION.

    Dans la solution que j'ai proposée, j'ai utilisé deux relations et ai été obligé d'utiliser un trigger afin de garantir l'intégrité des données (pour éviter de dire qu'une plante possède une protection et de dire exactement le contraire). J'aurais pu tout aussi bien utiliser votre solution combinée également à un trigger qui garantit une cardinalité MAX de 1 lorsque le flag est VRAI. Car en l'état, la clé primaire permet de dire qu'une plante peut posséder plusieurs protections.

    Même si la solution avec une seule relation et un flag me semble plus élégante, elle ne me satisfait pas pour autant car il faudra "passer du temps" à exprimer l'absence de protection pour chacune des protections alors que, dans mon cas, l'information d'absence de protection m'est totalement indifférente.
    Si l'absence de protection était une information importante alors oui je foncerai pour cette solution mais mon unique problème est de faire gagner du temps aux utilisateurs en leur évitant une revue inutile des plantes pour lesquels ils connaissent les caractéristiques.

    Souvent, je m'aperçois que la meilleure des modélisations est de calquer la réalité alors pourquoi ne modéliserais-je pas le fait que la plante a OUI ou NON été passée est revue en ce qui concerne sa protection ?

    Je réfléchi ... je vois bien une solution qui m'éviterai un trigger mais cette solution briserai une règle que j'ai respectée strictement jusqu'à présent : interdire les valeur NULL.
    Voilà ce que ça donnerais : schema3.png


    C'est exactement pareil que mon schema1.png sauf que la clé étrangère sur protection accepte la valeur NULL, ce que je pourrai interpréter comme "La plante ne possède pas de protection.". Hum, pas sur que ça plaise à fsmrel ça ! (ça ne me plait pas non plus d'ailleurs).

    Sinon je pourrais ajouter dans la relation PLANTE un booléen qui exprime le fait que l'information de protection ait été donnée. Mais ça me forcerai à écrire un trigger afin de garantir que le booléen est VRAI lorsqu'un protection est liée à cette plante...

    Qu'en pensez-vous ?
    Images attachées Images attachées  

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 567
    Points : 56 572
    Points
    56 572
    Billets dans le blog
    40
    Par défaut
    bonsoir à vous deux,

    ne pourrait-on pas envisager une solution avec héritage :

    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
    17
    Plante :
    idPlante    NomPlante
      1         pissenlit
      2         magnolia
      3         jacinthe
      4         orchidée
    
    PlanteSansProtectionValable :
    idPlante
      1
    
    PlanteAvecProtection :
    idPlante       idProtection
      2                P1
      3                P2
      1                P4  <---impossible à cause de la contrainte d'exclusion X
    la plante 1 n'a pas de protection valable.
    La plante 2 a la protection P1
    La plante 3 a la protection P2
    La plante 4 n'a pas de protection renseignée.

    Si j'ai bien compris...
    Images attachées Images attachées  

  5. #5
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 567
    Points : 56 572
    Points
    56 572
    Billets dans le blog
    40
    Par défaut
    le MLD correspondant (passage à OMS, avec JMerise je n'y arrive pas):
    Images attachées Images attachées  

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonsoir f-leb et merci également de votre réponse.

    Cette en solution semble adaptée à ma situation en l'état actuel des choses. Néanmoins, si j'ajoute une ou plusieurs nouvelles règles metier du même type :
    Une PLANTE peut avoir un et seulement un CONCEPT_X.
    Une PLANTE peut avoir un et seulement un CONCEPT_Y.
    Une PLANTE peut avoir un et seulement un CONCEPT_Z.
    ...

    Alors je risque de me retrouver rapidement avec nombre de spécialisations important :
    PlanteSansXSansYSansZ
    PlanteSansXSansYAvecZ
    PlanteSansXAvecYAvecZ
    PlanteSansXAvecYSansZ
    PlanteAvecXAvecYSansZ
    PlanteAvecXAvecYAvecZ
    PlanteAvecXSansYAvecZ
    PlanteAvecXSansYSansZ
    ...
    ou bien peut-être y-a-t-il une autre façon de gérer cette situation ?

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


    Citation Envoyé par titinetine Voir le message
    Je risque de me retrouver rapidement avec nombre de spécialisations important.
    Avec n concepts, selon votre approche on aurait 2 spécialisations. En procédant différemment on peut réduire à 2n. Exemple avec N = 3 :



    Pour n = 10, l'écart se creuse

    A noter : chaque contrainte d’exclusion devra faire l’objet d’un trigger (INSERT, UPDATE) au stade SQL...
    (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.

  8. #8
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut Erreur d'auteur.
    Bonjour à tous,

    Citation Envoyé par Titinetine
    mais ma règle est la suivante :
    Une PLANTE peut avoir une et seulement une PROTECTION.
    ==> effectivement, cela m'avait échappé.

    La solution de Fsmrel F-leb est très maline mais, conceptuellement, la création d'entité à part entière pour l'inclusion et l'exclusion me gêne un peu, peut-être à tort. Une association me paraît mieux adaptée (ce qui revient au même, en final, pour la création des tables).

    Autre suggestion :



    donnant :
    Plante(IdPlante, ...)
    Protection(IdProtection, ...)
    Plante_Posseder_Protection(#IdPlante, #IdProtection, ...)
    Plante_NePas_Posseder_Protection(#IdPlante, #IdProtection, AvecCertitude (booléen), ...) ==> AvecCertitude=Vrai : la plante ne possède pas la protection / AvecCertitude=Faux : on ne sait pas si la plante possède ou non la protection
    Images attachées Images attachées  
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

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


    Citation Envoyé par fsmrel Voir le message
    Avec n concepts, selon votre approche on aurait 2 spécialisations. En procédant différemment on peut réduire à 2n.
    On peut encore réduire à n mais à condition d’injecter une redondance que l’on veillera à contrôler par trigger pour garantir qu'il n'y aura aucune incohérence.


    Spécialisation minimale :





    Script de création des tables (MS SQL Server) :

    Table PLANTE

    Une contrainte permet de contrôler les valeurs prises par la colonne PlanteProtegee :

    — 'vrai' si la plante P fait l'objet d'une protection : on contrôlera que P figure bien dans la table PLANTE_PROTEGEE.

    — 'faux' si on sait que la plante ne fait pas fait l'objet d'une protection : on contrôlera que P ne figure pas dans la table PLANTE_PROTEGEE.

    — '??' si l’on ne s’est pas encore prononcé : on contrôlera que P ne figure pas dans la table PLANTE_PROTEGEE.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE PLANTE (
            PlanteId        INT                  NOT NULL
          , PlanteNom       Varchar(64)          NOT NULL
          , PlanteProtegee  CHAR(04)             NOT NULL  DEFAULT ''        
        , CONSTRAINT PLANTE_PK PRIMARY KEY (PlanteId)
        , CONSTRAINT PLANTE_CHK CHECK (PlanteProtegee IN ('vrai', 'faux', '??'))  
    ) ;

    Table PROTECTION

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE PROTECTION (
            ProtectionId    INT                  NOT NULL
          , ProtectionNom   Varchar(64)          NOT NULL
        , CONSTRAINT PROTECTION_PK PRIMARY KEY (ProtectionId)
    ) ;

    TABLE PLANTE_PROTEGEE, pour les plantes faisant référence à une protection (la colonne PlanteProtegee contient la valeur 'vrai').

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE PLANTE_PROTEGEE (
            PlanteId        INT                  NOT NULL
          , ProtectionId    INT                  NOT NULL
        , CONSTRAINT PLANTE_PROTEGEE_PK PRIMARY KEY (PlanteId)
        , CONSTRAINT PLANTE_PLANTE_FK FOREIGN KEY (PlanteId) 
           REFERENCES PLANTE ON DELETE CASCADE
        , CONSTRAINT PLANTE_PROTEGEE_FK FOREIGN KEY (ProtectionId) 
           REFERENCES PROTECTION
    ) ;

    Pour assurer la cohérence du système, on définit une vue qui sera exclusivement utilisée pour les mises à jour (interdiction de mettre directement à jour les tables PLANTE et PLANTE_PROTEGEE) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE VIEW PLANTE_PROTECT_VUE (PlanteId, PlanteNom, ProtectionId, PlanteProtegee)
    AS  
        SELECT x.PlanteId, PlanteNom, ProtectionId, PlanteProtegee  
        FROM   PLANTE AS x LEFT JOIN PLANTE_PROTEGEE AS y ON x.PlanteId = y.PlanteId ;

    Comme le SGBD ne sait toujours pas mettre à jour les tables à partir de la vue, on passera par des triggers.

    Trigger pour les INSERT :
    Dans tous les cas on insère dans la table PLANTE ; en outre on insère dans la table PLANTE_PROTEGEE, mais seulement si PlanteProtegee = 'vrai'.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER TRIGGER_INSERT ON PLANTE_PROTECT_VUE INSTEAD OF INSERT AS
     
        INSERT INTO PLANTE
            SELECT PlanteId, PlanteNom, PlanteProtegee
            FROM   INSERTED ;
     
        INSERT INTO PLANTE_PROTEGEE 
            SELECT PlanteId, ProtectionId
            FROM   INSERTED
            WHERE  PlanteProtegee = 'vrai'

    Trigger pour les DELETE :
    On applique les DELETE seulement à la table PLANTE. Grâce à la clause ON DELETE CASCADE (cf. TABLE PLANTE_PROTEGEE, contrainte PLANTE_PLANTE_FK), le SGBD répercute tout seul comme un grand les suppressions dans la table PLANTE_PROTEGEE.
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER TRIGGER_DELETE ON PLANTE_PROTECT_VUE INSTEAD OF DELETE AS
     
        DELETE FROM PLANTE
               WHERE PlanteId IN (SELECT PlanteId
                                  FROM   DELETED
                                  WHERE  PLANTE.PlanteId = PlanteId) ;

    Trigger pour les UPDATE :
    A venir (si la solution vous intéresse...)

    Un bout de jeu d’essai :

    Table PROTECTION :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO PROTECTION (ProtectionId, ProtectionNom) VALUES (1, 'protect 01') ;
    INSERT INTO PROTECTION (ProtectionId, ProtectionNom) VALUES (2, 'protect 02') ;
    INSERT INTO PROTECTION (ProtectionId, ProtectionNom) VALUES (3, 'protect 03') ;
    INSERT INTO PROTECTION (ProtectionId, ProtectionNom) VALUES (4, 'protect 04') ;
    INSERT INTO PROTECTION (ProtectionId, ProtectionNom) VALUES (5, 'protect 05') ;

    Ajouts via la vue PLANTE_PROTECT_VUE (rappel : toutes les mises à jour passent par la vue) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO PLANTE_PROTECT_VUE (PlanteId, PlanteNom, ProtectionId, PlanteProtegee) VALUES (1, 'plante 01', 0, '??') ;
    INSERT INTO PLANTE_PROTECT_VUE (PlanteId, PlanteNom, ProtectionId, PlanteProtegee) VALUES (2, 'plante 02', 0, 'faux') ;
    INSERT INTO PLANTE_PROTECT_VUE (PlanteId, PlanteNom, ProtectionId, PlanteProtegee) VALUES (3, 'plante 03', 1, 'vrai') ;
    INSERT INTO PLANTE_PROTECT_VUE (PlanteId, PlanteNom, ProtectionId, PlanteProtegee) VALUES (4, 'plante 04', 2, 'vrai') ;
    INSERT INTO PLANTE_PROTECT_VUE (PlanteId, PlanteNom, ProtectionId, PlanteProtegee) VALUES (5, 'plante 05', 3, 'vrai') ;

    Suppression en masse (par exemple, les plantes pour lesquelles la protection n'est pas égale à 2) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM PLANTE_PROTECT_VUE
           WHERE ProtectionId <> 2 ;
    (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
    7 945
    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 : 7 945
    Points : 30 716
    Points
    30 716
    Billets dans le blog
    16
    Par défaut
    Suite à un copier/coller intepestif, JOIN a remplacé LEFT JOIN dans la vue PLANTE_PROTECT_VUE qui doit se lire ainsi :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE VIEW PLANTE_PROTECT_VUE (PlanteId, PlanteNom, ProtectionId, PlanteProtegee)
    AS  
        SELECT x.PlanteId, PlanteNom, ProtectionId, PlanteProtegee  
        FROM   PLANTE AS x LEFT JOIN PLANTE_PROTEGEE AS y ON x.PlanteId = y.PlanteId ;
    (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.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonjour à tous et encore merci pour vos réponses.

    Dans toutes les solutions, il me faudra donc garantir l'intégrité des données avec des triggers donc.

    Si je prends la dernière solution de fsmrel, en quoi est-il différent de créer un type de donnée énuméré prenant les valeurs 'vrai', 'faux' ou '??' d'un type de donnée booléen classique mais autorisant le bonhomme NULL ?
    Au fond, quelle différence a-t-on entre la valeur '??' dans le premier cas et NULL dans le second cas ?

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    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 792
    Points : 34 013
    Points
    34 013
    Billets dans le blog
    14
    Par défaut
    Je n'ai pas tout lu mais j'ai l'impression que vous vous êtes fait des noeuds au cerveau pour pas grand chose !

    La règle de base :
    Une PLANTE peut avoir une et une seule PROTECTION
    Je suppose, notamment d'après le schéma proposé au départ, que la contraposée est :
    "... et une PROTECTION peut agir sur plusieurs PLANTEs."

    Ce qui se traduit par le MCD suivant :
    PLANTE -0,1----avoir----0,n- PROTECTION

    Et, comme je l'explique dans mon blog, ce MCD donne les tables suivantes :
    te_protection_prt (prt_id, prt_nom...)
    te_plante_plt (plt_id, plt_nom)
    tj_plt_avoir_prt_pap (pap_id_plante, pap_id_protection...)

    Quelles sont les plantes qui n'ont pas encore de protection ?
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT pl.plt_id, pl.plt_nom
    FROM te_plante_plt pl
    WHERE NOT EXISTS (
    	SELECT *
    	FROM tj_plt_avoir_prt_pap pa
    	WHERE pa.pap_id_plante = pl.plt_id
    )
    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 !

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour CinePhil et merci également pour votre intérêt à la question.

    Citation Envoyé par CinePhil Voir le message
    Je suppose, notamment d'après le schéma proposé au départ, que la contraposée est :
    "... et une PROTECTION peut agir sur plusieurs PLANTEs."

    Ce qui se traduit par le MCD suivant :
    PLANTE -0,1----avoir----0,n- PROTECTION
    Exacte, désolé d'avoir omis ces informations.

    Citation Envoyé par CinePhil Voir le message
    Je n'ai pas tout lu mais j'ai l'impression que vous vous êtes fait des noeuds au cerveau pour pas grand chose !
    Citation Envoyé par CinePhil Voir le message
    Quelles sont les plantes qui n'ont pas encore de protection ?
    C'est la toute la subtilité de la question. En effet, comment discriminer une plante qui n'a pas encore de protection d'une plante qui n'a pas de protection. Ou plus généralement, comment discriminer une plante pour laquelle on n'a pas encore précisé si elle a une protection ou si elle n'en a pas d'une plante pour laquelle on précisé cette information ?

  14. #14
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    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 792
    Points : 34 013
    Points
    34 013
    Billets dans le blog
    14
    Par défaut
    Et en ajoutant tout simplement une valeur du genre 'Pas de protection possible' dans la table des protections ?

    Du coup, vous pouvez aussi simplifier le schéma en ajoutant aussi une valeur du genre 'Protection non encore étudiée' :
    plante -1,1----avoir----0,n- protection

    te_protection_prt (prt_id, prt_libelle)
    te_plante_plt (plt_id, plt_id_protection, plt_nom...)
    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 !

  15. #15
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour à tous,

    Citation Envoyé par Titinetine
    C'est la toute la subtilité de la question.
    ==> effectivement. Si j'ai bien compris, il y a :
    • d'un côté, une patte 0,1 ==> une PLANTE peut avoir une et une seule PROTECTION (de façon certaine) ;
    • de l'autre, une patte 0,n ==> une PLANTE peut être liée à plusieurs PROTECTIONs par la relation "ne possède pas" mais, dans l'ensemble de ces liaisons, il faut distinguer les "ne possède pas de façon certaine" des "on ne sait pas".


    Est-ce bien cela, Titinetine ?
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  16. #16
    Invité
    Invité(e)
    Par défaut
    Je reformule mon problème initial pour plus de clarté :

    Une PLANTE peut avoir une et seulement une PROTECTION.
    Une PROTECTION peut correspondre à une ou plusieurs PLANTES.
    Soit les cardinalités : PLANTE -0,1----avoir----0,n- PROTECTION

    de plus :

    Une PLANTE peut n'avoir aucune PROTECTION.
    Une PLANTE ne peut pas à la fois avoir une protection et n'avoir aucune PROTECTION.

    C'est tout !


    En revanche, pour ce qui est de l'absence de protection qui n'est pas vraiment mon besoin mais qui était seulement une façon de solutionner mon problème :
    Une PLANTE peut ne pas avoir une ou plusieurs PROTECTIONS.
    Une PROTECTION peut ne pas correspondre à une ou plusieurs PLANTES.
    Soit les cardinalités : PLANTE -0,n---- ne pas avoir----0,n- PROTECTION

    Et mon problème consiste à discriminer d'une part les plantes n'ayant aucune information sur la protection, et d'autre part, les plantes qui ont cette information, soit parce qu'elles ont une protection bien précise, soit parce qu'elles n'ont aucune protection.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Et en ajoutant tout simplement une valeur du genre 'Pas de protection possible' dans la table des protections ?
    Non, car ça revient à utiliser des concepts pour ce qu'ils ne sont pas. Même si cette solution fonctionne sur le point technique dans le cadre de ma question. Ca ne fonctionnerait pas dans un cas qui en diffère de peu. En effet, dans mon cas réel, j'ai un attribut "acronym" qui est de type VARCHAR et qui est non NULL, il faudrait à nouveau que j'invente une valeur bidon pour faire rentrer à tout prix mon "Pas de protection possible" dans le moule du concept PROTECTION. Et on peut étendre à tous les autres concepts en relation avec PROTECTION.

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    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 792
    Points : 34 013
    Points
    34 013
    Billets dans le blog
    14
    Par défaut
    N'y a t-il pas un autre élément qui pourrait distinguer les plantes :
    - étudiées et n'ayant aucune protection ;
    - n'ayant pas encore de protection parce que non étudiée ?

    Par exemple, une date d'étude ou un dossier d'étude, une expérimentation...

    J'imagine le processus suivant :
    1) Enregistrement d'une plante.
    2) Étude de la plante pour déterminer quelle protection est valable pour la plante.
    3) Enregistrement du résultat de l'étude, ce qui entraîne l'enregistrement de la protection de la plante, si elle est trouvée.

    plante --0,1----subir----(1,1)- etude
    |-----------0,1----avoir----0,n- protection

    te_protection_prt (prt_id, prt_nom...)
    te_plante_plt (plt_id, plt_nom)
    tj_plt_avoir_prt_pap (pap_id_plante, pap_id_protection...)
    te_etude_etu (etu_id_plante, etu_date...)

    On peut dire ainsi que telle plante n'est associée à aucune protection parce qu'elle n'a pas encore subi d'étude et que telle autre n'est associée à aucune protection parce qu'aucune ne convient, après avoir étudié la plante.

    Si je suis complètement à côté de la plaque, c'est peut-être parce que tu ne nous en dit pas suffisamment ?
    Ca ne fonctionnerait pas dans un cas qui en diffère de peu. En effet, dans mon cas réel, j'ai un attribut "acronym" qui est de type VARCHAR et qui est non NULL
    Quel est ton cas réel ?
    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 !

  19. #19
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    7 945
    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 : 7 945
    Points : 30 716
    Points
    30 716
    Billets dans le blog
    16
    Par défaut Des ronds dans l'eau...
    Citation Envoyé par CinePhil Voir le message
    Et en ajoutant tout simplement une valeur du genre 'Pas de protection possible' dans la table des protections ?
    Pas si simple. Si cette table a N colonnes, quelles valeurs leur affecter ? Face à l’incongruité du nouveau problème qui se pose on sera peut-être enclin à spécialiser les protections en protections à plantes et pas à plantes : on tourne en rond....
    (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.

  20. #20
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    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 792
    Points : 34 013
    Points
    34 013
    Billets dans le blog
    14
    Par défaut
    Je n'avais pas lu en détail la première fois mais...
    Souvent, je m'aperçois que la meilleure des modélisations est de calquer la réalité alors pourquoi ne modéliserais-je pas le fait que la plante a OUI ou NON été passée est revue en ce qui concerne sa protection ?
    Ça rejoint la supposition et la proposition que j'ai émises dans mon précédent message !
    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 !

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/02/2009, 18h04
  2. Réponses: 2
    Dernier message: 23/06/2008, 17h24
  3. Une fenetre ouvrant une autre a partir d'un choix
    Par farwest dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 22/04/2008, 20h32
  4. Réponses: 5
    Dernier message: 12/10/2007, 11h06
  5. Réponses: 3
    Dernier message: 18/01/2007, 19h19

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