[Programacion] Bases de Datos Multilenguaje

Aplicaciones multilenguaje han existido de siempre, pero me encuentro con la duda de cómo plantear la base de datos para una webapp multilenguaje.

He pensado en los siguientes planteamientos:

1 Columnas adicionales
CREATE TABLE app_product (
  Id Int IDENTITY NOT NULL,
  Description_es Text,
  Description_fr Text,
  PRIMARY KEY (Id)
);

Simple y facilidad para realizar las consultas, difícil si el día de mañana quiero añadir un nuevo idioma, difícil mantenimiento.

2 Unica tabla de traducción
CREATE TABLE ref_language (
  Code Char(2)NOT NULL,
  Name Varchar(20) NOT NULL,
  PRIMARY KEY (Code)
);

CREATE TABLE app_translation (
Id Int IDENTITY NOT NULL,
PRIMARY KEY (Id)
);

CREATE TABLE app_translation_entry (
TranslationId Int NOT NULL,
LanguageCode Char(2) NOT NULL,
Text Text NOT NULL,
FOREIGN KEY (TranslationId) REFERENCES app_translation(Id),
FOREIGN KEY (LanguageCode) REFERENCES ref_language(Code)
);

CREATE TABLE app_product (
Id Int IDENTITY NOT NULL,
Description Int NOT NULL,
        PRIMARY KEY (Id),
FOREIGN KEY (Description) REFERENCES app_translation(Id)
);

Posibilidad de añadir nuevos idiomas con facilidad. Dificultad para realizar las consultas, habría que ver cómo penalizan las consultas al servidor.

3 Tabla adicional
CREATE TABLE ref_language (
  Code Char(2)NOT NULL,
  Name Varchar(20) NOT NULL,
  PRIMARY KEY (Code)
);

CREATE TABLE app_product (
Id Int IDENTITY NOT NULL,
PRIMARY KEY (Id)
);

CREATE TABLE app_product_translation (
ProductId Int NOT NULL,
LanguageCode Char(2) NOT NULL,
Description Text NOT NULL,
FOREIGN KEY (ProductId) REFERENCES app_product(Id),
FOREIGN KEY (LanguageCode) REFERENCES ref_language(Code)
);

No requiere cambiar el esquema para añadir un nuevo idioma, consultas más simples, pero desventaja de la cantidad de tablas.

¿Qué camino pensáis que es el correcto?

Saludos
Mismos identificadores si la app lo requiere, pero distintas tablas.
Hola.

Yo lo que haría sería, por una parte eliminar los códigos de idiomas de la BBDD y los guardaría como variable de sesión.

Luego de la tabla de productos sacaría dos tablas, una con los valores comunes y otra con los susceptibles de cambiar según el idioma, como nombre y descripción. A continuación crearía las tablas así:

CREATE TABLE app_product (
  idProduct INT (4) unsigned not null auto_increment,
  ... campos ...
  PRIMARY KEY (idProduct)
);

CREATE TABLE product_data(
  idLang char (5) NOT NULL,
  productName text,
  productDesc text,
  PRIMARY KEY (idLang,idProduct),
  FOREIGN KEY (idProduct) REFERENCES app_product (idProduct),
);


De ésta forma puedes obtener los datos del producto con la variable de sesión que guarde el lenguaje y en la consulta hacer un join de las dos tablas por la "idProduct".

Un saludo.
2 respuestas