Frage

Ich bin zu hören, über Design-Strategien interessiert Sie verwendet haben, nicht-relational „NoSQL“ Datenbanken - das heißt, die (meist neu) Klasse von Datenspeichern, die nicht traditionellen relationalen verwenden Sie Design oder SQL (wie Hyper, CouchDB, SimpleDB, Google App Engine-Datenspeicher, Voldemort, Cassandra, SQL Data Services, etc.). Sie sind auch als „Schlüssel / Wert-stores“ bezeichnet oft und an der Basis wirken sie wie riesige verteilte persistenten Hash-Tabellen.

Insbesondere möchte ich über die Unterschiede in konzeptionelle Daten Design mit diesen neuen Datenbanken lernen. Was ist leichter, was schwieriger ist, was nicht getan werden kann?

  • Haben Sie kommen mit alternativen Entwürfen, dass die Arbeit viel besser in der nicht-relationalen Welt?

  • Haben Sie schlagen den Kopf gegen alles, was unmöglich scheint?

  • Haben Sie die Lücke mit irgendwelchen Entwurfsmuster überbrückt, z.B. von einem zum anderen zu übersetzen?

  • Haben Sie auch explizite Datenmodelle überhaupt jetzt tun (zum Beispiel in UML) oder haben Sie werfen sie ganz für semi-strukturierte / dokumentenorientierte Daten Blobs?

  • Haben Sie eine der wichtigsten zusätzlichen Leistungen vermissen, dass RDBMSes bieten, wie relationale Integrität, beliebig komplexe Transaktionsunterstützung, Trigger usw.?

Ich komme aus einem relationalen SQL-DB Hintergrund, so Normalisierung in meinem Blut. Das sei gesagt, erhalte ich die Vorteile von nicht-relationalen Datenbanken zur Vereinfachung und Skalierung, und mein Bauch sagt mir, dass es eine reichere Überlappung von Design-Funktionen sein muss. Was haben Sie getan?

FYI, gibt es Diskussionen Stackoverflow zu ähnlichen Themen hier:

War es hilfreich?

Lösung

Ich glaube, Sie haben zu prüfen, dass der nicht-relationalen DBMS eine Menge in Bezug auf ihr Datenmodell unterscheiden und damit das konzeptionellen Daten Design auch sehr unterschiedlich sein. In dem Thread Data Design in nicht-relationalen Datenbanken der NoSQL-Google-Gruppe die verschiedenen Paradigmen sind wie folgt eingeteilt:

  1. Bigtable-ähnliche Systeme (HBase, Hypertable, etc)
  2. Key-Wert speichert (Tokio, Voldemort, etc)
  3. Dokumentendatenbanken (CouchDB, MongoDB, etc.)
  4. Graph-Datenbanken (Allegrograph, Neo4j, Sesam, etc)

Ich bin meistens in Graph-Datenbanken und die Eleganz der Daten Design dieses Paradigma war, was es brachte mich, müde von den Unzulänglichkeiten der RDBMS . Ich habe ein paar Beispiele von Daten Design stellen eine Graph-Datenbank unter Verwendung von auf dieser Wikiseite und es gibt eine Beispiel dafür, wie der Grund modellieren zu IMDB Film / Schauspieler / Rollendaten.

Die Präsentationsfolien (Slideshare) Graphdatenbanken und die Zukunft der Groß Knowledge Management von Marko Rodriguez enthält eine sehr schöne Einführung in Daten Design einer graph-Datenbank als auch mit.

Die Beantwortung der spezifischen Fragen aus einer GraphDB Sicht:

Alternate Design. Hinzufügen von Beziehungen zwischen vielen verschiedenen Arten von Einheiten ohne Sorgen oder eine Notwendigkeit, vordefinieren, welche Unternehmen erreichen können,

Die Lücke: Ich neige dazu, für jeden Fall dieses anderes zu tun, auf der Basis der Domain selbst, da ich nicht über eine „tabellenorientierte Graph“ will und dergleichen. Allerdings hier einige Informationen über die automatische Übersetzung von RDBMS GraphDB.

Explizite Datenmodelle. Ich mache diese ganze Zeit (Whiteboard-Stil), und dann das Modell verwenden, wie es in der DB als auch ist

Miss von RDBMS Welt: einfache Möglichkeiten, Berichte zu erstellen. Update: vielleicht ist es nicht , die Fest Berichte aus einer Graph-Datenbank zu erstellen, finden Sie unter einen Bericht für eine Neo4j Beispieldatenbank erstellen.

