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.