Quais são as práticas recomendadas para design de database em vários idiomas?

Qual é a melhor maneira de criar database em vários idiomas? Para criar uma tabela localizada para cada tabela está tornando o design e a consulta complexos, em outro caso, para adicionar coluna para cada idioma é simples, mas não dynamic, por favor me ajude a entender qual é a melhor escolha para aplicativos corporativos

O que fazemos é criar duas tabelas para cada object multilíngue.

Por exemplo, a primeira tabela contém apenas dados com neutralidade de idioma (chave primária, etc.) e a segunda tabela contém um registro por idioma, contendo os dados localizados mais o código ISO do idioma.

Em alguns casos, adicionamos um campo DefaultLanguage, para que possamos retornar a esse idioma se nenhum dado localizado estiver disponível para um idioma especificado.

Exemplo:

Table "Product": ---------------- ID : int  Table "ProductTranslations" --------------------------- ID : int (foreign key referencing the Product) Language : varchar (eg "en-US", "de-CH") IsDefault : bit ProductDescription : nvarchar  

Com essa abordagem, você pode manipular quantos idiomas forem necessários (sem precisar adicionar campos adicionais para cada novo idioma).


Atualização (2014-12-14): dê uma olhada nesta resposta , para obter algumas informações adicionais sobre a implementação usada para carregar dados multilíngües em um aplicativo.

Eu acho que esse tipo de abordagem funciona para mim:

 Produto ProductDetail Country
 ====================================
 ProductId ProductDetailId CountryId
 - etc - ProductId CountryName
             Idioma CountryId
             ProductName - etc -
             Descrição do Produto
             - etc -

A tabela ProductDetail contém todas as traduções (para nome do produto, descrição, etc.) nos idiomas que você deseja suportar. Dependendo dos requisitos do aplicativo, talvez você queira dividir a tabela “País” para usar idiomas regionais também.

Eu recomendo a resposta postada por Martin.

Mas parece que você está preocupado com o fato de suas consultas ficarem muito complexas:

Para criar uma tabela localizada para cada tabela está fazendo design e consultando complexos …

Então você pode estar pensando que, em vez de escrever consultas simples como esta:

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

... você precisaria começar a escrever consultas como essa:

 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 

Não é uma perspectiva muito bonita.

Mas, em vez de fazê-lo manualmente, você deve desenvolver sua própria class de access ao database, que pré-analisa o SQL que contém sua marcação de localização especial e o converte no SQL real que você precisará enviar ao database.

Usando esse sistema pode ser algo como isto:

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

E tenho certeza que você pode fazer ainda melhor isso.

A chave é ter suas tabelas e campos nomeados de maneira uniforme.

Eu estou usando a próxima abordagem:

produtos

ProductID OrderID, …

Informação do produto

ProductID Title Name LanguageID

Língua

LanguageID Name Culture, ….

A solução de Martin é muito semelhante à minha, no entanto, como você lida com descrições padrão quando a tradução desejada não é encontrada?

Isso exigiria um IFNULL () e outra instrução SELECT para cada campo?

A tradução padrão seria armazenada na mesma tabela, onde um sinalizador como “isDefault” indica se a descrição é a descrição padrão, caso nenhuma tenha sido encontrada para o idioma atual.