NoSQL: Was sind unstrukturierte Daten?

9

Mit unserer serverbasierten mssql-Lösung sind wir derzeit am Rande der Ressourcen.

Wir haben jetzt viele traditionelle Optionen für den nächsten Schritt, um die Last anzugehen:

  • Kaufen Sie schnellere CPUs und E / A.
  • Teilen Sie einige Kunden auf, um den Server zu trennen
  • Verschieben Sie die Datenbank in den Cluster

Alle sind entweder in Bezug auf Lizenzierung und Hardware oder Zeit teuer. Daher möchte ich eine weitere Option hinzufügen, indem ich das gesamte System auf eine skalierbare Lösung umstelle, die die nosql-Engine Cassandra verspricht.

Ich bin mir jedoch nicht sicher und habe keine Erfahrung mit noSQL-Datenbanken. Daher muss ich die Struktur "unstrukturierter" Daten verstehen.

In unserer Anwendung speichern wir Daten, die von Benutzern auf verschiedene Weise eingegeben wurden, grundsätzlich als "Schlüsselwert" -Listen. Es gibt eine übergeordnete Tabelle, die das head-Element enthält (wie eine Bestellung), und es gibt eine untergeordnete Tabelle mit den Schlüssel-Wert-Paaren, die den Inhalt der Bestellung enthalten (wie Order_Lines).

In geschäftlicher Hinsicht sind Order und OrderLines eine Einheit. Aufgrund des RDBMS werden sie jedoch in Tabellen gespeichert und müssen ständig verbunden werden.

Während des Betriebs laden wir manchmal nur den oberen Teil, aber meistens laden wir die Kopfzeile + einige KVPs, um einige nützliche Informationen anzuzeigen.

In einer Übersichtsliste zeigen wir beispielsweise die Kopfkennung + einige Werte in Spalten für jede Zeile.

UPDATE: Wir speichern Formulare jeglicher Art. Im Grunde speichern wir also "Dokumente". Trotzdem müssen wir diese Formulare nach beliebigen Werten, Sortierungen usw. vorbereiten und durchsuchen. Die Datenzugriffskontrolle fügt der Datenbank eine weitere Ebene der Komplexität hinzu.

Wie Sie sich vorstellen können, variieren Menge und Verfügbarkeit bestimmter KVPs von Objekt zu Objekt. Es gibt keine gültige Möglichkeit, einzelne Tabellen für jede Art von Objekt zu erstellen, da wir Tausende von Tabellen für die verschiedenen Datenkombinationen erstellen müssten.

Wäre diese Art von "Dictionary" -ähnlichen Datensätzen besser in einer noSQL-Datenbank gespeichert? Und werden wir davon Leistungsvorteile haben? Würde Cassandra diese Head + KVPs als einen Datensatz modellieren? Wenn ich mir die Cassandra-Webseite und einige Tutorials anschaue, habe ich den Eindruck, dass es in Bezug auf die Datenorganisation keinen so großen Unterschied zwischen unserem RDBMS und Cassandra gibt. Wenn Sie also 5 KVPs auswählen möchten, haben wir die gleiche Anzahl an Joins für eine Liste für jede Zeile.

Aufklärung ist willkommen, auch Hinweise auf Papiere, die die Probleme erklären, sind in Ordnung.

thst
quelle

Antworten:

3

Es gibt einige Konzepte, die unterschieden werden müssen. Bei einem geht es um Struktur und bei dem anderen um Schema.

Strukturierte Daten sind solche, bei denen die Anwendung die Bedeutung jedes empfangenen Bytes im Voraus kennt. Ein gutes Beispiel sind Messungen von einem Sensor. Im Gegensatz dazu ist ein Twitter-Stream unstrukturiert. Im Schema geht es darum, wie viel von der Struktur an das DBMS kommuniziert wird und wie es aufgefordert wird, dies durchzusetzen. Es steuert, wie viel das DBMS die gespeicherten Daten analysiert. Ein für ein Schema erforderliches DBMS wie SQL Server kann nicht analysierte Daten (varbinary) oder optional analysierte Daten (xml) und vollständig analysierte Daten (Spalten) speichern.

