Сначала убедитесь, что языковой стандарт базы данных может работать с разными языками.Используйте кодировку сервера 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)
);
Не особый подход к основному языку и сохранение всех вариантов языка в одной таблице может упростить обработку в вашем приложении.Но это действительно зависит от ваших требований.