Nicht relationales Datenbankdesign [geschlossen]

114

Ich bin daran interessiert, etwas über Entwurfsstrategien zu erfahren , die Sie mit nicht relationalen "nosql" -Datenbanken verwendet haben - das ist die (meist neue) Klasse von Datenspeichern, die kein traditionelles relationales Design oder SQL verwenden (wie Hypertable, CouchDB, SimpleDB, Google App Engine-Datenspeicher, Voldemort, Cassandra, SQL Data Services usw.). Sie werden auch oft als "Schlüssel- / Wertspeicher" bezeichnet und verhalten sich an der Basis wie riesige verteilte persistente Hash-Tabellen.

Insbesondere möchte ich die Unterschiede im konzeptionellen Datenentwurf mit diesen neuen Datenbanken kennenlernen. Was ist einfacher, was ist schwieriger, was kann überhaupt nicht getan werden?

  • Haben Sie alternative Designs entwickelt, die in der nicht relationalen Welt viel besser funktionieren?

  • Haben Sie Ihren Kopf gegen etwas geschlagen, das unmöglich erscheint?

  • Haben Sie die Lücke mit Designmustern geschlossen, z. B. um von einem zum anderen zu übersetzen?

  • Machen Sie jetzt überhaupt explizite Datenmodelle (z. B. in UML) oder haben Sie sie vollständig zugunsten von halbstrukturierten / dokumentenorientierten Datenblobs abgelegt?

  • Vermissen Sie einen der wichtigsten zusätzlichen Dienste, die RDBMS bieten, wie relationale Integrität, willkürlich komplexe Transaktionsunterstützung, Trigger usw.?

Ich komme aus einem relationalen SQL-DB-Hintergrund, daher liegt mir die Normalisierung im Blut. Trotzdem bekomme ich die Vorteile nicht relationaler Datenbanken für Einfachheit und Skalierung, und mein Bauch sagt mir, dass es eine größere Überlappung der Entwurfsfähigkeiten geben muss. Was hast du getan?

Zu Ihrer Information, es gab hier StackOverflow-Diskussionen zu ähnlichen Themen:

Ian Varley
quelle
2
Schlüssel- / Wertedatenbanken das alte neue Ding.
Christopher
1
Für alle, die überinteressiert sind, gibt es eine lange Diskussion über die NoSQL-Google-Gruppe, hier: groups.google.com/group/nosql-discussion/browse_thread/thread/…
Ian Varley
4
Zu Ihrer Information, ich habe hier einen ausführlichen Bericht zu diesem Thema verfasst: google.com/url?sa=D&q=http://ianvarley.com/UT/MR/… Vielen Dank an Sie alle für Ihre hilfreichen Beiträge!
Ian Varley

Antworten:

55

Ich denke, Sie müssen berücksichtigen, dass sich die nicht relationalen DBMS in Bezug auf ihr Datenmodell stark unterscheiden und daher auch das konzeptionelle Daten-Design sehr unterschiedlich sein wird. Im Thread Datenentwurf in nicht relationalen Datenbanken der NOSQL-Google-Gruppe werden die verschiedenen Paradigmen wie folgt kategorisiert:

  1. Bigtable-ähnliche Systeme (HBase, Hypertable usw.)
  2. Schlüsselwertgeschäfte (Tokio, Voldemort usw.)
  3. Dokumentendatenbanken (CouchDB, MongoDB usw.)
  4. Grafikdatenbanken (AllegroGraph, Neo4j, Sesam usw.)

Ich beschäftige mich hauptsächlich mit Graphendatenbanken , und die Eleganz des Datendesigns unter Verwendung dieses Paradigmas hat mich dorthin gebracht, müde von den Mängeln von RDBMS . Ich habe auf dieser Wiki-Seite einige Beispiele für das Datendesign mithilfe einer Grafikdatenbank aufgeführt. Außerdem gibt es ein Beispiel für die Modellierung der grundlegenden IMDB- Film- / Schauspieler- / Rollendaten.

Die Präsentationsfolien (Slideshare) Graph Databases und die Zukunft des groß angelegten Wissensmanagements von Marko Rodriguez enthalten eine sehr schöne Einführung in das Datendesign unter Verwendung einer Graphendatenbank.

Beantwortung der spezifischen Fragen aus graphdb-Sicht:

