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

log*_*ord 9 postgresql database-design locale collation internationalization

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

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

Erw*_*ter 13

首先确保数据库区域设置可以处理不同的语言.使用UTF-8服务器编码.(可选)设置LC_COLLATE = 'C'为中性点或使用第一语言的排序规则以具有默认排序顺序.首先阅读手册中的Collat​​ion 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
);
Run Code Online (Sandbox Code Playgroud)

即使使用多种语言,这也非常有效.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
);
Run Code Online (Sandbox Code Playgroud)

或者,如果(两个字母)缩写就足够了,只需创建一个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)
);
Run Code Online (Sandbox Code Playgroud)

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

  • 我希望您能做的一件事是接触使用JSONB字段存储多种语言的可能性“ {“ en_US”:“ hello”,“ fr”:“ bonjour”}` (2认同)
  • 第二种情况看起来不错,但是如果有很多“txt”我们该怎么办:目录、产品、标签等等...... (2认同)