PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Най-добра практика за съхраняване на многоезични низове

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

Не третирането на главния език специално и запазването на всички езикови варианти в една и съща таблица може да направи обработката във вашето приложение по-лесна. Но наистина зависи от вашите изисквания.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразувайте bytea в двойна точност в PostgreSQL

  2. Вмъкване на подготвен израз в база данни - PSQL

  3. DISTINCT с два array_agg (или един array_agg с кортеж вътре)?

  4. Множество бази данни в docker и docker-compose

  5. Влияе ли на производителността, ако таблицата съдържа много неизползвани/неизбрани колони?