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

Requêtes MySQL Discussion :

gestion des enter dans une valeur de champ


Sujet :

Requêtes MySQL

  1. #1
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut gestion des enter dans une valeur de champ
    Mon champ 'accession' est composé d'une liste de mots séparés par un enter. Afin de pouvoir effectuer une requête où cette valeur entre dans la clause where, je suis obligée de transformer ces enter en simples espaces ... je ne sais pas si c'est clair.
    A l'écran, quand j'affiche le contenu de la table, mes mots sont répartis sur plusieurs lignes dans une même cellule. Par contre quand je récupère ces valeurs via un programme, celles-ci sont séparées par un espace. De même quand je veux effectuer une requête via mon programme, je dois utiliser des espaces entre mes mots.
    Est-ce une mauvaise idée d'utiliser des enter dans des valeurs de champs?



    Merci,

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Citation Envoyé par Jasmine80 Voir le message
    Est-ce une mauvaise idée d'utiliser des enter dans des valeurs de champs?
    Oui.
    Surtout ce n'est pas en formes normales.
    Une colonne ne devrait pas contenir de valeurs tabulaires.
    Il vaut mieux faire une table secondaire qui contiendra chacun des mots et, en FK, la PK de la ligne de la table mère.

    J'ajoute deux choses, si un mot peut avoir plusieurs mères, il faudrait même faire une table de relation entre la table mots et la table principale, dans laquelle table de relation on migrerait, en FK, l'identifiant du mot dans sa table et l'identifiant de la ligne concernée de la table principale.
    Cette table aurait donc autant de lignes pour un mot que de lignes de la table principale concernées par ce mot.
    Pour l'affichage, jointures (MySQL est un SGBDR R comme Relationel, ce qui se traduit, la plupart du temps, par des jointures) et, éventuellement, GROUP_CONCAT pour récupérer la liste des mots dans une seule colonne.

  3. #3
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    J'ai donc ma table fungi2 dont la clé primaire ID est un nombre auto incrémenté. J'ai également deux autres champs, champ SEQUENCE et champ ACCESSION. Une séquence n'a généralement qu'une seul accession mais assez souvent 2 ou 3 et une de mes entrées en à plus de 200 (mais c'est cas unique).


    Une colonne ne devrait pas contenir de valeurs tabulaires.
    Il vaut mieux faire une table secondaire qui contiendra chacun des mots et, en FK, la PK de la ligne de la table mère.
    Les espaces (dans mon cas) sont-ils également des valeurs tabulaires?
    Donc si un champ peut avoir plusieurs valeurs (ensemble d'identifiants) il vaut mieux crée une table secondaire (en opposition à une valeur étant une phrase séparée par des espaces qui reste évidemment en un seule morceau).

    J'ajoute deux choses, si un mot peut avoir plusieurs mères, il faudrait même faire une table de relation entre la table mots et la table principale, dans laquelle table de relation on migrerait, en FK, l'identifiant du mot dans sa table et l'identifiant de la ligne concernée de la table principale.
    Ces mots sont uniques.


    Donc

    Table principale

    ID (PK)
    SEQUENCE


    Table secondaire
    PK
    ID (FK)
    ACCESSION



    Juste une remarque, ces tables sont manipulées via des scripts qui récupèrent les valeurs des champs. Est-il même dans ce cas là préférable d'utiliser plusieurs tables? Mon script a très vite fait de récupérer la liste d'accessions séparés par des espaces et de les individualiser alors que d'utiliser une requête avec jointure serait peut-être lourd. Néanmoins c'est vrai que cela serait beaucoup plus propre que de jouer avec des espaces.


    Merci pour ton aide.

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    On gagne toujours à respecter la logique de l'algèbre relationnelle aussi longtemps que possible. Restons sur une approche rigoureuse des dépendances fonctionnelles. Ces mots, séparés par des espaces, n'ont pas de dépendance fonctionnelle entre eux autre que d'être rattachés à la table mère.
    Donc, je ferais de chacun d'eux une ligne d'une table en relation avec la table mère. Les autres considérations m'apparaissent ici insignifiantes à côté des avantages à préserver les formes normales.

  5. #5
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Merci pour ces conseils, je vais regarder comment retructurer tout cela

    Cela me fera donc 5 tables avec lesquelles jongler : la mère, les 3 filles et la table des identifiants (accession).

  6. #6
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Si je regroupe les 3 filles en une fille unique, il ne me restera donc plus que 3 tables (t_principale, t_fille, t_accessions).

    Pour ce qui est de la table contenant les valeurs d'accessions, utiliser un programme qui va découper mon champ contenant les accessions séparés par des espaces (de ma table principale) et les placer dans des champs individuels de ma nouvelle table_accession me semble nécessaire.

    Ce qui m'inquiète un peu est que je vais devoir créer plus de 200 champs : PK, ID_t_principale (FK), de aac1 à acc200 ... comment pourrais-je la créer autrement que par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for n (1..nbr_max_acc){ajouter dans la requête SQL création table "ACCn VARCHAR(20), "}
    et la remplir chaque entrée autrement que par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(existe acc){ajouter ce champ dans la table}
    et pour mes requêtes ultérieures sur t_accessions comment pourrais-je dire (dans mon JOIN)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Acc1, ..., Acc_dernier FROM t_accessions


    Merci,

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Si je regroupe les 3 filles en une fille unique, il ne me restera donc plus que 3 tables (t_principale, t_fille, t_accessions).
    On est d'accord.
    Citation Envoyé par Jasmine80 Voir le message
    Pour ce qui est de la table contenant les valeurs d'accessions, utiliser un programme qui va découper mon champ contenant les accessions séparés par des espaces (de ma table principale) et les placer dans des champs individuels de ma nouvelle table_accession me semble nécessaire.

    Ce qui m'inquiète un peu est que je vais devoir créer plus de 200 champs : PK, ID_t_principale (FK), de aac1 à acc200 ... comment pourrais-je la créer autrement que par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for n (1..nbr_max_acc){ajouter dans la requête SQL création table "ACCn VARCHAR(20), "}
    Que nenni, tu vas créer une table PK, ID_t_principale (FK), ACC VARCHAR(20) (Rappel des formes normales : pas de données tabulaires dans une colonne, ni de tabulation de colonnes)
    Citation Envoyé par Jasmine80 Voir le message
    et la remplir chaque entrée autrement que par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(existe acc){ajouter ce champ dans la table}
    Là, effectivement, ça sera plus simple de passer par un langage procédural, genre php, pour construire un fichier texte que tu chargeras ensuite dans la table par LOAD DATA
    Citation Envoyé par Jasmine80 Voir le message
    et pour mes requêtes ultérieures sur t_accessions comment pourrais-je dire (dans mon JOIN)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Acc1, ..., Acc_dernier FROM t_accessions
    Non, tu feras une jointure entre la t_principale et table t_accessions pour sélectionner les acc dans un GROUP_CONCAT avec un GROUP BY ID_t_principale.

  8. #8
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Que nenni, tu vas créer une table PK, ID_t_principale (FK), ACC VARCHAR(20) (Rappel des formes normales : pas de données tabulaires dans une colonne, ni de tabulation de colonnes)
    Là je coince, j'ai raté une étape, cette table n'aura donc que 3 champs.
    PK, ID_t_principale (FK), ACC VARCHAR(20)
    1, 2596, ACC2365
    2, 2596, ACC36214
    3, 2596, ACC4587
    4, 564, ACC3652
    5, 564, ACC857


    Citation Envoyé par Maljuna Kris Voir le message
    Là, effectivement, ça sera plus simple de passer par un langage procédural, genre php, pour construire un fichier texte que tu chargeras ensuite dans la table par LOAD DATA
    J'ai 3 fichiers textes (une par fille) contenant les valeurs séparées par une tabulation de tous mes champs (sauve le champ accession dont les valeurs sont séparées par des espaces). Une entrée = une ligne.
    Il me suffirait donc de créer un fichier unique, une ligne par accession :
    \tID_t_principale (FK)\tACC VARCHAR(20)


    Merci,

  9. #9
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    J'ai 3 fichiers textes (une par fille) contenant les valeurs séparées par une tabulation de tous mes champs (sauve le champ accession dont les valeurs sont séparées par des espaces). Une entrée = une ligne.
    Il me suffirait donc de créer un fichier unique, une ligne par accession :
    \tID_t_principale (FK)\tACC VARCHAR(20)
    La colonne accession, dont les valeurs sont séparées par des espaces, doit être morcelée [explode() ou split()] en autant de lignes que de mots séparés par des espaces.
    Chaque ligne aura son id PK, son tID_t_principale (FK)\tACC VARCHAR(20)

  10. #10
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    La colonne accession, dont les valeurs sont séparées par des espaces, doit être morcelée [explode() ou split()] en autant de lignes que de mots séparés par des espaces.
    Chaque ligne aura son id PK, son tID_t_principale (FK)\tACC VARCHAR(20)
    Oui, oui, j'ai bien compris. Merci.

  11. #11
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    J'essaie de créer ma table. Je ne comprends pas ce qui est expliqué dans le manuel MySQL pour CREATE TABLE au sujet de la clé étrangère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [CONSTRAINT [symbol]] FOREIGN KEY
            [index_name] (index_col_name,...) [reference_definition]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE TABLE fungi_accessions  (Num SMALLINT(3) NOT NULL AUTO_INCREMENT PRIMARY KEY, id SMALLINT(10) NOT NULL FOREIGN KEY, Accession VARCHAR(20) NOT NULL) ENGINE = InnoDB
    Il faut bien que j'indique à quoi doit être lié ma clé étrangère (champ id de la table fungi2 de la même base de données).

    Comment dois-je procéder?

    Pour les autres moteurs de stockage que InnoDB, MySQL analyse la clause FOREIGN KEY de la commande CREATE TABLE, mais ne l'utilise pas et ne la stocke pas.
    J'ai choisi le type InnoDB car ça semble mieux FOREIGN KEY


    Merci,

  12. #12
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Connais-tu DBDesigner ?
    Je pense que cet outil libre t'apporterait une aide précieuse durant cette phase de conception de ta base de données.
    Totalement compatible avec MyQSL, l'outil sait faire une rétro-conception d'une base existante et la synchronisation entre le schéma et la base facilite grandement la maintenance.
    Il sait générer la migration des clefs étrangères et lors de la création d'une relation n,m entre deux tables, il crée automatiquement la table d'interface en y migrant les clés étrangères des deux tables mères.
    En outre, la visualisation relationnelle graphique de la base et la possibilité de construire dynamiquement des requêtes en jointure et de les exécuter sur le serveur supprime une bonne partie de l'abstraction qui déroute tant le débutant.
    Enfin, je suis en train de finaliser la traduction du guide utilisateur en français (il ne me reste plus qu'un demi chapitre à traduire, et, last but not least, la relecture et la refonte des illustrations avec la version française)
    Alors, tentée ?

  13. #13
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Connais-tu DBDesigner ?
    Je pense que cet outil libre t'apporterait une aide précieuse durant cette phase de conception de ta base de données.
    ...
    Alors, tentée ?
    Je viens de faire une recherche sur le net, ce logiciel parait très utile ... mais est-ce vraiment bien quand on veut apprendre SQL? Si il fait toutes les commandes pour nous, comment évoluer? Je suppose qu'à partir du modèle de notre DB il nous montre les commandes qu'il a effectuer mais ce n'est pas aussi éducatif que de devoir chercher par soi-même ce qu'il faut écrire.

    Ce que j'aimerais faire est-il si difficile à réaliser sans outil extérieur? Note que si c'est pour faire quelque chose de bancal 'manuellement', probablement vaut-il mieux le faire 'automatiquement'.

  14. #14
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par Jasmine80 Voir le message
    Note que si c'est pour faire quelque chose de bancal 'manuellement', probablement vaut-il mieux le faire 'automatiquement'.
    D'autant que ce n'est pas aussi 'automatique' que cela.
    Ton souci de bien apprendre est tout à fait honorable, mais ce n'est pas parce que tu passes ton permis de conduire que tu dois aussi avoir un BTS en mécanique automobile et en carrosserie.
    Et dans une conduite de projet, toute assistance qui te dégage de contingences te permet de reporter ton attention sur d'autres points.

  15. #15
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Je progresse, j'ai réussi à créer ma table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE fungi2_accessions  (
    Num SMALLINT(3) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    id SMALLINT(10) NOT NULL, 
    Accession VARCHAR(20) NOT NULL,
    FOREIGN KEY (id) REFERENCES fungi2 (id),
    FOREIGN KEY (id) REFERENCES fungi2_consensus (id))
    Oui, ça me fera gagner du temps, puis je ne dois pas créer des tables avec clé étrangères tous les jours. Je vais plutôt m'appliquer à bien connaître la syntaxe des requêtes que je dois faire sur mes tables, ça me sera bien plus utile. Je vais installer DBDesigner et voir comment cela fonctionne. Merci pour ce tuyau.

  16. #16
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Comment peux-tu avoir deux contraintes de clef étrangère sur la même colonne ?

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

Discussions similaires

  1. [VB2005] Gestion des évenement dans une fonction
    Par arnolem dans le forum Windows Forms
    Réponses: 8
    Dernier message: 24/07/2006, 09h07
  2. Gestion des buffers dans une fonction
    Par JiJiJaco dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2006, 11h20
  3. gestion des utilisateurs dans une solution 3-tiers
    Par nadia lydia dans le forum Oracle
    Réponses: 3
    Dernier message: 26/10/2005, 12h58
  4. [Conception] Gestion des accents dans une base de données
    Par MiJack dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/07/2005, 11h41
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

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