Andere Tipps

Ich habe nur mit nicht-relationale DBs gerade erst begonnen, und ich versuche immer noch meinen Kopf herum zu wickeln sie und herauszufinden, was das beste Modell wäre. Und ich kann nur sprechen für CouchDB.

Aber ich habe einige vorläufige Schlussfolgerungen:

Haben Sie mit alternativen Entwürfen, dass die Arbeit viel besser in der nicht-relationalen Welt kommen?

Die Design-Fokus verschiebt. Das Design des Dokumentmodells (entsprechend DB-Tabellen) wird fast irrelevant, während alles Scharniere auf die Ansichten der Gestaltung (auf Anfragen entspricht)

Das Dokument DB Art von Swaps der Komplexität: SQL hat unflexiblen Daten und flexible Abfragen, Dokument DBs sind umgekehrt

.

Die CouchDB-Modell ist eine Sammlung von „JSON-Dokumenten“ (im Grunde verschachtelte Hash-Tabellen). Jedes Dokument hat eine eindeutige ID und kann trivialerweise durch ID abgerufen werden. Für jede andere Abfrage Sie „Ansichten“ schreiben, die Sätze der Karte genannt werden / reduzieren Funktionen. Die Ansichten geben einen Ergebnismenge als eine Liste von Schlüssel / Wert-Paaren.

Der Trick ist, dass Sie die Datenbank nicht in dem Sinne, abfragen Sie eine SQL-Datenbank-Abfrage: Die Ergebnisse der Ansicht Funktionen laufen in einem Index gespeichert sind, und nur der Index abgefragt werden können. (Als "alles bekommen", "Schlüssel bekommen" oder "get-Tastenbereich").

Die nächste Analogie in der SQL-Welt wäre, wenn Sie nur die DB mit gespeicherten Prozeduren nicht abfragen - jede Abfrage, die Sie unterstützen wollen vorgegeben werden muß.

Die Gestaltung der Dokumente ist enorm flexibel. Ich habe nur zwei Constraints gefunden:

  • Halten Sie die zugehörigen Daten zusammen im selben Dokument, da gibt es nichts, entsprechend einen Join.
  • Sie nicht, die Dokumente machen so groß, dass sie zu häufig aktualisiert werden (wie wenn man alle Unternehmen einen Umsatz für das Jahr im selben Dokument), da jedes Dokument Update löst eine erneute Indizierung.

Aber alles Scharnier auf die Ansichten der Gestaltung.

Die alternativen Entwürfe, die ich gefunden habe, dass die Arbeit Größenordnung besser mit CouchDB als jede SQL-Datenbank auf Systemebene sind eher als die Speicherebene. Wenn Sie einige Daten haben und sie zu einer Webseite dienen soll, wird die Komplexität des Gesamtsystems reduziert um mindestens 50%:

  • keine Gestaltung DB-Tabellen (kleine Ausgabe)
  • keine ODBC / JDBC-Zwischenschicht, alle Anfragen und Transaktionen über http (moderate Ausgabe)
  • einfaches DB-Objekt-Mapping von JSON, die fast trivial ist im Vergleich zu dem gleichen in SQL (wichtig!)
  • Sie können möglicherweise die gesamte Anwendungsserver überspringen, wie Sie Ihre Dokumente entwerfen können vom Browser AJAX direkt abgerufen werden unter Verwendung und ein wenig JavaScript Polier hinzufügen, bevor sie als HTML angezeigt werden. (riesig !!)

Für normale Webapps, Dokumenten- / JSON-basierte DBs sind ein massiver Sieg, und die Nachteile von weniger flexible Abfragen und einige zusätzliche Code für die Datenvalidierung scheint ein kleiner Preis zu zahlen.

Haben Sie Ihren Kopf gegen etwas treffen, das unmöglich scheint?

Noch nicht. Map / Reduce als Mittel zur Abfrage einer Datenbank nicht vertraut ist, und erfordert viel mehr zu denken als SQL schreiben. Es ist eine ziemlich kleine Anzahl von Grundelementen, so die Ergebnisse, die Sie brauchen in erster Linie eine Frage ist, kreativ zu sein mit, wie Sie die Schlüssel angeben.

Es gibt eine Einschränkung, dass Anfragen nicht an zwei oder mehr Dokumente gleichzeitig sehen kann - nicht beitritt oder andere Arten von Multi-Dokument-Beziehungen, aber nichts hat bisher unüberwindbar gewesen.

