PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Meilleure pratique pour stocker des chaînes multilingues

Assurez-vous d'abord que les paramètres régionaux de la base de données peut traiter différentes langues. Utilisez un codage de serveur UTF-8. Définissez éventuellement LC_COLLATE = 'C' pour être sur un terrain neutre ou utilisez une collation pour votre première langue pour avoir un ordre de tri par défaut. Commencez par lire le chapitre Collation Support dans le manuel.

Je vous suggère fortement d'utiliser la dernière version de PostgreSQL (9.1 au moment de la rédaction) car elle offre une prise en charge supérieure du classement.

En ce qui concerne la structure de table :rester simple. Il semble qu'il y ait un nombre faible et fixe de langues à gérer. Vous pourriez alors avoir une colonne pour chaque langue :

CREATE TABLE txt (
  txt_id serial PRIMARY KEY
 ,txt    text NOT NULL -- master language NOT NULL?
 ,txt_fr text -- others can be NULL?
 ,txt_es text
 ,txt_de text
);

C'est assez efficace, même avec de nombreuses langues. Le stockage NULL est très bon marché.
Si vous devez gérer un nombre variable de langues, un tableau séparé peut être la meilleure solution. Cette solution suppose que vous disposez d'un "langage maître", où la chaîne est toujours présente :

CREATE TABLE txt (
  txt_id serial PRIMARY KEY
 ,txt    text NOT NULL -- master language NOT NULL?
);

CREATE TABLE lang (
  lang_abbr text PRIMARY KEY -- de, es, fr, ...
 ,lang      text NOT NULL
 ,note      text
);

Ou, si une abréviation (deux lettres) suffit, créez simplement un enum taper pour identifier la langue.

CREATE TABLE txt_trans (
  txt_id    int REFERENCES txt(txt_id) ON UPDATE CASCADE ON DELETE CASCADE
 ,lang_abbr text REFERENCES lang(lang_abbr) ON UPDATE CASCADE
 ,txt       text NOT NULL -- master language NOT NULL?
 ,CONSTRAINT txt_trans_pkey PRIMARY KEY (txt_id, lang_abbr)
);

Non traiter la langue principale de manière spéciale et conserver toutes les variantes de langue dans le même tableau peut simplifier la gestion dans votre application. Mais cela dépend vraiment de vos besoins.