我需要在Postgres表中存储不同语言(2-4种语言)的不太长字符串的不同版本。
做到这一点的最好方法是什么?数组或JSON或类似的东西?
发布于 2012-03-27 21:13:47
首先,确保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)
);
而不是,特别对待主语言,并将所有语言变体放在同一个表中,这可能会使应用程序中的处理变得更简单。但这真的取决于你的需求。
https://stackoverflow.com/questions/9889077
复制相似问题