Als Beispiel Einschränkung, Grafen und Summen sind einfach, aber mittelt kann nicht durch eine CouchDB Ansicht / Abfrage berechnet werden. Fix: Return Summe und die Anzahl separat und berechnen den Durchschnitt auf dem Client

.

Haben Sie die Lücke mit irgendwelchen Entwurfsmuster überbrückt, z.B. von einem zum anderen zu übersetzen?

Ich bin nicht sicher, ob das machbar ist. Es ist eher ein komplettes Redesign, wie ein funktionales Design-Programm zu einem objektorientierten Stil zu übersetzen. Im Allgemeinen gibt es weit fEwer Dokumenttypen, als es SQL-Tabellen und Daten in jedem Dokument.

Eine Möglichkeit, daran zu denken ist für Einsätze und gemeinsame Abfragen in Ihrer SQL aussehen: Welche Tabellen und Spalten aktualisiert werden, wenn ein Kunde einen Auftrag erteilt, zum Beispiel? Und welche für monatliche Berichte über die Verkäufe? Das Info soll wohl im selben Dokument gehen.

Das ist: Ein Eintrag für den Auftrag, Kunden-ID und Produkt-IDs enthält, mit replizierten Feldern nach Bedarf der Abfragen zu vereinfachen. Alles, was in einem Dokument kann leicht abgefragt werden, alles, was zwischen etwa Auftrags- und Kundenquerverweisen erfordert vom Auftraggeber durchgeführt werden. Also, wenn Sie einen Bericht über die Umsätze nach Regionen wollen, sollten Sie vielleicht einen Regionalcode in die Ordnung bringen.

Haben Sie explizite Datenmodelle überhaupt jetzt auch tun (zum Beispiel in UML)?

Es hat nie viel UML vor Dokument DBs entweder :)

Aber Sie brauchen eine Art von Modell zu sagen, welche Felder gehören, in denen Dokumente und welche Arten von Werten, die sie enthalten. Sowohl für die eigene Referenz später und um sicherzustellen, dass everybod die DB mit kennt die Konventionen. Da Sie nicht mehr eine Fehlermeldung erhalten, wenn Sie ein Datum in einem Textfeld zu speichern, zum Beispiel, und jeder kann ein beliebiges Feld sie sich anfühlen hinzuzufügen oder zu entfernen, müssen Sie sowohl Validierungscode und Konventionen, um die Bresche zu springen. Vor allem, wenn Sie arbeiten mit externen Ressourcen.

Verpassen Sie eines der wichtigsten Zusatzleistungen, dass RDBMSes bieten?

Nein. Aber mein Hintergrund ist Web-Anwendungsentwickler, beschäftigen wir uns mit Datenbanken nur in dem Maße, dass wir müssen :)

Eine Firma, die ich zur Arbeit verwenden für ein Produkt aus (a Webapp), die entworfen wurde über SQL-Datenbanken von mehreren Anbietern zu laufen, und die „Zusatzleistungen“ sind so verschieden von DB zu DB, dass sie umgesetzt werden mußten separat für jede DB. So ist es weniger Arbeit war für uns die Funktionalität aus dem RDBMS zu bewegen. Dies auch auf die Volltextsuche erweitert.

Also, was ich bis gebe ist etwas, das ich nie wirklich in erster Linie habe. Offensichtlich können Sie Ihre Erfahrungen unterscheiden.


Ein Vorbehalt: Was ich jetzt bin auf ein Webapp für Finanzdaten, Aktienkurse und dergleichen. Dies ist ein sehr gutes Spiel für ein Dokument DB, aus meiner Sicht ich alle Vorteile eines DB (Persistenz und Abfragen) erhalten, ohne dass der Aufwand.

Aber diese Daten sind ziemlich unabhängig voneinander, es gibt keine komplexen relationalen Abfragen. Holen Sie sich aktuelle Zitate von Ticker, erhalten Angebote von Ticker und Datumsbereich, erhalten Unternehmen Meta-Informationen, die so ziemlich alles davon ist. Ein weiteres Beispiel, das ich sah, war eine Blog-Anwendung, und Blogs werden nicht durch massiv erschwert Datenbankschemata entweder aus.

Was ich versuche zu sagen, dass alle erfolgreichen Anwendungen von Dokumenten DBs Ich kenne mit Daten gewesen, die viele Beziehungen in erster Linie nicht haben: Dokumente (wie in der Google-Suche), Blog-Posts, Nachrichten Artikel , Finanzdaten.

