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:
Antworten:
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:
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 .
quelle
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:
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:
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.
quelle
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:
Einfacher:
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. :) :)
quelle
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.
quelle
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.
quelle