tôi đang tìm kiếm ý kiến nếu vấn đề sau đây có thể có một/khác nhau/giải pháp chung tốt hơn:Cơ sở dữ liệu địa hóa
Tôi có một cơ sở dữ liệu cho các sản phẩm, trong đó có tên của các sản phẩm bằng tiếng Anh (ngôn ngữ mặc định của ứng dụng này) và tôi cần bản dịch của các tên nếu có.
Hiện nay tôi đã thiết lập này:
Một bảng sản phẩm
CREATE TABLE products
(
id serial NOT NULL,
"name" character varying(255) NOT NULL,
CONSTRAINT products_pkey PRIMARY KEY (id)
)
và một bảng nội địa hóa sản phẩm
CREATE TABLE products_l10n
(
product_id serial NOT NULL,
"language" character(2) NOT NULL,
"name" character varying(255) NOT NULL,
CONSTRAINT products_l10n_pkey PRIMARY KEY (product_id, language),
CONSTRAINT products_l10n_product_id_fkey FOREIGN KEY (product_id)
REFERENCES products (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE
)
và tôi sử dụng các truy vấn sau đây để lấy một danh sách các sản phẩm địa phương (tiếng Đức trong trường hợp này) với dự phòng sang tên tiếng Anh mặc định:
SELECT p.id, COALESCE(pl.name, p.name)
from products p LEFT
JOIN products_l10n pl ON p.id = pl.product_id AND language = 'de';
Mã SQL nằm trong phương ngữ postgres. Dữ liệu được lưu dưới dạng UTF-8.
Cơ sở dữ liệu không thể tối ưu hóa một trường ký tự (2) như là tích phân - vì mã ngôn ngữ ISO 639-1 dễ đọc hơn so với số nguyên nếu có vấn đề. – Fionn
Tôi đã nghĩ chính xác điều tương tự. Trong nháy mắt thứ hai, sử dụng một lớp bổ sung có một số ưu điểm: có thể liệt kê tất cả các ngôn ngữ có sẵn/được cấu hình (hữu ích trong GUI), bạn có thể xóa toàn bộ ngôn ngữ (với ràng buộc DB) và ngăn chặn "lỗi chính tả". Mặc dù sau này không quan trọng khi sử dụng 2 mã char;) – kazu