加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:34:49 所属栏目:百科 来源:网络整理
导读:我需要在Postgres表中为不同语言(2-4种语言)存储不同版本的不长字符串. 这样做的最佳方式是什么?数组或JSON或类似的东西? 首先确保 database locale可以处理不同的语言.使用UTF-8服务器编码. (可选)将LC_COLLATE =’C’设置为中性点,或使用第一语言的排序
我需要在Postgres表中为不同语言(2-4种语言)存储不同版本的不长字符串.

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

首先确保 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)
);

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读