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

 SGBD Discussion :

Relation (1,1) ou (1,n) contradiction


Sujet :

SGBD

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Relation (1,1) ou (1,n) contradiction
    Bonjour,

    Je dispose de deux relations : QUESTION et REPONSES

    QUESTION(* NumQuestion, Question, NReponse)
    REPONSE(NumQuestion, *NumReponse, LibReponse)

    Le but de mon exercice est de définir les liens entre les tables et de préciser son type (1..1 ou 1..n)

    L'énoncé me précise que :
    Pour chaque question on propose plusieurs réponses ; une seule et une seule est
    correcte. Une réponse ne peut servir que pour une seule question.
    L'attribut NReponse dans la relation QUESTION correspond au numéro de la réponse correcte pour
    la question.

    Au premier essais je pensais mettre un lien (1,n) entre la relation QUESTION et la relation REPONSE car je sais qu'une question peut proposer plusieurs réponses.
    Cependant l'attribut NRéponse me pose problème. En effet, l'énoncé me précise qu'une question n'a qu'une réponse unique et qu'une réponse n'est associée qu'à une question. Cette phrase m'incite a créer un lien (1,1) mais ce lien est en contradiction avec mon premier essais.

    Comment faire? j'avoue ne pas m'y retrouver.

    Merci pour votre aide.


    Cordialement,


  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Votre première intuition est la bonne, l'association de Question vers Reponse est bien (1, n), puisqu'une question possède plusieurs réponses.

    L'attribut NReponse qui contient la réponse correcte est une erreur de modélisation et ne devrait pas être présent au niveau de la relation Question, mais au niveau de la relation Reponse.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Effectivement, le schéma de la BDD me semble erroné mais comme il s'agit d'un exercice à faire dans le cadre universitaire je me demandais si il existait une autre solution.

    Merci pour votre réponse.

    Le P'tit Français.

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Pour ma part, le modèle est tout à fait correct.

    Le numéro de la réponse correcte est bien un attribut de la question :
    La réponse de "Quelle est la capitale de la France" est bien "Paris" et non "Paris est la bonne réponse pour la question à propos de capitale de la France".

    En revanche, ce sont les SGBD (aucun SGBD à ma connaissance le supporte) qui ne permettent pas de modéliser ça sous forme de relations de type "foreign key".

    En effet, en SQL, cela donnerait, si tout était pour le mieu dans le meilleur des mondes possibles :

    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
     
    create table question
    (
        id int primary key not null,
        question varchar(50) not null,
        bonne_reponse int not null unique references reponse(id)
    );
     
    create table reponse
    (
       id int primary key not null,
       reponse varchar(50) not null,
       question_id int not null references question(id)
    );

    Ainsi :
    On a bien une relation 1,1 de question vers réponse
    - Une question a forcément une et une seule "bonne réponse" (clé étrangère de question vers réponse)
    - Une réponse ne peut être la "bonne réponse" que d'une et une seule question (contrainte d'unicité sur la bonne réponse)

    Et une relation 1,n de réponse vers question
    - Une réponse fait référence à une et une seule "question" (clé étrangère de réponse vers question)

    Fonctionellement parlant, on pourrait rajouter une contrainte (ou trigger de validation) afin de vérifier que la "bonne réponse" fait bien référence à la question qui y fait référence.

    Aux seuls bémols près que :
    - La syntaxe ci-dessus plante : on va devoir créer la FK de la bonne réponse une fois la table des réponses créées (bon, au pire, on contourne sans problème cette limitation)
    - Si on essaie de créer une question, il faut faire référence à une réponse existante, qui doit elle-même référencer la question qu'on n'a pas encore créé ! Il faudrait pouvoir faire une transaction unitaire portant sur un lot de plusieurs insert portant sur des tables différentes. A ma connaissance, aucun SGBD ne le supporte, mais la norme SQL, si je ne m'abuse, n'écarte pas cette possibilité.

    Il faudra alors truander :
    - Soit en rendant nullable la bonne réponse, afin de créer la question sans bonne réponse, puis mettre à jour cette bonne réponse une fois toutes les questions crées
    - Soit en désactivant la FK sur la bonne réponse le temps de créer les réponses à la question
    - Soit créer une question bidon et une réponse bidon avant de créer les contraintes, et d'initialiser les questions avec la réponse bidon avant de créer les bonnes réponses

    Dans tous les cas, on est obligé de passer outre une contrainte de validation des données, ce qui est bien domage.

    C'est pour ça que Waldar indique que le modèle est faux (pourtant, il ne l'est pas !)
    => On mettra en général un flag true/false sur les réponses afin de déterminer quelle est la bonne réponse, ou alors on créra une table "bonne réponse" qui contiendra les couples question/réponse constituant les bonnes réponses. Mais dans ces deux cas, ce sont des modèles foireux, bien plus que le modèle original !
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Pour ma part, le modèle est tout à fait correct.

    Le numéro de la réponse correcte est bien un attribut de la question :
    La réponse de "Quelle est la capitale de la France" est bien "Paris" et non "Paris est la bonne réponse pour la question à propos de capitale de la France".
    Je me suis arrêté là (pour le moment, je vais bien sûr tout lire).

    Donc si la France déménage sa capitale à Vichy, vous allez mettre à jour la table question, c'est bien ça ?

  6. #6
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    En effet, c'est la table question qui sera mise à jour (à condition que la réponse "Vichy" était déjà existante, sinon il faudra la créer avant).

    C'est pas moins logique que de mettre à jour deux question, ou de supprimer et ajouter une ligne dans une table de relation.
    On ne jouit bien que de ce qu’on partage.

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Voir l'article de SQLPro sur les clés étrangères, tout particulièrement la déférabilité : http://sqlpro.developpez.com/cours/s...e=partie2#L7.4
    On ne jouit bien que de ce qu’on partage.

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

Discussions similaires

  1. Mettre en relation les contrôles DBLookUpComboBox et DBGrid
    Par Gendarmette dans le forum Bases de données
    Réponses: 7
    Dernier message: 19/01/2004, 13h16
  2. [Relations] afficher les relations entre 2 tables
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 14/01/2004, 17h07
  3. [EJB2.1 Entity] [CMR] Relation One to Many
    Par hamed dans le forum Java EE
    Réponses: 2
    Dernier message: 31/12/2003, 14h26
  4. Réponses: 2
    Dernier message: 26/09/2003, 15h54
  5. Problème avec mes tables de relation...
    Par mmike dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/06/2003, 15h16

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