Alternatives Design: Hinzufügen von Beziehungen zwischen vielen verschiedenen Arten von Entitäten, ohne dass Sie sich Sorgen machen müssen oder vordefinieren müssen, welche Entitäten verbunden werden können.

Überbrückung der Lücke: Ich mache dies in jedem Fall anders, basierend auf der Domäne selbst, da ich kein "tabellenorientiertes Diagramm" und dergleichen möchte. Hier finden Sie jedoch einige Informationen zur automatischen Übersetzung von RDBMS nach graphdb.

Explizite Datenmodelle: Ich mache diese ständig (Whiteboard-Stil) und verwende das Modell dann auch so, wie es in der Datenbank ist.

Miss aus der RDBMS-Welt: einfache Möglichkeiten zum Erstellen von Berichten. Update: Möglicherweise ist es nicht so schwierig, Berichte aus einer Diagrammdatenbank zu erstellen, siehe Erstellen eines Berichts für eine Neo4J-Beispieldatenbank .

Nawroth
quelle
79

Ich habe gerade erst mit nicht relationalen DBs angefangen und versuche immer noch, meinen Kopf darum zu wickeln und herauszufinden, welches das beste Modell wäre. Und ich kann nur für CouchDB sprechen.

Dennoch habe ich einige vorläufige Schlussfolgerungen:

Haben Sie alternative Designs entwickelt, die in der nicht relationalen Welt viel besser funktionieren?

Der Entwurfsfokus verschiebt sich: Der Entwurf des Dokumentmodells (entsprechend DB-Tabellen) wird fast irrelevant, während alles vom Entwurf der Ansichten abhängt (entsprechend Abfragen).

Die Dokument-DB tauscht die Komplexität aus: SQL verfügt über unflexible Daten und flexible Abfragen, Dokument-DBs sind umgekehrt.

Das CouchDB-Modell ist eine Sammlung von "JSON-Dokumenten" (im Grunde verschachtelte Hash-Tabellen). Jedes Dokument hat eine eindeutige ID und kann trivial anhand der ID abgerufen werden. Für jede andere Abfrage schreiben Sie "Ansichten", die als Sätze von Map / Reduce-Funktionen bezeichnet werden. Die Ansichten geben eine Ergebnismenge als Liste von Schlüssel / Wert-Paaren zurück.

Der Trick besteht darin, dass Sie die Datenbank nicht in dem Sinne abfragen, wie Sie eine SQL-Datenbank abfragen: Die Ergebnisse der Ausführung der Ansichtsfunktionen werden in einem Index gespeichert, und nur der Index kann abgefragt werden. (Als "alles abrufen", "Schlüssel abrufen" oder "Schlüsselbereich abrufen".)

Die nächste Analogie in der SQL-Welt wäre, wenn Sie die Datenbank nur mit gespeicherten Prozeduren abfragen könnten - jede Abfrage, die Sie unterstützen möchten, muss vordefiniert sein.

Das Design der Dokumente ist enorm flexibel. Ich habe nur zwei Einschränkungen gefunden:

  • Halten Sie verwandte Daten im selben Dokument zusammen, da nichts einem Join entspricht.
  • Machen Sie die Dokumente nicht so groß, dass sie zu häufig aktualisiert werden (z. B. wenn alle Unternehmensverkäufe des Jahres in demselben Dokument zusammengefasst werden), da bei jeder Dokumentaktualisierung eine erneute Indizierung ausgelöst wird.

Aber alles hängt von der Gestaltung der Ansichten ab.

Die alternativen Designs, bei denen ich festgestellt habe, dass Arbeitsabläufe mit CouchDB um Größenordnungen besser sind als mit jeder anderen SQL-Datenbank, befinden sich eher auf Systemebene als auf Speicherebene. Wenn Sie Daten haben und diese auf einer Webseite bereitstellen möchten, wird die Komplexität des Gesamtsystems um mindestens 50% reduziert:

  • Kein Entwerfen von DB-Tabellen (kleines Problem)
  • Keine ODBC / JDBC-Zwischenschicht, alle Abfragen und Transaktionen über http (mäßiges Problem)
  • einfache Zuordnung von DB zu Objekt von JSON, die im Vergleich zu SQL fast trivial ist (wichtig!)
  • Sie können möglicherweise den gesamten Anwendungsserver überspringen, da Sie Ihre Dokumente so gestalten können, dass sie direkt vom Browser mit AJAX abgerufen werden, und ein wenig JavaScript-Polieren hinzufügen, bevor sie als HTML angezeigt werden. (ENORM!!)

