Esta pregunta es sobre un tema algo más complicado que el que ya se ha abordado en estas viejas preguntas, todas las cuales son duplicados entre sí:
Sugerencia para la estructura de la base de datos para varios idiomas (junio de 2011)
¿Cuál es la mejor estructura de base de datos para mantener datos multilingües? (Febrero de 2010)
¿Cuáles son las mejores prácticas para el diseño de bases de datos en varios idiomas? (Mayo de 2009)
Esquema para una base de datos multilenguaje (noviembre de 2008)
El esquema de base de datos más popular para respaldar interfaces de usuario multilingües parece ser tener todos los textos traducidos de todos los idiomas en una tabla con 3 columnas: la identificación del texto, el código del idioma y el texto en sí. La identificación de texto y el código de idioma juntos forman la clave principal.
Todo eso está muy bien, pero ahora considera una complicación: supongamos que los textos deben poder buscarse. Supongamos, por ejemplo, que se trata de una tienda electrónica en varios idiomas. Esto significa que para cada categoría de producto ingresada en la base de datos, el propietario de la tienda ingresará el nombre de la categoría de producto en todos y cada uno de los N idiomas admitidos, y luego el comprador podrá buscar la categoría de producto por nombre, en su propio idioma .
Hay un problema: colación .
Diferentes idiomas tienen diferentes secuencias de clasificación, y la secuencia de clasificación que funciona para un idioma no funciona para otro. Entonces, si todos los textos de todos los idiomas están en una sola columna, ¿qué secuencia de clasificación van a tener? ¿Cómo vamos a consultar la base de datos para encontrar la identificación de texto de un texto específico? Si bien en una búsqueda de productos web, la precisión y el rendimiento pueden no ser terriblemente importantes, a los fines de esta discusión, supongamos que realmente importan.
La mayoría de los administradores de bases de datos están familiarizados con el concepto de cotejo en el sentido de "cotejo de la base de datos". Afortunadamente, esa es solo la clasificación predeterminada, que se usa si no hay otra información de clasificación, pero también existen otros lugares, donde se puede especificar la clasificación:
El comando SQL CREATE INDEX admite una especificación de intercalación. (Aunque los rumores dicen que Microsoft SQL Server no lo admite; ¿alguien lo sabe?)
La instrucción SQL SELECT también admite la intercalación, pero en este caso la especificación de intercalación funciona como una función, provocando un escaneo de índice en lugar de una búsqueda de índice, algo que podría ser inadmisible si queremos rendimiento. (Por otra parte, si eso es lo mejor que podemos tener, podría ser mejor que nada).
También escuché que en Microsoft SQL Server puede tener columnas calculadas no persistentes en las que puede especificar la intercalación y crear un índice filtrado, aunque nunca he oído hablar de esto antes, y si es solo un servidor Microsoft-SQL-Server característica, entonces prefiero abstenerme de usarlo, no importa cuán genial y bien pensado sea.
Entonces, a la luz de todo eso, ¿cómo estructuramos nuestra base de datos y cómo realizamos nuestras consultas, si el objetivo es una base de datos multilingüe actualizable y con capacidad de búsqueda?
Esta pregunta se inspiró en una discusión que tuvo lugar aquí: ¿cómo almacenará nvarchar (max) los datos en la base de datos? ¿Será rápido si algunos datos tienen menos de 4000 caracteres?