Bonjour,
Je me penche sur un problème, bientôt, je serai amené à réaliser un schéma pour une base de données SQL. le Sgbd exact n'est pas encore déterminé pour l'instant. Tout ce que je peux dire c'est qu'il ne s'agira pas d'un poids lourd (pas SQL server, DB2 ou oracle donc).
L'application demandée est une gestion de vente/expédition de produits assez banales sur le fond. J'ai déjà une certaine expérience sur la façon de modéliser cela. La difficulté pour moi est qu'il est demandé à l'application de supporter plusieurs langues simultanément.
Les entreprises visées ont des bureaux en France et parfois à l'étranger, et chaque utilisateur de l'entreprise doit pouvoir travailler dans sa langue, voir les noms de produits du catalogue sans sa langue, les catégories dans sa langue etc... Dans l'absolu, chaque poste d'application peut sélectionner une langue différente.
Traduire les menus de l'application n'est pas un problème, ce sont plutôt les entités de la bases de données qui font souci à cause des contraintes suivantes, pour se cantonner à la problématique des produits :
- Les libellés et descriptions des PRODUITS doivent pouvoir être traduits dans plusieurs langue.
- Idem pour toutes les entités liées aux PRODUITS, les noms de CATEGORIES de produits, les noms de MATIERES, les noms des CLASSIFICATIONS, bref...
- L'application possède une langue par défaut, puis N langue(s) additionnelles, nous pensons avec un haut degré de certitude que ce seront 4 langues au maximum qui seront utilisées (donc peut être 2, peut être 3, peut-être une seule suivant les entreprises).
- Lorsque les traductions n'ont pas été saisies, c'est le texte de la langue par défaut qui est utilisé.
Je pense à l'approche suivante :
Une table des langues et une table des libellés par entité :
L'avantage de cette approche est qu'elle me semble plutôt juste et extensible.
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 Table LANGUES Code langue | Nom -------------- ------ FR | Français DE | Deutsch EN | English Table PRODUITS No produit | prix | .... ------------------------- 001 | 5.40 002 | 7.80 Table NOMS_PRODUIT No Produit | code langue | Nom ----------------------------------------- 001 | FR | Casque audio 001 | EN | Headphone
Au niveau des inconvénients, j'en vois plusieurs :
1) Une liste affichant le produit, sa catégorie, sa marque impliquerait vite beaucoup de tables et de nombreuses jointures.
2) Pire encore, si on prend mon exemple ci-dessus le produit 001 n'a pas de nom en allemand, donc je dois écrire le libellé français "casque audio", FR étant la langue par défaut. Cela nécessite du LEFT JOIN à outrance ou la récupération des libellés dans une 2e requête SELECT (aïe le N+1).
3) Il est difficile de sortir un dataset du type
"No_produit", "nom_FR", "nom_DE", "nom_EN", "prix"
Très utile pour la fabrication de rapports d'impression, car celui-ci nécessite un gros SELECT puis ensuite le "pivotage" les lignes en colonnes en éliminant soigneusement les doublons.
En gros, parmi les solutions possibles :
J'envisage, pour chaque produit, de générer automatiquement les noms manquants en utilisant la langue de référence, ainsi :
Cela semble contraire aux bonnes pratiques, crée de la redondance, mais me permet d'utiliser des INNER JOIN dans mes selects plutôt que de traiter systématiquement la non-existence d'une langue. Bref c'est un sacrifice qui me semble intéressant de par la simplification qu'il apporte à mes requêtes d'extraction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 No Produit | code langue | Nom ----------------------------------------- 001 | FR | Casque audio 001 | EN | Headphone 001 | DE | Casque audio (créé automatiquement)
Reste le point 3 qui me pose vraiment problème... J'en suis presque arriver à penser à mettre 4 colonnes "noms" directement dans le produit (sachant que nous ne géreront que 4 langues au maximum) et laisser l'application décider quelle langue afficher mais c'est déplacer le problème dans l'application en l'obligeant à toujours "choisir" quelle colonne prendre en compte. En revanche ça a l'avantage d'être pratique pour les listes et le reporting...
Bref, si quelqu'un a une expérience à partager avec moi sur ce genre de problème, ou des suggestions, n'hésitez pas.
Partager