Първо се уверете, че локал на базата данни
може да работи с различни езици. Използвайте UTF-8 сървърно кодиране. По желание задайте LC_COLLATE = 'C'
да сте на неутрална почва или да използвате съпоставяне за вашия първи език, за да имате ред на сортиране по подразбиране. Започнете, като прочетете главата Поддръжка за съпоставяне
в ръководството.
Бих силно препоръчал да използвате най-новата версия на PostgreSQL (9.1 към момента на писане), защото има превъзходна поддръжка за сортиране.
Що се отнася до структурата на таблицата :не го усложнявай. Изглежда, че има малък, фиксиран брой езици, с които да работите. Тогава можете просто да имате колона за всеки език:
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
);
Това е доста ефективно, дори и с много езици. NULL хранилището е много евтино.
Ако трябва да работите с различен брой езици, отделна таблица може да е по-доброто решение. Това решение предполага, че имате "основен език", където низът винаги присъства:
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
);
Или, ако (двубуквено) съкращение е достатъчно, просто създайте enum
тип
за идентифициране на езика.
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)
);
Не третирането на главния език специално и запазването на всички езикови варианти в една и съща таблица може да направи обработката във вашето приложение по-лесна. Но наистина зависи от вашите изисквания.