Cette question concerne une question un peu plus compliquée que celle qui a déjà été abordée dans ces anciennes questions, qui sont toutes des doublons les unes des autres:
Suggestion pour la structure de la base de données pour le multilingue (juin 2011)
Quelle est la meilleure structure de base de données pour conserver des données multilingues? (Fév 2010)
Quelles sont les meilleures pratiques pour la conception de bases de données multilingues? (Mai 2009)
Schéma d'une base de données multilingue (2008 nov)
Le schéma de base de données le plus populaire pour sauvegarder des interfaces utilisateur multilingues semble avoir tous les textes traduits de toutes les langues dans un tableau à 3 colonnes: l'identifiant du texte, le code de la langue et le texte lui-même. L'identifiant du texte et le code de langue constituent ensemble la clé primaire.
C'est très bien, mais considérons maintenant une complication: supposons que les textes doivent être consultables. Supposons, par exemple, qu'il s'agit d'une boutique en ligne multilingue. Cela signifie que pour chaque catégorie de produits entrée dans la base de données, le propriétaire de la boutique entrera le nom de la catégorie de produits dans chacune des N langues prises en charge, puis le client pourra rechercher la catégorie de produits par son nom, dans leur propre langue .
Il y a un problème: le classement .
Différentes langues ont des séquences de classement différentes et la séquence de classement qui fonctionne pour une langue ne fonctionne pas pour une autre. Donc, si tous les textes de toutes les langues sont sur une seule colonne, quelle séquence de classement vont-ils avoir? Comment allons-nous interroger la base de données pour trouver l'ID de texte d'un texte spécifique? Alors que dans une recherche de produit Web, la précision et les performances peuvent ne pas être extrêmement importantes, aux fins de cette discussion, supposons qu'elles importent vraiment.
La plupart des administrateurs de base de données connaissent le concept de classement dans le sens de "classement de la base de données". Heureusement, ce n'est que le classement par défaut, qui est utilisé si aucune autre information de classement n'est présente, mais il existe également d'autres endroits, où le classement peut être spécifié:
La commande SQL CREATE INDEX prend en charge une spécification de classement. (Bien que des rumeurs disent que Microsoft SQL Server ne le prend pas en charge; quelqu'un le sait-il?)
L'instruction SQL SELECT prend également en charge le classement, mais dans ce cas, la spécification de classement fonctionne comme une fonction, provoquant une analyse d'index au lieu d'une recherche d'index, ce qui pourrait être inadmissible si nous voulons des performances. (Là encore, si c'est le meilleur que nous puissions avoir, cela pourrait être mieux que rien.)
J'entends également que sur Microsoft SQL Server, vous pouvez avoir des colonnes calculées non persistantes sur lesquelles vous pouvez spécifier le classement et créer un index filtré, bien que je n'en ai jamais entendu parler auparavant, et s'il s'agit uniquement de Microsoft-SQL-Server fonctionnalité, alors je préfère ne pas l'utiliser, peu importe à quel point c'est cool et bien pensé.
Donc, à la lumière de tout cela, comment structurer notre base de données et comment effectuer nos requêtes, si l'objectif est une base de données multilingue pouvant être mise à jour et consultable?
Cette question a été inspirée par une discussion qui a eu lieu ici: comment nvarchar (max) stockera-t-il les données dans la base de données sera-t-il rapide si certaines données contiennent moins de 4000 caractères?