¿Cuáles son las mejores prácticas para el diseño de bases de datos en varios idiomas? [cerrado]


¿Cuál es la mejor manera de crear una base de datos en varios idiomas? Para crear una tabla localizada para cada tabla está haciendo que el diseño y la consulta sean complejos, en otro caso agregar columna para cada idioma es simple pero no dinámico, por favor ayúdame a entender cuál es la mejor opción para aplicaciones empresariales

Author: Dan J, 2009-05-30

5 answers

Lo que hacemos es crear dos tablas para cada objeto multilingüe.

Por ejemplo, la primera tabla contiene solo datos neutrales para el lenguaje (clave primaria, etc.) y la segunda tabla contiene un registro por idioma, que contiene los datos localizados más el código ISO del idioma.

En algunos casos agregamos un campo DefaultLanguage, para que podamos recurrir a ese idioma si no hay datos localizados disponibles para un idioma específico.

Ejemplo:

Table "Product":
----------------
ID                 : int
<any other language-neutral fields>


Table "ProductTranslations"
---------------------------
ID                 : int      (foreign key referencing the Product)
Language           : varchar  (e.g. "en-US", "de-CH")
IsDefault          : bit
ProductDescription : nvarchar
<any other localized data>

Con este enfoque, puede manejar tantos idiomas como sea necesario (sin tener que agregar campos adicionales para cada nuevo idioma).


Actualización (2014-12-14): por favor, eche un vistazo a esta respuesta, para obtener información adicional sobre la implementación utilizada para cargar datos multilingües en una aplicación.

 174
Author: M4N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:26

Me parece que este tipo de enfoque funciona para mí:

Product     ProductDetail        Country
=========   ==================   =========
ProductId   ProductDetailId      CountryId
- etc -     ProductId            CountryName
            CountryId            Language
            ProductName          - etc -
            ProductDescription
            - etc -

La tabla ProductDetail contiene todas las traducciones (para el nombre del producto, la descripción, etc.)..) en los idiomas que desea apoyar. Dependiendo de los requisitos de su aplicación, es posible que desee desglosar la tabla de países para usar idiomas regionales también.

 13
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-30 09:40:45

Recomiendo la respuesta publicada por Martin.

Pero parece que le preocupa que sus consultas se vuelvan demasiado complejas:

Crear una tabla localizada para cada tabla es hacer que el diseño y la consulta sean complejos...

Así que usted podría estar pensando, que en lugar de escribir consultas simples como esta:

SELECT price, name, description FROM Products WHERE price < 100

...tendrías que empezar a escribir consultas como esa:

SELECT
  p.price, pt.name, pt.description
FROM
  Products p JOIN ProductTranslations pt
  ON (p.id = pt.id AND pt.lang = "en")
WHERE
  price < 100

No es una perspectiva muy bonita.

Pero en lugar de hacerlo manualmente debería desarrollar su propia clase de acceso a la base de datos, que pre-analiza el SQL que contiene su marcado de localización especial y lo convierte en el SQL real que tendrá que enviar a la base de datos.

Usar ese sistema podría verse algo como esto:

db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
          FROM _(Products p) WHERE price < 100");

Y estoy seguro de que usted puede hacer aún mejor que eso.

La clave es tener sus tablas y campos nombrados de manera uniforme.

 12
Author: Rene Saarsoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-30 10:37:52

Estoy usando el siguiente enfoque:

Producto

OrderID del producto,...

ProductInfo

ProductID Title Name LanguageID

Idioma

Cultura del nombre de LanguageID,....

 8
Author: omoto,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-30 09:38:40

La solución de Martin es muy similar a la mía, sin embargo, ¿cómo manejaría una descripción predeterminada cuando no se encuentra la traducción deseada ?

¿Eso requeriría una IFNULL() y otra instrucción SELECT para cada campo ?

La traducción predeterminada se almacenaría en la misma tabla, donde una bandera como "IsDefault" indica si esa descripción es la descripción predeterminada en caso de que no se haya encontrado ninguna para el idioma actual.

 2
Author: doM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-24 14:39:08