Лучшая практика для хранения многоязычных строк - PullRequest
9 голосов
/ 27 марта 2012

Мне нужно хранить разные версии не очень длинных строк для разных языков (2-4 языка) в таблице Postgres.

Каков наилучший способ сделать это?Массив или JSON или что-то в этом роде?

1 Ответ

13 голосов
/ 27 марта 2012

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

Не особый подход к основному языку и сохранение всех вариантов языка в одной таблице может упростить обработку в вашем приложении.Но это действительно зависит от ваших требований.

...