Ich gehe davon aus, dass es Datensätze, die auf SQL Karte besser als auf das Dokumentenmodell, so stelle ich mir SQL überleben wird.

Aber für diejenigen von uns, dass nur eine einfache Art und Weise zu speichern möchten und Abrufen von Daten - und ich vermute, dass es viele von uns -. Dokumentendatenbanken (wie in CouchDB) sind ein Geschenk des Himmels

Ich beantworte diese mit CouchDB im Hinterkopf, aber ich würde vermuten, die meisten würden auch für andere DBs wahr sein. Wir sahen mit CouchDB, aber schließlich dagegen entschieden, da unser Datenzugriff ist nicht bekannt, vorher und Skalierbarkeit ist nicht das Problem.

Härtere:

  • auf konzeptioneller Ebene Takes Umdenken so ist es ‚schwieriger‘, da es einfach anders ist. Da Sie Ihre Datenzugriffsmuster im Voraus wissen müssen, keine automatische Übersetzung angewendet werden kann. Sie müssten die Zugriffsmuster zumindest hinzuzufügen.
  • Konsistenz ist nicht von der Datenbank behandelt, sondern muss mit der Anwendung behandelt werden. Weniger garantiert mittels einfacher Migration, Failover und eine bessere Skalierbarkeit auf Kosten einer komplizierteren Anwendung. Eine Anwendung hat mit Konflikten und Unstimmigkeiten zu behandeln.
  • Links, die Quer Dokumente (oder Schlüssel / Wert) haben auch auf Anwendungsebene behandelt werden.
  • SQL-Typ von Datenbanken haben IDEs, die reifen viel mehr sind. Sie erhalten viel Unterstützung Bibliotheken (obwohl die Schichtung dieser Bibliotheken Dinge viel komplizierter machen, als für SQL erforderlich).

Einfachere:

  • Schneller, wenn Sie Ihre Datenzugriffsmuster kennen.
  • Migration / Fail-over ist einfacher für die Datenbank, da keine Versprechungen für Sie als Anwendungsprogrammierer gemacht werden. Obwohl Sie eventuelle Konsistenz erhalten. Wahrscheinlich. Endlich. Einige Zeit.
  • Ein Schlüssel / Wert ist viel einfacher zu verstehen als eine Zeile aus einer Tabelle. Alle die (Baum) Beziehungen sind bereits in und vollständige Objekte erkannt werden können.

Die Modellierung in etwa gleich sein soll, aber man muss vorsichtig sein, was Sie in einem Dokument einfügen. UML kann auch als DB-Modellierung als auch für beide OO-Modellierung verwendet werden, die zwei unterschiedliche Tiere bereits

würde ich gerne eine gute offene OO Datenbank gut integriert mit C # / Silverlight sehen. Nur um die Wahl noch schwieriger. :)

haben flache Dateien lange obskure und unpraktisch für einen Datensatz jeder Größe betrachtet. Allerdings schnellerer Computer mit mehr Speichern macht es möglich, eine Datei in dem Speicher und sortiert sie in Echtzeit geladen werden, zumindest für angemessen kleine n und lokale, Single-User-Anwendungen.

Zum Beispiel können Sie in der Regel eine Datei von 10.000 Datensätze lesen und sortieren sie auf einem Feld in weniger als einer halben Sekunde, um eine akzeptable Antwortzeit.

Natürlich gibt es Gründe, eine Datenbank statt einer flachen Datei verwenden - relationalen Operationen, Datenintegrität, Multi-User-Fähigkeit, Remote acccess, größere Kapazität, Standardisierung, etc., aber erhöht die Geschwindigkeit des Computers und Speicherkapazität gemacht haben in -Speicher Manipulation von Daten praktischer in einigen Fällen.

Die relationalen Datenbanken ich im wirklichen Leben sehen sind in der Regel sehr, dass sie nicht gut auf alle normierten, im Gegensatz zu Ihrem Anspruch. Wenn Sie gefragt werden, sagen die Designer, die mir vor allem wegen der Leistung. RDBMs sind nicht gut in Verbindung, so Tische sind in der Regel viel zu weit von einer Normalisierung Sicht zu sein. Objektorientierte Datenbanken ist in der Regel viel besser, dies zu sein.

Ein weiterer Punkt, an dem RDBMs Problem ist der Umgang mit Geschichte / zeitabhängigen Tasten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top