Bei dieser Frage handelt es sich um ein etwas komplizierteres Thema als das, das bereits in diesen alten Fragen behandelt wurde, die alle Duplikate voneinander sind:
Vorschlag für eine Datenbankstruktur für mehrsprachig (2011 Jun)
Was ist die beste Datenbankstruktur, um mehrsprachige Daten zu speichern? (2010 Feb)
Was sind Best Practices für das mehrsprachige Datenbankdesign? (2009 Mai)
Schema für eine mehrsprachige Datenbank (2008 Nov)
Das beliebteste Datenbankschema zum Sichern mehrsprachiger Benutzeroberflächen scheint darin zu bestehen, alle übersetzten Texte aller Sprachen in einer Tabelle mit drei Spalten zu haben: der Text-ID, dem Sprachcode und dem Text selbst. Die Text-ID und der Sprachcode bilden zusammen den Primärschlüssel.
Das ist alles sehr gut, aber jetzt betrachten Sie eine Komplikation: Nehmen wir an, dass die Texte durchsuchbar sein müssen. Angenommen, dies ist ein mehrsprachiger E-Shop. Dies bedeutet, dass der Ladenbesitzer für jede in die Datenbank eingegebene Produktkategorie den Namen der Produktkategorie in jeder der N unterstützten Sprachen eingibt und der Käufer dann nach Namen nach der Produktkategorie suchen kann. in ihrer eigenen Sprache .
Es gibt ein Problem: Sortierung .
Verschiedene Sprachen haben unterschiedliche Kollatierungssequenzen, und die Kollatierungssequenz, die für eine Sprache funktioniert, funktioniert nicht für eine andere. Wenn sich also alle Texte aller Sprachen in einer einzigen Spalte befinden, welche Sortierreihenfolge haben sie? Wie werden wir die Datenbank abfragen, um die Text-ID eines bestimmten Textes zu finden? Während bei der Suche nach einem Webprodukt Genauigkeit und Leistung möglicherweise nicht besonders wichtig sind, nehmen wir für die Zwecke dieser Diskussion an, dass sie wirklich wichtig sind.
Die meisten Datenbankadministratoren kennen das Konzept der Kollatierung im Sinne von "Kollatierung der Datenbank". Glücklicherweise ist dies nur die Standardkollatierung, die verwendet wird, wenn keine anderen Kollatierungsinformationen vorhanden sind, aber es gibt auch andere Stellen, an denen die Kollatierung angegeben werden kann:
Der Befehl SQL CREATE INDEX unterstützt eine Sortierspezifikation. (Obwohl Gerüchte besagen, dass Microsoft SQL Server es nicht unterstützt; weiß jemand davon?)
Die SQL SELECT-Anweisung unterstützt auch die Kollatierung. In diesem Fall funktioniert die Kollatierungsspezifikation jedoch als Funktion und verursacht einen Index-Scan anstelle einer Index-Suche. Dies ist möglicherweise unzulässig, wenn wir Leistung wünschen. (Andererseits, wenn das das Beste ist, was wir haben können, ist es vielleicht besser als nichts.)
Ich habe auch gehört, dass Sie unter Microsoft SQL Server nicht persistente, berechnete Spalten haben können, in denen Sie die Sortierung angeben und einen gefilterten Index erstellen können, obwohl ich noch nie davon gehört habe und wenn es sich nur um Microsoft-SQL Server handelt Feature, dann würde ich es lieber nicht benutzen, egal wie cool und gut durchdacht es ist.
Wie strukturieren wir angesichts all dessen unsere Datenbank und wie führen wir unsere Abfragen durch, wenn das Ziel eine aktualisierbare und durchsuchbare mehrsprachige Datenbank ist?
Diese Frage wurde von einer Diskussion inspiriert, die hier stattfand: Wie speichert nvarchar (max) Daten in der Datenbank? Wird es schnell gehen, wenn einige Daten weniger als 4000 Zeichen enthalten?