Trước tiên hãy đảm bảo rằng database locale có thể xử lý các ngôn ngữ khác nhau. Sử dụng mã hóa máy chủ UTF-8. Tùy chọn đặt LC_COLLATE = 'C'
để ở trên nền trung tính hoặc sử dụng đối chiếu cho ngôn ngữ đầu tiên của bạn để có thứ tự sắp xếp mặc định. Bắt đầu bằng cách đọc chương Collation Support trong sách hướng dẫn.
Tôi thực sự khuyên bạn nên sử dụng phiên bản mới nhất của PostgreSQL (9.1 tại thời điểm viết) vì nó có hỗ trợ đối chiếu cao cấp.
Đối với cấu trúc bảng : hãy đơn giản. Có vẻ như có một số lượng ngôn ngữ cố định thấp để xử lý. Bạn chỉ có thể có một cột cho mỗi ngôn ngữ sau đó:
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
);
Điều này khá hiệu quả, ngay cả với nhiều ngôn ngữ. NULL storage is very cheap.
Nếu bạn có số lượng ngôn ngữ khác nhau để giải quyết, một bảng riêng có thể là giải pháp tốt hơn. Giải pháp này giả định rằng bạn có một "ngôn ngữ bậc thầy", nơi mà các chuỗi luôn luôn hiện diện:
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
);
Hoặc, nếu một (hai chữ) viết tắt là đủ, chỉ cần tạo một enum
type để xác định ngôn ngữ.
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)
);
Không điều trị các ngôn ngữ bậc thầy đặc biệt và giữ tất cả các biến thể ngôn ngữ trong cùng một bảng có thể làm cho việc xử lý trong ứng dụng của bạn đơn giản hơn. Nhưng nó thực sự phụ thuộc vào yêu cầu của bạn.
Bạn nghĩ gì về việc sử dụng loại dữ liệu JSON để lưu trữ các giá trị bổ sung, được khóa bằng mã ngôn ngữ? –
@JeremyBaker: Kiểu dữ liệu 'json' là một giải pháp tốt cho một nhóm lớn các thuộc tính có thể khác nhau. Không quá nhiều cho một bàn tay đầy đủ các thuộc tính nổi tiếng (như trong ví dụ này). Nó phụ thuộc vào bức tranh hoàn chỉnh. Khi câu hỏi này được hỏi, Postgres 9.2 có hỗ trợ json rất cơ bản. Mọi thứ đã được cải thiện rất nhiều kể từ khi, ít nhất bằng cách thêm 'jsonb' ... –