Esta pergunta é sobre um problema um pouco mais complicado do que o que já foi abordado nessas perguntas antigas, todas duplicadas uma da outra:
Sugestão para estrutura de banco de dados para vários idiomas (junho de 2011)
Qual é a melhor estrutura de banco de dados para manter dados multilíngues? (Fevereiro de 2010)
Quais são as práticas recomendadas para o design de banco de dados em vários idiomas? (Maio de 2009)
Esquema para um banco de dados multilíngue (novembro de 2008)
O esquema de banco de dados mais popular para fazer backup de interfaces de usuário multilíngues parece ter todos os textos traduzidos de todos os idiomas em uma tabela com 3 colunas: a identificação do texto, o código do idioma e o próprio texto. O ID do texto e o código do idioma juntos formam a chave primária.
Tudo bem, mas agora considere uma complicação: suponha que os textos precisem ser pesquisáveis. Suponha, por exemplo, que seja uma loja virtual em vários idiomas. Isso significa que, para cada categoria de produto inserida no banco de dados, o proprietário da loja inserirá o nome da categoria de produto em todos os N idiomas suportados e, em seguida, o comprador poderá procurar a categoria de produto por nome, na sua própria língua .
Há um problema: agrupamento .
Idiomas diferentes têm sequências de intercalação diferentes, e a sequência de intercalação que funciona para um idioma não funciona para outro. Portanto, se todos os textos de todos os idiomas estiverem em uma única coluna, que sequência de agrupamento eles terão? Como vamos consultar o banco de dados para encontrar o ID do texto de um texto específico? Enquanto em uma pesquisa na Web, a precisão e o desempenho podem não ser muito importantes, para os propósitos desta discussão, suponhamos que eles realmente sejam importantes.
A maioria dos administradores de banco de dados está familiarizada com o conceito de agrupamento no sentido de "agrupamento do banco de dados". Felizmente, esse é apenas o agrupamento padrão, que é usado se nenhuma outra informação de agrupamento estiver presente, mas também existem outros lugares onde o agrupamento pode ser especificado:
O comando SQL CREATE INDEX suporta uma especificação de agrupamento. (Embora existam rumores de que o Microsoft SQL Server não o suporta; alguém sabe disso?)
A instrução SQL SELECT também suporta agrupamento, mas neste caso a especificação de agrupamento funciona como uma função, causando uma varredura de índice em vez de uma pesquisa de índice, algo que pode ser inadmissível se queremos desempenho. (Então, novamente, se é o melhor que podemos ter, pode ser melhor que nada.)
Também ouvi dizer que no Microsoft SQL Server você pode ter colunas computadas não persistentes nas quais é possível especificar agrupamento e criar um índice filtrado, embora eu nunca tenha ouvido falar disso antes, e se for apenas Microsoft-SQL-Server recurso, então eu prefiro não usá-lo, não importa o quão legal e bem pensado seja.
Portanto, à luz de tudo isso, como estruturamos nosso banco de dados e como executamos nossas consultas, se o objetivo é um banco de dados multilíngue atualizável e pesquisável?
Esta questão foi inspirada por uma discussão que ocorreu aqui: como o nvarchar (max) armazenará dados no banco de dados será rápido se alguns dados tiverem menos de 4000 caracteres?