Für normale Webanwendungen sind dokument- / JSON-basierte DBs ein enormer Gewinn, und die Nachteile weniger flexibler Abfragen und zusätzlichen Codes für die Datenvalidierung scheinen ein geringer Preis zu sein.

Haben Sie Ihren Kopf gegen etwas geschlagen, das unmöglich erscheint?

Noch nicht. Das Zuordnen / Reduzieren als Mittel zum Abfragen einer Datenbank ist unbekannt und erfordert viel mehr Nachdenken als das Schreiben von SQL. Es gibt eine relativ kleine Anzahl von Grundelementen. Daher ist es in erster Linie eine Frage der Kreativität, wie Sie die Schlüssel angeben, um die gewünschten Ergebnisse zu erzielen.

Es gibt eine Einschränkung darin, dass Abfragen nicht zwei oder mehr Dokumente gleichzeitig anzeigen können - keine Verknüpfungen oder andere Arten von Beziehungen mit mehreren Dokumenten, aber bisher war nichts unüberwindbar.

Als Beispiel sind Einschränkungen und Summen einfach, aber Durchschnittswerte können nicht von einer CouchDB-Ansicht / Abfrage berechnet werden. Fix: Summe zurückgeben und separat zählen und den Durchschnitt auf dem Client berechnen.

Haben Sie die Lücke mit Designmustern geschlossen, z. B. um von einem zum anderen zu übersetzen?

Ich bin mir nicht sicher, ob das machbar ist. Es ist eher eine vollständige Neugestaltung, wie die Übersetzung eines funktionalen Stilprogramms in einen objektorientierten Stil. Im Allgemeinen gibt es weit weniger Dokumenttypen als SQL-Tabellen und mehr Daten in jedem Dokument.

Eine Möglichkeit, sich das vorzustellen, besteht darin, in Ihrem SQL nach Einfügungen und allgemeinen Abfragen zu suchen: Welche Tabellen und Spalten werden beispielsweise aktualisiert, wenn ein Kunde eine Bestellung aufgibt? Und welche für monatliche Verkaufsberichte? Diese Informationen sollten wahrscheinlich im selben Dokument enthalten sein.

Das heißt: Ein Dokument für die Bestellung, das Kunden- und Produkt-IDs enthält, mit nach Bedarf replizierten Feldern, um die Abfragen zu vereinfachen. Alles innerhalb eines Dokuments kann einfach abgefragt werden. Alles, was einen Querverweis zwischen Bestellung und Kunde erfordert, muss vom Kunden erledigt werden. Wenn Sie also einen Bericht über Verkäufe nach Regionen wünschen, sollten Sie wahrscheinlich einen Regionalcode in die Bestellung einfügen.

Machen Sie jetzt überhaupt explizite Datenmodelle (zB in UML)?

Entschuldigung, ich habe auch noch nie viel UML vor Dokument-DBs gemacht :)

Sie benötigen jedoch ein Modell, das angibt, welche Felder zu welchen Dokumenten gehören und welche Arten von Werten sie enthalten. Sowohl zu Ihrer späteren Referenz als auch um sicherzustellen, dass jeder, der die Datenbank verwendet, die Konventionen kennt. Da Sie keine Fehlermeldung mehr erhalten, wenn Sie beispielsweise ein Datum in einem Textfeld speichern und jeder ein beliebiges Feld hinzufügen oder entfernen kann, benötigen Sie sowohl Validierungscode als auch Konventionen, um die Lücke zu schließen. Vor allem, wenn Sie mit externen Ressourcen arbeiten.

Vermissen Sie einen der wichtigsten zusätzlichen Dienste, die RDBMS anbieten?

Nee. Aber mein Hintergrund ist Webanwendungsentwickler, wir beschäftigen uns mit Datenbanken nur in dem Maße, wie wir müssen :)

