存储多语言字符串的最佳实践

时间:2012-03-27 11:54:59

标签: postgresql database-design internationalization locale collation

我需要在Postgres表中为不同语言(2-4种语言)存储不同版本的不长字符串。

这样做的最佳方式是什么?数组或JSON或类似的东西?

1 个答案:

答案 0 :(得分:12)

首先确保database locale可以处理不同的语言。使用UTF-8服务器编码。 (可选)将LC_COLLATE = 'C'设置为中立或使用第一语言的排序规则来设置默认排序顺序。首先阅读手册中的Collation Support章节。

我强烈建议您使用最新版本的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 storage is very cheap.
如果您要处理不同数量的语言,则单独的表可能是更好的解决方案。此解决方案假定您具有“主语言”,其中字符串始终存在:

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 type来识别语言。

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)
);

将主语言特殊处理并将所有语言变体保留在同一个表中可能会使您在应用中的处理更加简单。但这实际上取决于你的要求。