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 :

Conseil de structure questionnaires [MPD]


Sujet :

Schéma

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Points : 88
    Points
    88
    Par défaut Conseil de structure questionnaires
    Bonjour,

    Je dois réaliser un formulaire dans mon application et j'aimerais stocker tout ça.

    En bref, à chaque question il y a des réponses mulitples (des checkbox à cocher) ainsi qu'une case autre qui permet à l'utilisateur de rentrer du texte.

    Voici par exemple, ce que pourrait être une question ainsi que ses réponses.

    Pourquoi avez désinstaller l’application ?
    1. L’application n’a pas fonctionnée
    2. L’application est trop compliquée
    3. L’application ne correspond pas à vos besoin
    4. Autre :


    Si l'utilisateur choisit autre, il peut rentrer quelque chose (une phrase).
    M'aidans de cette discussion (http://www.developpez.net/forums/d63...e/#post3745605) j'ai écris la structure suivante

    Tables :
    1. questionnaires {id_questionnaire, nom_questionnaire}
    2. questions {id_question, id_questionnaire, libellé_question}
    3. choix { id_choix, id_question, , valeur}
    4. participants {id_participant, id_questionnaire, nom, prenom, email, ...}
    5. reponses {id_questionnaire, id_question, id_participant, id_choix, text}


    Exemple d'utilisation:

    table questionnaires:
    1 | Questionnaire désinstallation

    table questions :
    1 | 1 | Pourquoi avez désinstaller l’application ?

    table choix:
    1 | 1 | L’application n’a pas fonctionnée
    2 | 1 | L’application est trop compliquée
    3 | 1| L’application ne correspond pas à vos besoin
    4 | 1 | Autre

    table participants:
    1 | 1 | Nom | Prenom | email

    table reponses :
    1 | 1| NULL | 4 | Je n’ai pas aimé le design


    L'utilisateur n'est pas obliger de rentrer ses informations personnelles, c'est pourquoi j'ai mis en exemple dans la table reponses NULL comme id_participant.

    Voilà, avant de poursuivre plus loin, je voudrais savoir si la structure était correcte étant donné que je suis débutant avec les bases de données.

    Merci d'avance

  2. #2
    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
    On va dire que c'est pas mal pour un début !

    Cependant, quelques petites choses me chiffonent.

    La composition de vos table donne par exemple ces extraits de MCD :
    participants {id_participant, id_questionnaire, nom, prenom, email, ...}
    ==> Participants -0,1----Remplir----0,n- Questionnaire

    Autrement dit, le participant ne peut répondre au maximum qu'à un seul questionnaire.
    Est-ce vraiment ça ?

    questions {id_question, id_questionnaire, libellé_question}
    Idem, une question ne peut appartenir qu'à un seul questionnaire. Pourquoi pas ?
    Mais alors :
    reponses {id_questionnaire, id_question, id_participant, id_choix, text}
    Inutile de précisier l'id_questionnaire puisque la question n'appartient qu'à un seul questionnaire. Il y a redondance inutile d'information.

    Restons sur la composition de cette table reponses...
    Dans tous les cas le choix sera différent de Autre, texte sera NULL, c'est à dire probablement une grande majorité des cas.
    Il vaut mieux séparer cette propriété dans une nouvelle table que nous pourrons appeler réponses_autres (id_question, id_participant, texte_autre)
    Ainsi, pour reprendre votre exemple de données, nous aurions ceci :
    table réponses (id_question, id_participant, id_choix) :
    1 / 1 / 4

    table réponses_autres (id_question, id_participant, texte_autre)
    1 / 1 / Je n’ai pas aimé le design

    Cette table comprendra en principe beaucoup moins de lignes que la table réponses.

    Au passage :
    1) C'est une mauvaise idée de donner le nom text à une colonne car ça peut être interprété comme un type de colonne.
    2) Faites vérifier les textes de vos questions et de vos réponses par un oeil neuf car ceux que vous avez donné sont bourrés de fautes ! Ca ferait mauvais effet sur un programme en production.

    Une denière chose :
    L'utilisateur n'est pas obliger de rentrer ses informations personnelles, c'est pourquoi j'ai mis en exemple dans la table reponses NULL comme id_participant.
    Ca c'est très embêtant car ça supprime la possibilité d'identifier relativement les réponses au couple (question, participant). Il faudrait donc prévoir un identifiant anonyme pour les réponses afin de pouvoir les différencier.
    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 !

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Points : 88
    Points
    88
    Par défaut
    Merci pour cette réponse détaillée

    Je ne vois cependant pas bien ce que vous voulez dire par

    La composition de vos table donne par exemple ces extraits de MCD :

    participants {id_participant, id_questionnaire, nom, prenom, email, ...}

    ==> Participants -0,1----Remplir----0,n- Questionnaire
    En fait, je ne comprend pas cette dernière ligne...

    Quelques précisions:
    Autrement dit, le participant ne peut répondre au maximum qu'à un seul questionnaire.
    Non un participant peut répondre à plusieurs questionnaire, c'est pourquoi j'ai mis le champ id_questionnaire dans la table participants
    Idem, une question ne peut appartenir qu'à un seul questionnaire. Pourquoi pas ?
    Oui une question ne pourra appartenir qu'à un seul questionnaire. Cela ne me gêne pas

    Inutile de précisier l'id_questionnaire puisque la question n'appartient qu'à un seul questionnaire. Il y a redondance inutile d'information.
    Effectivement, vous avez raison, mais je trouvais que c'était plus lisible

    Dans tous les cas le choix sera différent de Autre, texte sera NULL, c'est à dire probablement une grande majorité des cas.
    Il vaut mieux séparer cette propriété dans une nouvelle table que nous pourrons appeler réponses_autres (id_question, id_participant, texte_autre)
    Très bien, je vais séparer cette propriété dans une autre table

    Au passage :
    1) C'est une mauvaise idée de donner le nom text à une colonne car ça peut être interprété comme un type de colonne.
    2) Faites vérifier les textes de vos questions et de vos réponses par un oeil neuf car ceux que vous avez donné sont bourrés de fautes ! Ca ferait mauvais effet sur un programme en production.
    @1. Ok je vais changer, je ne le savais pas
    @2. Ouais désolé j'ai pas été très attentif à l'orthographe dans l'exemple que j'ai donné

    Merci bien

  4. #4
    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
    Je ne vois cependant pas bien ce que vous voulez dire par

    Citation Envoyé par CinéPhil
    La composition de vos table donne par exemple ces extraits de MCD :

    participants {id_participant, id_questionnaire, nom, prenom, email, ...}

    ==> Participants -0,1----Remplir----0,n- Questionnaire
    En fait, je ne comprend pas cette dernière ligne...
    C'est un morceau de MCD, qui est l'acronyme de Modèle Conceptuel de Données, schéma issu de la méthode Merise, très utilisée en France pour modéliser les bases de données et dont vous trouverez un tutoriel sur le blog de SQLPro.

    Ce morceau de MCD signifie en français :
    Un participant peut remplir un seul questionnaire et un questionnaire peut être rempli par plusieurs participants.

    Quelques précisions:
    Citation Envoyé par CinéPhil
    Autrement dit, le participant ne peut répondre au maximum qu'à un seul questionnaire.
    Non un participant peut répondre à plusieurs questionnaire, c'est pourquoi j'ai mis le champ id_questionnaire dans la table participants
    Si un participant peut répondre à plusieurs questionnaires et qu'un questionnaire peut être rempli par plusieurs participants, on a alors le MCD suivant :
    Participant -0,n----Remplir----0,n- Questionnaire

    Ce qui entraîne la création d'une table supplémentaire pour l'association Remplir.
    Remplir (R_IdParticipant, R_IdQuestionnaire)

    Si vous mettez l'identifiant du questionnaire dans la table des participants, comment faites-vous pour enregistrer le fait que le participant n° 1 a rempli les questionnaires 3 et 12 ?
    Seule solution : la table associative Remplir que j'ai décrite ci-dessus.

    Citation Envoyé par CinéPhil
    Inutile de précisier l'id_questionnaire puisque la question n'appartient qu'à un seul questionnaire. Il y a redondance inutile d'information.
    Effectivement, vous avez raison, mais je trouvais que c'était plus lisible
    Ca peut sembler plus lisible au premier abord mais c'est de la redondance d'information qui peut générer des erreurs.
    De plus, la lisibilité dans les tables d'une base de données, on s'en fiche un peu vu qu'on ne la conculte pas directement. C'est un programme utilisateur externe qui va interroger la base de données avec des requêtes SQL et qui affichera les données correctement.

    Sauf si vous utilisez le principe de l'identification relative.
    Dans ce cas, le MCD se représente de cette façon :
    Question -(1,1)----Appartenir----0,n- Questionnaire

    Et l'identifiant de la table Question devient alors le couple (IdQuestionnaire, IdQuestion)

    Ce qui permet de recommencer à 1 le numéro de la question pour chaque questionnaire.
    C'est un peu comme le principe des chambres d'hôtel. Pour identifier toutes les chambres de tous les hôtels d'un groupe hôtelier, il est plus facile de faire ceci :
    Hotel -0,n----Avoir----(1,1)- Chambre

    Ce qui donne les tables :
    Hotel (H_Id, H_Nom...)
    Chambres (C_IdHotel, C_NumChambre...)

    Plutôt que ceci :
    Hotel -0,n----Avoir----1,1- Chambre

    Ce qui donne les tables :
    Hotel (H_Id, H_Nom...)
    Chambres (C_Id, C_IdHotel, C_NumChambre...)
    Avec une contrainte UNIQUE sur le couple (C_IdHotel, C_NumChambre)

    Bon courage pour la suite.
    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 !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 216
    Points : 88
    Points
    88
    Par défaut
    Merci pour ces précisions bien utiles

    J'ai donc crée une nouvelle table pour associer les participants aux formulaires remplis, afin de permettre à une même personne de participer à plusieurs formulaires.

    Salutations

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

Discussions similaires

  1. [Conception] Besoin d'un conseil pour structurer ma base
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/01/2008, 14h02
  2. Conseil de structuration de BDD
    Par LuckyKant dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 15/07/2007, 11h15
  3. Conseils sur structure de programme
    Par RR instinct dans le forum Langage
    Réponses: 6
    Dernier message: 21/09/2006, 14h44
  4. conseil pour structurer un xml
    Par jbat dans le forum Delphi
    Réponses: 2
    Dernier message: 14/07/2006, 07h49
  5. Conseil choix structure STL
    Par SteelBox dans le forum SL & STL
    Réponses: 3
    Dernier message: 15/03/2005, 02h13

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