Primero asegúrese de que la región de la base de datos
puede tratar con diferentes idiomas. Utilice una codificación de servidor UTF-8. Opcionalmente establezca LC_COLLATE = 'C'
estar en un terreno neutral o usar una colación para que su primer idioma tenga un orden de clasificación predeterminado. Comience leyendo el capítulo Soporte de intercalación
en el manual.
Le sugiero encarecidamente que use la última versión de PostgreSQL (9.1 en el momento de escribir este artículo) porque tiene un soporte de intercalación superior.
En cuanto a la estructura de la tabla :mantenlo simple. Parece que hay un número fijo y bajo de idiomas con los que lidiar. Entonces podría tener una columna para cada idioma:
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
);
Esto es bastante efectivo, incluso con muchos idiomas. El almacenamiento NULL es muy económico.
Si tiene que lidiar con un número variable de idiomas, una tabla separada podría ser la mejor solución. Esta solución asume que tiene un "idioma maestro", donde la cadena siempre está 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
);
O, si una abreviatura (de dos letras) es suficiente, simplemente cree un enum
escribir
para identificar el idioma.
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)
);
No tratar el idioma maestro de manera especial y mantener todas las variantes de idioma en la misma tabla podría simplificar el manejo en su aplicación. Pero realmente depende de sus requisitos.