NoSQL-DBMS liegen in einem Spektrum von No Parsing (Schlüsselwertspeicher) aufwärts. Cassandra bietet in dieser Hinsicht eine sehr umfangreiche Funktionalität. Wo sie sich deutlich von relationalen Speichern unterscheiden, liegt in der Einheitlichkeit der Daten. Sobald eine Tabelle definiert ist, dürfen dort nur Daten gespeichert werden, die dieser Definition entsprechen. In Cassandra ist es jedoch nicht erforderlich, dass zwei Zeilen in derselben Tabelle ähnlich aussehen, selbst wenn Spalten und Familien definiert sind. Es ist Sache des Anwendungsdesigners, zu entscheiden, wie viel in einer einzelnen Zeile (auch als Dokument bezeichnet) abläuft und was separat gespeichert und durch Zeiger verknüpft wird. In der Tat, wie viel Denormalisierung möchten Sie.

Der Vorteil ist, dass Sie einen vollständigen Datensatz mit einem einzigen sequentiellen Lesevorgang abrufen können. Das geht schnell. Ein Nachteil ist, dass Sie als Anwendungsprogrammierer jetzt allein für alle Datenintegritäts- und Abwärtskompatibilitätsprobleme verantwortlich sind, für immer für jedes Codebit, das jemals diesen Datenspeicher berührt. Das kann schwierig sein, richtig zu machen. Außerdem sind Sie an einen Standpunkt zu den Daten gebunden. Wie melden Sie den Verkauf eines bestimmten Produkts, einer bestimmten Region oder eines bestimmten Kunden, wenn Sie Ihre Zeilen nach Bestellnummer eingeben?

Michael Green
quelle
1
In unserem Fall handelt es sich bei den von uns gespeicherten Daten im Wesentlichen um Formulardaten. Der Benutzer definiert das Formular zur Laufzeit und kann es jederzeit ändern. Ein Formular kann aus Tausenden von Feldern erstellt werden. Dies kann passieren, wenn listenähnliche Daten erfasst werden. Wenn wir die Daten im Voraus kennen würden - zur Datenbankentwurfszeit, würden wir sie normalisieren. Ihr Kommentar zur Ansicht der Daten lässt mich denken: Wenn die Formulare als Dokument geschrieben sind, wie erstellen Sie eine Ansicht für eine Liste oder sortieren die Daten nach einem Feld im wirklichen Leben? Kartenreduzieren, Daten im Code sammeln und vorbereiten?
27.
In der Vergangenheit war alles clientseitig - Sie haben Ihre Dokumente zurückbekommen und das getan, was Sie mussten. CQL hat Klauseln , mit denen jeder SQL-Entwickler vertraut wäre. Map Reduce ist die Architektur für große Datenmengen. Und es sieht so aus, als ob Cassandra 3.0 materialisierte Ansichten haben wird .
Michael Green
5

Trotz des Mainstreams der noSQL-Datenbanken sollte meiner Meinung nach die Entscheidung über die Einführung einer solchen Technologie nach den Erfolgen getroffen werden, die gemäß den gespeicherten Informationen erforderlich sind, und nicht nur nach der Leistung, die Sie derzeit haben. Dies bedeutet, dass Sie möglicherweise am besten an der SQL-Datenbank festhalten und Ihre Hardware verbessern können.

Aber zusätzlich habe ich etwas in Ihrer Frage gelesen, das mich zum Nachdenken gebracht hat. Es gibt nicht viel über den aktuellen Status Ihrer Datenbank, aber Ihr Satz "Wir speichern Daten, die von Benutzern auf verschiedene Weise eingegeben wurden, als" Schlüsselwert "-Listen" lässt mich darüber nachdenken, ob das Problem nicht eher ein schlechtes Datenmodell als wäre der Mangel an physischen Ressourcen. Ich habe wirklich große Tabellen (+10 Milliarden Zeilen) mit unglaublicher Leistung in "traditionellen" SQL-Datenbanken verwaltet.

Ich sage nicht, dass es falsch ist, nur weil ich Sie natürlich nicht im richtigen Datenmodell mit so wenig Informationen über Ihre aktuelle Lösung bewerten kann, sondern nur daran denken, Ihr Datenmodell als zusätzliche Option zusammen mit dem Rest seit Ihnen erneut zu besuchen kann dort einen Hinweis finden, der kratzt.