Ein Unternehmen, für das ich früher gearbeitet habe, hat ein Produkt (eine Webanwendung) entwickelt, das für die Ausführung in SQL-Datenbanken mehrerer Anbieter konzipiert wurde. Die "zusätzlichen Dienste" unterscheiden sich von Datenbank zu Datenbank so stark, dass sie für jede Datenbank separat implementiert werden mussten. Daher war es für uns weniger Arbeit, die Funktionalität aus dem RDBMS zu entfernen. Dies wurde sogar auf die Volltextsuche ausgeweitet.

Was immer ich aufgebe, ist etwas, das ich nie wirklich hatte. Offensichtlich kann Ihre Erfahrung abweichen.


Eine Einschränkung: Ich arbeite gerade an einer Webanwendung für Finanzdaten, Börsenkurse und dergleichen. Dies passt sehr gut zu einer Dokument-Datenbank. Aus meiner Sicht bekomme ich alle Vorteile einer Datenbank (Persistenz und Abfragen) ohne Probleme.

Diese Daten sind jedoch ziemlich unabhängig voneinander, es gibt keine komplexen relationalen Abfragen. Erhalten Sie die neuesten Angebote per Ticker, erhalten Sie Angebote nach Ticker und Datumsbereich, erhalten Sie Unternehmens-Meta-Informationen, das ist so ziemlich alles. Ein anderes Beispiel, das ich gesehen habe, war eine Blog-Anwendung, und Blogs sind auch nicht durch massiv komplizierte Datenbankschemata gekennzeichnet.

Ich versuche zu sagen, dass alle mir bekannten erfolgreichen Anwendungen von Dokument-DBs Daten enthielten, die in erster Linie nicht viel miteinander zu tun hatten: Dokumente (wie in der Google-Suche), Blog-Beiträge, Nachrichtenartikel, Finanzdaten .

Ich gehe davon aus, dass es Datasets gibt, die SQL besser zuordnen als dem Dokumentmodell. Daher kann ich mir vorstellen, dass SQL überleben wird.

Aber für diejenigen von uns, die nur eine einfache Möglichkeit zum Speichern und Abrufen von Daten suchen - und ich vermute, dass es viele von uns gibt - sind Dokumentendatenbanken (wie in CouchDB) ein Glücksfall.

jg-faustus
quelle
9
Sehr hilfreich. Insbesondere "SQL hat unflexible Daten und flexible Abfragen, Dokument-DBs sind umgekehrt" und das Fehlen von Verknüpfungen.
j_random_hacker
2
+1, das war sehr aufschlussreich.
Mas
2
So wahr, ich würde es, wenn möglich, mehr als einmal abstimmen.
Octavian A. Damiean
Dies war 2014 immer noch äußerst nützlich. Es wäre großartig, wenn Sie hinzufügen könnten, was Sie seit 2010 gelernt haben, oder auf Informationen verlinken könnten, die Sie möglicherweise an anderer Stelle haben.
Maggie
11

Ich beantworte dies mit CouchDB im Hinterkopf, aber ich würde annehmen, dass die meisten auch für andere DBs zutreffen würden. Wir haben uns mit CouchDB befasst, uns aber schließlich dagegen entschieden, da unser Datenzugriff nicht im Voraus bekannt ist und Skalierbarkeit nicht das Problem ist.

Schwerer:

  • Umdenken auf konzeptioneller Ebene, so ist es "schwieriger", da es einfach anders ist. Da Sie Ihre Datenzugriffsmuster im Voraus kennen müssen, kann keine automatische Übersetzung angewendet werden. Sie müssten mindestens das Zugriffsmuster hinzufügen.
  • Konsistenz wird nicht von der Datenbank behandelt, sondern muss in der Anwendung behandelt werden. Weniger Garantien bedeuten einfachere Migration, Failover und bessere Skalierbarkeit auf Kosten einer komplizierteren Anwendung. Eine Anwendung muss sich mit Konflikten und Inkonsistenzen befassen.
  • Links, die Dokumente (oder Schlüssel / Wert) überkreuzen, müssen auch auf Anwendungsebene behandelt werden.
  • SQL-Datenbanktypen haben IDEs, die viel ausgereifter sind. Sie erhalten viele Unterstützungsbibliotheken (obwohl die Überlagerung dieser Bibliotheken die Dinge viel komplexer macht als für SQL erforderlich).

