PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Prática recomendada para armazenar strings multilíngues


Primeiro, certifique-se de que a localidade do banco de dados pode lidar com diferentes idiomas. Use uma codificação de servidor UTF-8. Opcionalmente, defina LC_COLLATE = 'C' para estar em terreno neutro ou use um agrupamento para seu primeiro idioma para ter uma ordem de classificação padrão. Comece lendo o capítulo Suporte de agrupamento no manual.

Eu sugiro fortemente que você use a versão mais recente do PostgreSQL (9.1 no momento da escrita) porque ela tem suporte superior para agrupamento.

Quanto à estrutura da tabela :mantenha simples. Parece que há um número baixo e fixo de idiomas para lidar. Você poderia apenas ter uma coluna para cada idioma então:
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
);

Isso é bastante eficaz, mesmo com muitos idiomas. O armazenamento NULL é muito barato.
Se você tiver um número variável de idiomas para lidar, uma tabela separada pode ser a melhor solução. Esta solução pressupõe que você tenha uma "linguagem mestre", onde a string está sempre presente:
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, se uma abreviação (de duas letras) for suficiente, basta criar um enum digite para identificar a língua.
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)
);

Não tratar o idioma mestre de forma especial e manter todas as variantes de idioma na mesma tabela pode simplificar o manuseio em seu aplicativo. Mas isso realmente depende de suas necessidades.