SQL vs NoSQL für ein Warenwirtschaftssystem

8

Ich entwickle eine JAVA-basierte Webanwendung. Das Hauptziel besteht darin, Inventar für Produkte zu haben, die auf mehreren Websites, die als Kanäle bezeichnet werden, verkauft werden. Wir werden als Manager für alle diese Kanäle fungieren. Was wir brauchen, ist:

  1. Warteschlangen zum Verwalten von Inventaraktualisierungen für jeden Kanal.
  2. Inventory-Tabelle mit einem korrekten Snapshot der Zuordnung für jeden Kanal.
  3. Halten Sie Sitzungs-IDs und andere Schnellzugriffsdaten in einem Cache.
  4. Bereitstellung eines Facebook ähnlichen Dashboards (XMPP), um den Verkäufer so schnell wie möglich auf den neuesten Stand zu bringen.

Die Lösungen, die ich betrachte, sind Postgres (unsere Datenbank bisher im synchronen Replikationsmodus), NoSQL-Lösungen wie Cassandra, Redis, CouchDB und MongoDB.

Meine Einschränkungen sind:

  1. Inventaraktualisierungen können nicht verloren gehen.
  2. Job-Warteschlangen sollten in der Reihenfolge ausgeführt werden und vorzugsweise nie verloren gehen.
  3. Einfache / schnelle Entwicklung und zukünftige Wartung.

Ich bin offen für irgendwelche Vorschläge. Danke im Voraus.

    
gladiator 30.11.2011, 07:32
quelle

3 Antworten

9
  
  1. Warteschlangen zum Verwalten von Inventaraktualisierungen für jeden Kanal.
  2.   

Dies ist nicht unbedingt ein Datenbankproblem. Sie könnten besser auf ein Messaging-System (z. B. RabbitMQ) schauen

  
  1. Inventory-Tabelle mit einem korrekten Snapshot der Zuordnung für jeden Kanal.
  2.   
  3. Halten Sie Sitzungs-IDs und andere Schnellzugriffsdaten in einem Cache.
  4.   

Sitzungsdaten sollten wahrscheinlich in einer separaten Datenbank abgelegt werden, die für die Aufgabe besser geeignet ist (z. B. memcached, redis usw.) Es gibt keine einheitliche DB

  
  1. Bereitstellung eines Facebook ähnlichen Dashboards (XMPP), um den Verkäufer so schnell wie möglich auf den neuesten Stand zu bringen.
  2.   

Meine Einschränkungen sind:   1. Inventaraktualisierungen können nicht verloren gehen.

Es gibt 3 Möglichkeiten, diese Frage zu beantworten:

  1. Diese Funktion muss von Ihrer Anwendung bereitgestellt werden. Die Datenbank kann garantieren, dass ein fehlerhafter Datensatz zurückgewiesen und zurückgesetzt wird, aber nicht garantieren, dass jede Abfrage eingegeben wird. Die App muss intelligent genug sein, um zu erkennen, wenn ein Fehler auftritt, und es erneut versuchen.

  2. Einige DBs speichern Datensätze im Speicher und leeren den Speicher perido- kal auf die Festplatte, was bei einem Stromausfall zu Datenverlust führen kann. (Mongo funktioniert standardmäßig so, es sei denn, Sie aktivieren das Journaling. CouchDB hängt immer an die Datensätze an (sogar ein Löschen ist ein Flag, das an den Datensatz angehängt wird, so dass ein Datenverlust extrem schwierig ist))

  3. Einige DBs sind so konstruiert, dass sie extrem zuverlässig sind, selbst wenn ein Erdbeben, ein Hurrikan oder andere Naturkatastrophen zuschlagen, bleiben sie dauerhaft. Dazu gehören Cassandra, Hbase, Riak, Hadoop usw.

Auf welche Art von Haltbarkeit beziehen Sie sich?

  
  1. Job-Warteschlangen sollten in der Reihenfolge ausgeführt werden und vorzugsweise nie verloren gehen.
  2.   

Die meisten NoSQL-Lösungen laufen lieber parallel. Sie haben also zwei Möglichkeiten. 1. Verwenden Sie einen DB, der die gesamte Tabelle für jede Abfrage sperrt (langsamer) 2. Erstellen Sie eine App, die smarter oder eventierter ist (clientseitige sequenzielle Warteschlange)

  
  1. Einfache / schnelle Entwicklung und zukünftige Wartung.
  2.   

Im Allgemeinen werden Sie feststellen, dass SQL schneller entwickelt werden kann, aber Änderungen können schwieriger zu implementieren sein noSQL erfordert möglicherweise ein wenig mehr Planung, ist jedoch einfacher, Ad-hoc-Abfragen oder Schemaänderungen durchzuführen.

