回答

11

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

治療的主要語言的特殊和保持所有語言版本在同一表可能使在處理您的應用程序更簡單。但這取決於你的要求。

+0

您如何看待使用JSON數據類型來存儲由語言環境代碼鍵入的附加值? – 2016-10-02 21:47:39

+0

@JeremyBaker:數據類型「json」是一個很好的解決方案,可用於大量可能變化的屬性。對於一個擁有衆所周知的屬性的人來說(比如在這個例子中)就不那麼重要了。這取決於完整的圖片。當問這個問題時,Postgres 9.2有非常基本的json支持。由於添加了'jsonb',因此事情已經有了很大的改進,... – 2016-10-03 01:58:43