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 :

Plusieurs colonnes de meme type?


Sujet :

SGBD

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Plusieurs colonnes de meme type?
    Bonjour a tous,
    j'ai simplement une question a propos de normalisation:

    Si dans une table je dois entrer du texte (par exemple des intructions) en plusieurs langues, disons anglais, francais, et espagnol, je vais bien sur etre tente de creer une colonne 'anglais', une colonne 'francais', et une colonne 'espagnol'.
    Mais bien sur ca veut dire que j'aurai 3 colonnes du meme type, pas tres bon pour la normalisation j'imagine... Ou bien tout mettre dans la meme colonne et m'arranger avec une petite fonction PHP pour les separer quand je resors les donnees...
    Est-ce que quelqu'un pourrait m'indiquer la meilleure marche a suivre dans ce genre de situations?

    Merci beaucoup, jespere que j'ai ete clair

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Une pratique courante est d'utiliser une table de libellés, qui permette de sélectionner la langue en fonction de l'utilisateur.
    On accède alors aux libellés traduits au travers d'une vue :

    Soit la table à traduire, qui comporte un identifiant, deux libellés (à traduire dans la langue de l'utilisateur) et d'autres valeurs (qui n'ont pas besoin d'être traduites) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE  My_Table
      ( Id    INTEGER     --  L'identifiant de la table
      , Lib1  VARCHAR(n)  --  Le premier libellé dans la langue courante
      , Lib2  VARCHAR(n)  --  Le second libellé dans la langue courante
      , Other_Values ...
      )
    ;
    Il nous faut une table pour connaître la langue de chaque utilisateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE  My_Users_Language
      ( User_Name VARCHAR(30)   --  Nom d'utilisateur
      , Language  VARCHAR(2)    --  Langue de l'utilisateur
      )
    ;
    Première version : Pour chaque table à traduire, je crée une table de traductions et une vue traduite
    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
    18
    19
    20
    21
    CREATE TABLE  My_Table_Translations
      ( Id    INTEGER     --  L'identifiant de la table
      , Language    VARCHAR(2)    --  Code de la langue
      , Lib1  VARCHAR(n)  --  Le premier libellé dans la langue donnée
      , Lib2  VARCHAR(n)  --  Le second libellé dans la langue donnée
      )
    ;
    CREATE VIEW My_Table_Translated
    AS  SELECT  src.Id                    --  L'identifiant de la table
              , COALESCE(trs.Lib1, src.Lib1) AS  Lib1  --  Le premier libellé dans la langue de l'utilisateur
              , COALESCE(trs.Lib2, src.Lib2) AS  Lib2  --  Le second libellé dans la langue de l'utilisateur
              , src.Other_Values          --  Les autres colonnes de la table
        FROM    My_Users_Language  usr
          CROSS JOIN
                My_Table  src
          LEFT JOIN
                My_Table_Translations trs
                ON  src.Id  = trs.Id
          WHERE usr.User_Name   = CURRENT_USER  --  Identifier la langue de l'utilisateur
            AND trs.Language    = usr.Language
    ;
    Deuxième version : Je crée une seule table de traductions et une vue traduite pour chaque table à traduire
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    CREATE TABLE  My_Translations
      ( Table_Name  VARCHAR(30)   --  Nom de la table traduite
      , Column_Name VARCHAR(30)   --  Nom de la colonne traduite
      , Language    VARCHAR(2)    --  Code de la langue
      , Translated  VARCHAR(250)  --  Libellé traduit
      )
    ;
    CREATE VIEW My_Table_Translated
    AS  SELECT  src.Id                    --  L'identifiant de la table
              , COALESCE(tr1.Translation, src.Lib1) AS  Lib1  --  Le premier libellé dans la langue de l'utilisateur
              , COALESCE(tr2.Translation, src.Lib2) AS  Lib2  --  Le second libellé dans la langue de l'utilisateur
              , src.Other_Values          --  Les autres colonnes de la table
        FROM    My_Users_Language  usr
          CROSS JOIN
                My_Table  src
          LEFT JOIN
                My_Translations tr1       --  Les libellés de la colonne My_Table.Lib1
                ON  src.Id  = tr1.Id
                AND tr1.Table_Name  = 'My_Table'
                AND tr1.Column_Name = 'Lib1'
          LEFT JOIN
                My_Translations tr2       --  Les libellés de la colonne My_Table.Lib2
                ON  src.Id  = tr2.Id
                AND tr2.Table_Name  = 'My_Table'
                AND tr2.Column_Name = 'Lib2' 
          WHERE usr.User_Name   = CURRENT_USER  --  Identifier la langue de l'utilisateur
            AND tr1.Language    = usr.Language
            AND tr2.Language    = usr.Language
    ;
    Dans la deuxième version, les vues sont plus complexes, mais le nombre de tables est limité. Il est aussi plus facile de soumettre la liste des libellés à un traducteur.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 15
    Points
    15
    Par défaut Colonnes du meme type
    Merci beaucoup, al1_24, pour ta reponse tres complete. Ca va me prendre quelque temps pour bien la comprendre (je suis franchement debutant en BDD).
    Un petite precision cependant: si je comprends bien, dans My_Table, il y a plusieurs colonnes du meme type (Lib1,Lib2,...). Est-ce que ca peut etre un probleme?
    Par exemple, si tu fais une table d'utilisateur, est-ce que c'est possible de creer une colonne 'telephone', et une autre 'telephone portable' dans la meme table, ou bien c'est le genre de truc a eviter?

Discussions similaires

  1. Réponses: 5
    Dernier message: 22/11/2010, 18h20
  2. renommer plusieurs colonnes au meme temps
    Par nadine7 dans le forum Débuter
    Réponses: 3
    Dernier message: 30/01/2009, 12h15
  3. Réponses: 1
    Dernier message: 07/10/2008, 15h49
  4. Réponses: 7
    Dernier message: 24/01/2008, 10h29
  5. Update de plusieur colonne d'une meme table
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/09/2006, 09h25

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