busco opiniones si el siguiente problema tal vez tiene una solución mejor/diferente/común:base de datos de localización
Tengo una base de datos de productos que contiene los nombres de los productos en Inglés (el idioma por defecto de esta aplicación) y necesito traducciones de los nombres si están disponibles.
Actualmente tengo esta configuración:
Una tabla de productos
CREATE TABLE products
(
id serial NOT NULL,
"name" character varying(255) NOT NULL,
CONSTRAINT products_pkey PRIMARY KEY (id)
)
y una mesa de localización de productos
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
)
y utilizo la siguiente consulta para recuperar una lista de los productos localizados (alemán en este caso) con el retorno a los nombres ingleses predeterminados:
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';
El código SQL está en el dialecto postgres. Los datos se almacenan como UTF-8.
La base de datos no debería poder optimizar un campo de caracteres (2) de todos modos como integral, ya que los códigos de idioma ISO 639-1 son más legibles en comparación con los enteros si hay problemas. – Fionn
Pensé exactamente lo mismo. Sin embargo, en un segundo vistazo, usar una capa adicional tiene algunas ventajas: es posible enumerar todos los idiomas disponibles/configurados (útiles dentro de la GUI), puede eliminar un idioma completo (con restricciones DB) y previene los "errores tipográficos". Aunque esto último no debería importar al usar 2 códigos de char;) – kazu