Ich muss ein CMS entwickeln, das zweisprachiges Englisch, Arabisch, unterstützt. Dieses CMS wird eine Art Artikelveröffentlichungsseite sein. Beim Entwerfen und Analysieren stellte ich fest, dass einige Artikel mehr als 8000 Zeichen lang sind. Meine Tabelle hat eine Spalte als
PageID int,
PageTitleEnglish nvarchar(200),
PageTitleArabic nvarchar(200),
PageDescEnglish nvarchar(500),
PageDescArabic nvarchar(500),
PageBodyEnglish nvarchar(max)
PageBodyArabic nvarchar(max)
Wenn ich PageBody als nvarchar (4000) behalte, dann ist es auf 4000 Zeichen begrenzt und wenn ich die arabische Version speichern muss, brauche ich 16000 Bytes (da Arabisch Unicode ist und 3 Mal mehr Speicherplatz benötigt als ASCII).
Ich habe also nur die Möglichkeit, PageBody als nVarchar (max) zu definieren . Dies hat aus Sicht der Leistung einen Nachteil. Meine eigentliche Frage ist, ob einige Daten in der PageBody-Spalte weniger als 4000 Zeichen enthalten, als Daten in der Inline-Spalte oder separat in der Datenbank.
Ich habe dies auch bei Google gesucht, aber keine relevante Antwort gefunden und wie ich die Leistung in einem solchen Szenario verbessern kann.
Vorschläge für bewährte Verfahren für die Gestaltung eines mehrsprachigen CMS sind willkommen.
Ich muss nur zwei Sprachen Arabisch und Englisch unterstützen
quelle
Antworten:
Ein
nvarchar(max)
Wert wird " in Reihe " gespeichert, wenn er kurz genug ist.Das Standardverhalten kann mit der Option sp_tableoption "Große Werttypen außerhalb der Zeile" geändert werden . Ich würde mich nicht darum kümmern. Die DB-Engine verwaltet dies effizient selbst.
Für das Design gibt es verschiedene Möglichkeiten, dies basierend auf Ihrem Modell zu tun:
1. Separate Tabellen
Das heißt, Sie können die einzelnen Sprachen in verschiedene Tabellen aufteilen.
Dies ermöglicht Kollatierungen auf Tabellenebene anstelle von Kollatierungen auf Spaltenebene
Dies ermöglicht mehr Zeilen pro Seite und eine höhere Wahrscheinlichkeit für die LOB-Speicherung in Zeilen
PageParent
PageEnglish (beachten Sie, dass varchar hier möglicherweise in Ordnung ist)
PageArabic
2. Trennen Sie die Zeilen
Oder haben Sie eine languageID-Spalte, um mehrere Sprachen zu unterstützen.
Dies hat den Nachteil, dass die Sortierung für alle Sprachen behoben wird, was eine schlechte Sortierung / Filterung bedeutet
PageParent
Seite
quelle
Dies bedeutet, dass die Summe aller Größen weniger als 8 KB betragen muss, damit alles in eine Zeile passt. Ist dies nicht der Fall, speichert SQL Server die BLOBs außerhalb der Zeile / Seite.
Sind die Datenmengen so groß, dass dies wirklich zu Leistungsproblemen führt?
Als weitere Option können Sie möglicherweise Ihre Datenbankstruktur so ändern, dass separate Zeilen für englische und arabische Seiten vorhanden sind, und stattdessen eine Sprachcode-Spalte einfügen. Dann müssen Sie nicht sowohl den englischen als auch den arabischen Text in dieselbe Zeile einfügen. Dies ist auch beim Abrufen von Daten sinnvoll, da Sie wahrscheinlich nicht gleichzeitig Englisch und Arabisch abrufen müssen.
quelle