я ищу мнение, если следующая проблема может быть, есть лучше/другое/общее решение:базы данных локализации
У меня есть база данных для продуктов, который содержит имена продуктов на английском языке (языке по умолчанию этого приложения), и мне нужны переводы имен, если они доступны.
В настоящее время у меня есть эта установка:
таблица продукт
CREATE TABLE products
(
id serial NOT NULL,
"name" character varying(255) NOT NULL,
CONSTRAINT products_pkey PRIMARY KEY (id)
)
и таблица локализации продукта
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
)
и я использую следующий запрос, чтобы получить список локализованных продуктов (немецкий в этом случае) с возвратом к английским названиям по умолчанию:
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';
Код SQL находится в диалоговом окне postgres. Данные хранятся как UTF-8.
Не следует ли, чтобы база данных могла оптимизировать поле символа (2) как интегральное, поскольку коды языка ISO 639-1 более читабельны по сравнению с целыми числами, если есть проблемы. – Fionn 2008-10-10 00:33:17
Я думал точно так же. На первый взгляд, использование дополнительного слоя имеет ряд преимуществ: можно перечислять все доступные/настроенные языки (полезные в графическом интерфейсе), вы можете удалить весь язык (с ограничениями DB) и предотвратить «опечатки». Хотя последнее не имеет значения при использовании 2 кодов символов;) – kazu 2014-04-13 14:57:49