Normalerweise sind Schlüsselwertlisten als Kompromiss in Ordnung, wenn Sie das Modell nicht im Endzustand implementieren können, weil Sie die verschiedenen Schlüssel, denen Sie gegenüberstehen müssen, nicht kennen oder wenn Sie die Werte eines der möglichen benötigen Schlüssel für ein bestimmtes Element. Aber wenn ich implementiert bin, denke ich normalerweise gerne nach einer Weile über solche Entscheidungen nach, wenn Sie genügend Informationen gesammelt haben, um den allgemeinen Anwendungsfall zu identifizieren und zu entscheiden, ob die Entscheidung für ein Datenmodell die beste ist. Wenn Sie wissen, dass Sie eine bestimmte Anzahl von Schlüsseln haben, versuchen Sie, einen Benchmark mit dem Design eines normalen Tisches auf herkömmliche Weise durchzuführen

CREATE TABLE benchmarkTable (
  element INTEGER,
  key1 VARCHAR(xx),
  key2 INTEGER,
  key3 DECIMAL(5,2),
...
);

... und Hinzufügen der entsprechenden Indizes. Probieren Sie es aus und messen Sie Ausführungspläne mit beiden Ansätzen. Sie können besonders überrascht sein, wenn Sie mehr als einen Schlüssel gleichzeitig erfassen, da unter anderem die Datenblockgröße reduziert werden sollte und somit die Leistung verbessert würde.

Ich hoffe, dies hilft oder erweitert zumindest die Möglichkeiten und eröffnet eine neue Untersuchungslinie.

LironCareto
quelle
Ich schätze Ihre Antwort, aber tatsächlich ist die Situation so, dass wir die Struktur der Daten wirklich nicht kennen. Wir speichern Formulardaten und kennen die Struktur des Modells des Formulars nicht. Wir wissen natürlich in der Anwendung, aber es ist dynamisch und kann jederzeit geändert werden.
27.
Verstanden. Ich weiß nicht, wie schwierig dies ist, aber als Idee, es zu versuchen, würde es funktionieren, eine Tabelle zu erstellen, die den Pool allgemeiner Schlüssel enthält, auf die in der vom Benutzer gefüllten Tabelle von einem ausführenden FK, möglicherweise einem INTEGER, verwiesen wird? Vielleicht ist es ein bisschen leistungsfähiger als das Indizieren einer Varchar-Spalte, die, wenn sie sich sehr dynamisch ändert, wahrscheinlich nicht kurz ist. Und es würde auch die Größe des Index reduzieren.
LironCareto
1
Dies führt von der Frage weg, aber wir haben bestimmte Einschränkungen der Benutzermöglichkeiten erörtert. Reduzieren Sie beispielsweise die maximale Anzahl der App-Tabellenfelder auf 10 Vanille-Varchar-Datenbankfelder. Dies ist eine Denormalisierung des Schemas, um im Grunde genommen den Kopfdatensatz und 10 App-Spaltenwerte auf einmal oder mit maximal einem Join in der zusätzlichen DB-Tabelle auszuwählen. Beim Ändern der relevanten Werte müssten wir auch diese eine Datenbankzeile im Code ändern. Dies scheint machbar und reduziert die Anzahl der Verknüpfungen um bis zu 10, damit eine Auswahl die App-Tabelle anzeigt. Das Ändern der App-Spaltendefinition des Benutzers ist dann jedoch sehr teuer.
28.
1
Es ist in Ordnung, mach dir keine Sorgen. Ich denke, ich sehe Ihren Standpunkt und Ihr Ansatz sieht für mich einen guten Kompromiss zwischen Leistungsverbesserung und Machbarkeit. Es ist natürlich wichtig, Nutzungsstatistiken zu haben, um diese Felder zu bestimmen. Haben Sie es bewertet? Zumindest kann es Ihnen einige Zeit kosten, bis Sie eine (bessere? Definitive?) Lösung finden oder vielleicht feststellen, dass Sie damit lange Zeit arbeiten können.
LironCareto