Einfacher:

  • Schneller, wenn Sie Ihre Datenzugriffsmuster kennen.
  • Die Migration / das Failover ist für die Datenbank einfacher, da Ihnen als Anwendungsprogrammierer keine Zusagen gemacht werden. Obwohl Sie letztendlich Konsistenz erhalten. Wahrscheinlich. Schließlich. Irgendwann.
  • Ein Schlüssel / Wert ist viel einfacher zu verstehen als eine Zeile aus einer Tabelle. Alle (Baum-) Beziehungen sind bereits vorhanden, und vollständige Objekte können erkannt werden.

Die Modellierung sollte ungefähr gleich sein, aber Sie müssen vorsichtig sein, was Sie in ein Dokument einfügen: UML kann auch sowohl für die OO-Modellierung als auch für die DB-Modellierung verwendet werden, bei der es sich bereits um zwei verschiedene Bestien handelt.

Ich hätte mir eine gute offene OO-Datenbank gewünscht, die gut in C # / Silverlight integriert ist. Nur um die Wahl noch schwieriger zu machen. :) :)

Rutger Nijlunsing
quelle
1

Flache Dateien gelten seit langem als geheimnisvoll und unpraktisch für einen Datensatz jeder Größe. Schnellere Computer mit mehr Speicher ermöglichen es jedoch, eine Datei in den Speicher zu laden und in Echtzeit zu sortieren, zumindest für relativ kleine n und lokale Einzelbenutzeranwendungen.

Beispielsweise können Sie normalerweise eine Datei mit 10.000 Datensätzen lesen UND in weniger als einer halben Sekunde nach einem Feld sortieren. Dies ist eine akzeptable Antwortzeit.

Natürlich gibt es Gründe, eine Datenbank anstelle einer Flatfile zu verwenden - relationale Operationen, Datenintegrität, Mehrbenutzerfähigkeit, Remotezugriff, größere Kapazität, Standardisierung usw., aber eine erhöhte Computergeschwindigkeit und Speicherkapazität haben zu einer Manipulation im Speicher geführt von Daten in einigen Fällen praktischer.

xpda
quelle
1

Die relationalen Datenbanken, die ich im wirklichen Leben sehe, sind entgegen Ihrer Behauptung in der Regel überhaupt nicht sehr gut normalisiert. Auf Nachfrage sagen mir die Designer, dass dies hauptsächlich auf die Leistung zurückzuführen ist. RDBMs können nicht gut zusammengefügt werden, daher sind Tabellen aus Sicht der Normalisierung viel zu breit. Objektorientierte Datenbanken sind in der Regel viel besser darin.

Ein weiterer Punkt, an dem RDBMs Probleme haben, ist die Behandlung von geschichts- / zeitabhängigen Schlüsseln.

Stephan Eggermont
quelle
3
Stephan - Sie haben Recht, dass reale Systeme in der Normalisierungsabteilung häufig fehlen. Es ist jedoch nicht richtig zu sagen, dass RDBMses "nicht gut beitreten können"; Die meisten kommerziellen Produkte (wie Oracle, MS SQL Server usw.) verfügen über extrem fortschrittliche Abfrageoptimierer und können eine Vielzahl verschiedener physikalischer Verknüpfungsalgorithmen ausführen, weitaus schneller als dieselben Vorgänge im Anwendungscode ausgeführt werden könnten. (MySQL ist eine Ausnahme, soweit ich weiß). Nach meiner Erfahrung ist eine vorzeitige Denormalisierung wie andere vorzeitige Optimierungen häufig ein Zeichen für schlechte Entwickler.
Ian Varley
2
Fortsetzung dieses Gedankens: Schlechte Verknüpfungen sind das Ergebnis einer schlechten Indizierung und Statistik. Wenn der Optimierer nichts zu tun hat oder die Informationen darüber, was er hat, veraltet sind, trifft er schlechte Entscheidungen. Viele verwechseln dies mit "schlechtem Beitritt". Moderne RDBMs Systeme haben Selbstoptimierung , die Masken die Notwendigkeit für Ihr Gehirn zu verwenden , wenn die Indizierung und Statistiken einrichten. Außerdem verwechseln Menschen das logische Schema (fünfte Normalform) und das physikalische Schema (häufig auf die dritte Normalform denormalisiert). Nur weil die DB, die Sie sehen, "breit" ist, heißt das nicht, dass sie logisch schlecht gestaltet wurde.
Godeke