|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Bonjour à tous,
Tout d'abord, désolé si je ne suis pas dans le bon forum. J'ai cherché un forum conception mais je ne l'ai pas trouvé. J'aurai souhaité avoir quelques conseils quant à la conception d'une DB devant gérer des infos en plusieurs langue (2 dans mon cas). Je me rends bien compte que le système que j'ai mis en place actuellement n'est franchement pas top et qu'il faut que je décompose en plusieurs requête ce qui, je pense, aurait pu être fait en une seule si la DB avait été bien conceptualisée. Pour le moment, j'ai quelque chose du genre (les clés primaires sont en gras souligné) : tb_client : - id : int - nom : varchar(100) - langage : smallint - param1 : int - param2 : int ... - paramn : int tb_langage : - id : int - description_fr : varchar(20) - description_nl : varchar(20) tb_param1 : - id : int - description_fr : varchar(100) - description_nl : varchar(100) Je ne vais pas plus loin, je pense que vous avez compris l'idée. Du coup, si je veux imprimer un quelconque rapport (genre une commande par exemple) dans la langue du client, je dois d'abord faire une requête afin d'obtenir la langue du client pour que dans l'application je puisse "créer" la requête en prenant le champ de description correspondant à la langue. En tant que programmeur, je me rend bien compte qu'il y a un problème car si un jour une 3e langue vient s'ajouter, mon application ne sera pas du tout fonctionnelle pour cette dernière. Je cherche donc à modifier la DB (tant pis si ça me prend pas mal de temps à tout refaire) de façon à ce que l'application n'ait pas besoin de traiter la langue. J'ai songé à faire qqch du genre : tb_paramx : - id : int - id_langue : int - description : varchar(100) Mais cela multiplierait le nombre de record de chaque table de paramètre par le nombre de langue utilisée. Et n'ayant aucune "vraie" formation en DB (j'ai lu des trucs par-ci par-là), je m'interroge sur les bienfaits de ce genre de pratique. Je suis donc à la recherche d'avis de gens compétents en la matière pour me conseiller sur l'approche à adopter pour traiter ce genre de cas. Merci d'avance. Griftou. |
|
|
00
|
|
|
#2 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Bonjour,
Citation:
Je n'ai pas saisi le contexte complet de votre environnement. L'idée c'est de créer une table de langues, et une table des traductions. Supposons que le nom de vos clients peut être stocké en Thaï (exemple au hasard ... ou pas Vous aurez donc : - une entité client - une entité langue - une entité client_nom_traduction Les entités client et langue restent à peu près identiques à ce ce que vous avez pour le moment. L'entité client_nom_traduction référence l'entité client et l'entité langue. Pour tout tuple de cette entité, il existe une et une seule traduction. Évidemment c'est un peu lourd si vous avez un nombre conséquent d'entités, mais cela a le mérite d'être flexible et robuste. Pour exposer vos données, je ne sais pas si vous utilisez des procédures stockées, mais il vous suffit alors de passer un paramètre qui définit la langue dans laquelle l'interrogation ou la modification de données doit avoir lieu. Mais visiblement, c'est déjà ce que vous faites. Le forum que vous cherchiez est celui-ci. Si vous réalisez votre implémentation sous SQL Server, nous serons néanmoins ravis de vous aider @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#3 | ||
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Je vous recommande de ne pas faire de table pour chaque champs à traduire mais plutôt pour l'ensemble des éléments sensibles à la langue pour chacune de vos table existante.
Vous devriez d'abord rajouter une table table_langue dans votre DB. Et ensuite pour chaque table table_x une table table_trad_de_x lié à une ligne de table_x et une langue de la table table_langue. Ensuite faite une vue pour chaque table originale. Code :
|
||
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() |
Citation:
Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
||
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Bonjour à tous,
Tout d'abord, merci pour vos réponses. Par contre, peut-être que mon w-e prolongé y est pour quelque chose mais je ne suis pas sûr de bien comprendre tout ce que vous me proposez. D'autant plus que vous semblez vous contredire l'un l'autre ^^. Je vais donc tenter de préciser le contexte de mon problème. J'ai une table qui contient des informations sur des personnes dont voici une partie de la structure (la totalité serait trop longue ) (l'application est destinée à avoir une gestion du personnel interne à l'entreprise plutôt que de passer par un secrétariat social dès qu'on a besoin d'une info)tb_personnel : - registre_national : char(11) : primary key - matricul : char(7) - date_entree : datetime - date_sortie : datetime - nom : varchar(50) - prenom : varchar(50) - adresse : varchar(100) - caractere_juridique_contrat : smallint - categorie_salariale : smallint - etat_civil : smallint - langue : smallint - fonction : smallint - formation : smallint Je pense que cela suffira pour mon problème. J'ai donc chaque membre du personnel représenté dans cette table. A côté de cela, j'ai une table langue qui se compose comme suit : tb_langue : - id : int : primary key (auto inc.) - description_fr : varchar(100) - description_nl : varchar(100) Et en fait, j'ai utilisé la même structure que la table langue pour toutes les autres données qui varient suivant la langue (toutes les colonnes de types smallint dans la table personnel). Exemple--> tb_caractere_juridique_contrat : - id : int : primary key (auto inc.) - description_fr : varchar(100) - description_nl : varchar(100) Déjà, si un jour on veut ajouter une langue, c'est la catastrophe (mais cela a très peu de chance d'arriver). Maintenant, par rapport à vos réponses, ce que je n'ai pas compris c'est s'il me fallait des tables supplémentaires ou bien s'il "suffisait" que je modifie leur structure actuelle. N'étant absolument pas formé en tant que DBA, j'aurai probablement beaucoup de mal à mettre en place la solution vraiment optimale que, j'imagine, vous ne manquerez pas de me proposer. Je recherche juste une solution conceptualisation de la DB qui soit plus flexible et qui ne demande pas de changer de requête dès qu'on change de langue. Au risque de me répéter, j'ai songé à modifier la structure des tables de clés étrangères comme suit (exemple avec caractere_juridique_contrat) : tb_caractere_juridique_contrat : - id : smallint - id_langue : smallint - description : varchar(100) Si je ne me trompe pas, cela résoudrait le problème de requête qu'il faut modifier pour chaque langue. Par contre cela va créer énormément plus de record que la version actuelle de la DB et j'ignore si cela peut poser des problèmes ou non (autres que des problèmes d'espace disque). Concernant vos propositions de vues, de triggers et de procédures stockées, je crains fort de ne pas être compétent pour mettre cela en place à l'heure actuelle (mais des formations sont fort heureusement prévues). Histoire que vous vous rendiez compte de l'état de mes connaissances, mes programmes accèdent tous sur les DB avec le login "sa" et je gère les autorisations au sein de l'application en elle-même car il s'agit là de mon domaine d'expertise. Voilà, vous pouvez jeter les pierres ![]() Griftou. |
|
|
00
|
|
|
#6 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
Il vous faudra, comme je vous l'ai décrit plus haut, ajouter une table pour chaque traduction à réaliser, et c'est ce que vous avez fait avec la table tb_caractere_juridique_contrat. Les requêtes seront en conséquence écrites une seule fois, et vous pourrez ajouter autant de langues que vous voulez. Il est vrai que cela va créer dans les tables de traduction beaucoup de lignes, mais comme votre table a peu de colonnes, les pages qui stockent les données seront très riches. Sous réserve d'une indexation correcte et de requêtes propres, le nombre de lignes des tables de traduction ne devrait donc pas poser problème. Citation:
Elle est composée d'instruction T-SQL, paramétrées ou non. - Une vue est, en SQL, une table particulière, qui est une représentation purement logique (sauf si elle est indexée, mais c'est un cas particulier d'optimisation) d'un ensemble Elle est spécifiée par une requête SELECT et ne peut prendre aucun paramètre. On la manipule comme une table (on l'interroge comme telle, on peut y attacher des triggers, ...) - un trigger est un type particulier de module SQL qui est attaché à une table (ou à une base de données, ou à une instance SQL Server), qui ne peut prendre aucun paramètre. Il exécute un traitement après (AFTER) ou au lieu (INSTEAD OF) qu'un certain type de transaction ait été effectué sur une table et c'est vous qui le choisissez (INSERT/UPDATE/DELETE). Il permet (mais ce n'est pas obligatoire) d'effectuer des traitements à partir des données manipulées par la transaction qui a déclenché le trigger. L'utilisation de triggers dans votre cas ne me semble pas nécessaire. Les vues le seront peut-être, les procédures probablement, mais rien ne vous empêche de faire tout cela côté applicatif. L'avantage des procédures stockées, c'est que côté applicatif, vous ne faites que l'appeler en lui passant des paramètres. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#7 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Merci bien !
Je vais donc m'atteler à modifier tout cela. Griftou. |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Rebonjour,
Je reviens vers vous car j'ai un nouveau souci suite à la modification des tables de ce que j'appelle les paramètres pour gérer les langues. Une fois cela fait, j'ai évidemment voulu recréer également les liaisons entre les différentes tables. Et c'est là que ça coince. Forcément, puisque dans ma table caractere_juridique_contrat (pour continuer avec le même exemple) se trouve repris le même id pour chaque langue (2 fois donc dans mon cas). De ce fait, la contrainte d'unicité pour établir la relation de clé étrangère (toute mes excuses si j'utilise mal le vocabulaire) n'est pas respectée et la relation ne peut se faire. Je conçois donc bien que je dois également tenir compte de la langue mais je ne comprends pas comment cela fonctionne en pratique... Lorsque sur le diagramme je veux faire la liaison, Management Studio me propose bien : 1 : pour la table de clé primaire : - caractere_juridique_contrat - langue 2 : pour la table de clé étrangère : - caractere_juridique_contrat Je pourrais cliquer sur ok et passer à la suite mais je préfèrerais comprendre ce qu'il se passe exactement. Pouvez-vous m'éclairer sur ce point ? (en fait c'est tellement flou que je ne suis même pas certain d'avoir correctement formulé ma demande...) Griftou. |
|
|
00
|
|
|
#9 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Donnez s'il vous plaît le script complet de la table caractere_juridique_contrat avec les colonnes qui doivent être traduites.
De cette façon, ce sera plus concret. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#10 | ||||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Je crois qu'il y a un malentendu du au fait que je ne dois probablement pas utiliser le bon vocabulaire ^^.
Quoi qu'il en soit, voici ce que me donne managament studio pour le script de création de table de caractere_juridique_contrat: Code :
Code :
Le changement des tables pour gérer la langue a été fait, je pense, avec succès. Mon problème maintenant réside dans le fait de créer la relation entre les 2 tables dont je viens de donner le script de création. Griftou. |
||||
|
|
00
|
|
|
#11 | |||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Voici pour la table HumanRessources.caractere_juridique_contrat
Code :
Citation:
De cette façon les jointures se feront sur un entier, et les recherches seront facilitées si vous filtrez sur registre_national. De quelles traduction avez-vous besoin pour la table personnel ? @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|||
|
00
|
|
|
#12 | |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Ah ok !
En fait je n'avais pas du tout compris qu'il me faudrait cette table supplémentaire .De fait, de cette manière la liaison se fera sans souci. Citation:
Pour finir, j'aimerais comprendre en quoi la structure que j'ai donnée n'est pas bonne. Car "sur papier", ça avait l'air de produire le résultat que je recherchais avec moins de table. Griftou. |
|
|
|
00
|
|
|
#13 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
En relisant le sujet, j'ai compris.
Je suppose que pour toutes les colonnes SMALLINT de votre table : - caractere_juridique_contrat - etat_civil - fonction - formation - langue - motif_sortie - nationalite - prepension_cct - regime_travail - regime_travail_effectif - suspension_regime_travail - suspension_type Vous avez une contrainte de clé étrangère qui référence une table dans laquelle vous avez déjà mis des libellés. Donc par exemple pour la table fonction, il faut créer une table fonction_traduction qui aurait : - l'id_fonction en clé étrangère référençant la table fonction - l'id_langue en clé étrangère référençant la table langue - une contrainte de clé primaire sur ces deux colonnes - le libellé de la fonction dans la langue. Et il faut faire pareil pour les autres tables. Je sais, c'est lourd @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#14 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Ha, on a posté en même temps
Citation:
Citation:
En revanche si vous voulez ajouter des langues : - en toute tranquillité - sans changer votre code ni la structure de vos tables - en conservant de bonnes performances C'est ce par quoi il faut passer : une normalisation @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
|
|
#15 | |
|
Membre chevronné
![]() ![]() Inscription : juillet 2006 Messages : 1 194 ![]() |
Citation:
![]() Pourquoi choisir une colonne aux valeurs non séquentielles (registre_national) pour un index cluster plutôt qu'une autre (id) dont les valeurs sont séquentielles ?! |
|
|
|
00
|
|
|
#16 | |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Citation:
C'est tout à fait ça. J'ai oublié de vous le signaler dans ma dernière réponse. Toutes mes excuses. En relisant, il y a quelque chose qui me chipote... Si j'ai bien suivi le bazar, pour les fonctions par exemple, je vais avoir : - l'id de la fonction dans la table personnel ; - l'id de la fonction, l'id de la langue et la traduction adéquate dans la table fonction_traduction; - et dans la table fonction, juste un id tout seul. C'est probablement tout à fait normal et courant dès qu'on veut faire qqch d'un peu poussé mais personnellement, avec le peu d'expérience que j'ai, ça me semble bizarre d'avoir une table avec une seule colonne dedans. Bien à vous, Griftou. |
|
|
|
00
|
|
|
#17 | |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Citation:
Ma question porte sur les tables dont j'ai fourni le script. Ce modèle permettait l'ajout de langues supplémentaires non (bien que je reste sceptique quand au comportement de la table langue) ? |
|
|
|
00
|
|
|
#18 | |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Citation:
Une autre possibilité est de stocker la description (par exemple en Anglais) dans la table fonction, et les autres traductions dans la table fonction_traduction. Si vous faites cela, il vous faudra rajouter une contrainte de domaine CHECK qui exclue la langue Anglaise. @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 300 ![]() |
Ok, si c'est normal, pas de souci, je vais faire comme ça. Pour la contrainte de domaine check, mes connaissances en math me permettent de comprendre de quoi vous parler mais mes connaissances en base de données se limite à la création d'une db, l'ajout d'une clé primaire et éventuellement d'une clé étrangère.
Bref, les bases pour gérer des systèmes très simples. Alors je vais me contenter de la table avec juste un id
|
|
|
00
|
|
|
#20 | ||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 669 ![]() |
Ha ben non !
Une contrainte de domaine permet de vérifier la validité d'une valeur par rapport à une règle métier simple. Code :
@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||
|
00
|
Copyright © 2000-2012 - www.developpez.com