Wie speichert nvarchar (max) Daten in der Datenbank? Wird es schnell gehen, wenn einige Daten weniger als 4000 Zeichen enthalten?

8

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

Lernen
quelle
Wirst du immer Englisch und Arabisch haben? Oder vielleicht nur eine Option? Wenn ja, wird man immer obligatorisch sein? Erwarten Sie später mehr Sprachen?
Gbn

Antworten:

9

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:

  • Wirst du immer sowohl Englisch als auch Arabisch haben?
  • Kann man optional sein? Wenn ja, wird man immer obligatorisch sein?
  • Erwarten Sie später mehr Sprachen?

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

  • PageID int,
  • PageOtherInfo ...

PageEnglish (beachten Sie, dass varchar hier möglicherweise in Ordnung ist)

  • PageID int,
  • PageTitleEnglish varchar (200),
  • PageDescEnglish varchar (500),
  • PageBodyEnglish varchar (max)

PageArabic

  • PageID int,
  • PageTitleArabic nvarchar (200),
  • PageDescArabic nvarchar (500),
  • PageBodyArabic nvarchar (max)

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

  • PageID int,
  • PageOtherInfo ..

Seite

  • PageID int,
  • Sprachcode,
  • Seitentitel nvarchar (200),
  • PageDesc nvarchar (500),
  • PageBody nvarchar (max)
gbn
quelle
4
  • MS SQL Server hat eine feste Seitengröße von 8 KB.
  • Eine Zeile wird niemals auf mehrere Seiten aufgeteilt, aber mehrere Zeilen können eine einzelne Seite gemeinsam nutzen.
  • nvarchar (max) und andere BLOB-Daten können jedoch außerhalb der Zeile / Seite gespeichert werden.

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.

Arjan Einbu
quelle