Wann wird der XML-Datentyp verwendet?

12

Ich bin für die Erstellung einer Datenbank für ein Projekt verantwortlich. Wir haben Felder, die selten einen Wert haben (1 von 10.000 Datensätzen), und ich versuche, den besten Weg zu finden, dies in der Datenbank zu speichern.

Soweit ich sehen kann, habe ich 3 Möglichkeiten:

  1. Fügen Sie für jeden zusätzlichen Wert eine Spalte in die Tabelle ein
  2. Fügen Sie eine verknüpfte Tabelle hinzu, die auf die Originaltabelle verweist und nur dort Datensätze enthält, wo ein Wert gespeichert werden muss
  3. Verwenden Sie den XML-Datentyp in der Originaltabelle und speichern Sie alle darin enthaltenen Werte.

Gibt es andere Optionen, die ich nicht berücksichtigt habe?

Ich versuche, die Vor- und Nachteile jeder Methode herauszufinden. Soweit ich das beurteilen kann, ist 1 die einfachste und 2 die platzsparendste, aber ich habe Mühe, viele Ressourcen für 3 zu finden.

Matthew Steeples
quelle
1
Um einen persönlichen Vorwurf gegen XML-Missbrauch in eine Datenbank aufzunehmen, würde ich direkt auf die Frage im Titel antworten und ein dickes Fett sagen: NIE! Für den eigentlichen Inhalt der Frage lasse ich mich von den Kollegen helfen, denn Sie haben bereits sehr gute Antworten :-). PS: Sie können meinen ersten Satz eigentlich ignorieren.
Marian
Von wie vielen zusätzlichen Feldern sprichst du? Und machen sie Sinn, Teil derselben Entität zu sein?
Andrew Bickerton

Antworten:

12

Klingt wie das, was Sie brauchen, ist spärliche Spalten und gefilterte Indizes und gehört zu Option 1. Dies sind vollständig unterstützte und dokumentierte Funktionen für genau dieses Szenario.

Das SQL Server-Datenbankmodul verwendet das Schlüsselwort SPARSE in einer Spaltendefinition, um die Speicherung von Werten in dieser Spalte zu optimieren. Wenn der Spaltenwert für eine Zeile in der Tabelle NULL ist, erfordert der Wert daher keinen Speicher.

Ich kann mir keine XML-Lösung vorstellen, die in diesem Szenario eine gute Leistung erbringt, einen enormen Overhead an redundanten Metadaten aufweist und nur langsam abfragbar ist.

Gaius
quelle
1
Ich denke, spärliche Kolumnen sind das, wonach ich suche. Ich erwarte, dass eine sehr kleine Datenmenge in wahrscheinlich einer Handvoll Spalten in bestimmten Tabellen gespeichert wird.
Matthew Steeples
Ich bin mir nicht sicher, ob ich das richtig lese, aber laut diesem Link sind spärliche Spalten im Grunde genommen eine Datenbankimplementierung dessen, wonach ich gesucht habe. blog.sqlauthority.com/2008/07/14/…
Matthew Steeples
Wenn es intern so implementiert ist (und ich weiß nicht, dass es so ist, das ist nur ein Blog von jemandem), müssen Sie das XML nie selbst bearbeiten oder analysieren - es verhält sich genau wie eine reguläre Tabelle mit (mit irgendwelchen Einschränkungen) auf Datentypen)
Gaius
5
  1. Eine nullfähige Spalte nimmt bei variabler Länge in SQL Server kein Leerzeichen ein. Die Tatsache, NULL zu sein, wird in der NULL-Bitmap gespeichert . Sie können es bei Bedarf mit gefilterten Indizes indizieren, sodass Sie NULL-Spalten ignorieren.

  2. Fügt Komplexität hinzu, wenn Sie Punkt 1 berücksichtigen.

  3. Nicht. Schwer zu suchen, zu analysieren usw. Sie werden es später bereuen

Es kommt auch auf die Größe an: Wird dies für ein paar Milliarden Zeilen char (1000) sein? Oder tinyint für 100k Zeilen? Wenn letztere die zusätzliche Komplexität von Punkt 2 berücksichtigen: es lohnt sich nicht.

gbn
quelle
Haben Sie eine Referenz, die besagt, dass eine nullfähige Spalte, die null ist, kein Leerzeichen benötigt? Mir war bewusst, dass, ob es null war oder nicht, in der Null-Bitmap gespeichert wurde, aber für Felder mit fester Länge gedacht wurde, dass die Daten immer noch in der Tabelle gespeichert waren. Der Datentyp, den ich für die meisten dieser Werte verwenden werde, ist Geld (also 8 Byte)
Matthew Steeples
1
@ Matthew Steeples: Ich sagte, variable Länge braucht schon keinen Platz. Und als Referenz sqlskills.com/BLOGS/PAUL/category/On-Disk-Structures.aspx#p41 Wie dürfen Zeilen für diese 8 Bytes sein?
31.03.11
Im Moment sind wir bei 500.000 Zeilen, aber wir werden (hoffentlich) mit einer Rate von ungefähr 1 Million pro Woche expandieren, sobald wir richtig leben.
Matthew Steeples
3

Mit SQL Server 2008 haben Sie zusätzlich die Möglichkeit, Spalten mit geringer Dichte zu verwenden, die speziell für die von Ihnen erwähnte Situation entwickelt wurden.

Sie haben den zusätzlichen Vorteil, dass Sie sie mit XML COLUMN_SET als kombiniertes XML-Objekt anzeigen oder einzeln referenzieren können, und sie bieten eine enorme Platzersparnis.

Weitere Informationen finden Sie im folgenden Blog-Artikel: http://www.sqlskills.com/BLOGS/PAUL/post/SQL-Server-2008-Sparse-columns-and-XML-COLUMN_SET.aspx

Jeff
quelle
-4

Eine vierte Option: Verwenden Sie keine Tabellen. Tabellen sind für diese Art von Daten sehr schlecht geeignet (in der Tat für jede Art von Daten, die nicht in Tabellenform eingepasst wurden). Verwenden Sie einfach XML.

user1359
quelle
3
-1 Während es wahr ist, dass "keine Tabellen verwenden" eine Option ist , wird in der Antwort eindeutig ein Widerspruch gegen Tabellenstrukturen formuliert, und es wird keine hilfreiche Antwort gesendet.
Andrew Bickerton