Die Fragen, die Sie sich wahrscheinlich selbst stellen müssen, sind eher wie folgt:

  1. "Benötige ich intensive Anfragen oder eine tiefgehende Analyse, für die Map / Reduce besser geeignet ist?"

  2. "muss ich mein Schema häufig ändern?

  3. "sind meine Daten sehr relational? Auf welche Weise?"

  4. "Hat der Verkäufer hinter meiner ausgewählten Datenbank genügend Erfahrung, um mir zu helfen, wenn ich sie brauche?"

  5. "Benötige ich spezielle Funktionen wie GeoSpatial-Indexierung, Volltextsuche usw.?

  6. "Wie nahe an Echtzeit brauche ich meine Daten? Wird es weh tun, wenn ich nicht bis zu 1 Sekunde später die neuesten Datensätze in meinen Abfragen sehen kann? Welche Latenz ist akzeptabel?"

  7. "Was brauche ich wirklich in Bezug auf Fail-Over"

  8. "Wie groß sind meine Daten? Wird es in den Speicher passen? Wird es auf einen Computer passen? Ist jeder einzelne Datensatz groß oder klein?

  9. "Wie oft ändern sich meine Daten? Ist das ein Archiv?"

Wenn Sie mehrere Kunden (Channels?) mit jeweils eigenen Inventory-Schemas haben, kann eine dokumentenbasierte DB ihre Vorteile haben. Ich erinnere mich an eines Mal, als ich ein E-Commerce-System mit Inventar anschaute und es hatte fast 235 Tabellen! Wenn Sie wiederum bestimmte relationale Daten haben, kann eine SQL-Lösung auch einige Vorteile haben.

Ich kann sicherlich sehen, wie ich eine Lösung mit Mongo, Couch, Riak oder Orientdb mit den gegebenen Einschränkungen bauen könnte. Aber was ist das Beste? Ich würde versuchen, direkt mit DB-Anbietern zu sprechen und vielleicht die Nosql-Bänder anzuschauen.

    
BenG 06.12.2011 05:24
quelle
4

Adressierung Ihrer Einschränkungen:

  1. Die meisten NoSQL-Lösungen bieten einen konfigurierbaren Kompromiss zwischen Konsistenz und Leistung. In MongoDB können Sie zum Beispiel entscheiden, wie dauerhaft ein Schreibvorgang sein soll. Wenn Sie möchten, können Sie erzwingen, dass der Schreibvorgang für alle Replikatgruppenserver fsync ist. Im anderen Extremfall können Sie den Befehl senden und nicht einmal auf die Antwort des Servers warten.

  2. Das Ausführen von Jobwarteschlangen in der richtigen Reihenfolge scheint ein Problem mit dem Anwendungscode zu sein. Ich würde sagen, ein Zeitstempel in der db und eine order by Art der Abfrage sollte für die meisten Anwendungen tun. Wenn Sie mehrere Anwendungsserver haben und Ihre Warteschlangen perfekt sein müssen, müssen Sie ein wahrer verteilter Algorithmus , der Ordnung schafft, aber das ist keine typische Anforderung, und es ist in der Tat sehr schwierig.

  3. Wir verwenden MongoDB schon seit einiger Zeit und ich bin davon überzeugt, dass dies Ihrer App-Entwicklungsgeschwindigkeit einen echten Schub gibt. Es gibt keinen großen Unterschied in der Wartung, die Pflege der Daten ist auf jeden Fall schmerzhaft. Wenn Sie kein Schema haben, erhalten Sie zusätzliche Flexibilität (faule Migrationen), aber es ist aufwendiger und erfordert etwas Sorgfalt.

Zusammenfassend würde ich sagen, dass Sie beides tun können. Der NoSQL ist mehr Code-getrieben, und Transaktionen und relationale Integrität werden meist von Ihrem Code verwaltet. Wenn Sie sich damit nicht wohl fühlen, suchen Sie eine relationale Datenbank.

Wenn Ihre Daten jedoch sehr umfangreich sind, müssen Sie einen Teil dieser Logik manuell codieren, da Sie wahrscheinlich keine Echtzeit-Joins in einer 10B-Zeilen-Datenbank ausführen möchten. Dennoch können Sie das auch mit SQL implementieren.

Eine gute Möglichkeit, die Grenze für verschiedene Datenbanken zu finden, ist zu überlegen, was Sie zwischenspeichern können. Daten, die jederzeit zwischengespeichert und rekonstruiert werden können, sind eine gute Möglichkeit, eine neue Schicht einzuführen, da dort keine großen Risiken bestehen. Zwischengespeicherte Daten behalten normalerweise keine Beziehungen, so dass Sie hier keine Konsistenz verlieren.

    
mnemosyn 30.11.2011 11:46
quelle
3

NoSQL ist für diese Anwendung nicht korrekt.

Ich meine, Sie können es sicher verwenden, aber Sie werden am Ende viel von dem umsetzen, was SQL für Sie bietet. Zum Beispiel sehe ich dort viele Beziehungen. Sie möchten auch ACID (obwohl einige NoSQL-Lösungen dies bieten).

Es gibt keinen Grund, warum Sie nicht beide verwenden können - relationale Daten in relationalen Datenbanken und nicht-relationale Daten in Schlüssel / Wert-Speichern.

    
Ariel 30.11.2011 07:37
quelle