Ich habe vor, eine VB-basierte (lokal installierte) Anwendung (Fakturierung + Inventar) als webbasierte Clojure-Anwendung für kleine Unternehmenskunden umzuschreiben. Ich beabsichtige, dies als SaaS-Anwendung für Kunden in ähnlichen Branchen anzubieten.
Ich habe mir Datenbankoptionen angesehen: Meine Wahl war ein RDBMS: Postgresql / MySQL. Ich kann im ersten Jahr auf bis zu 400 Benutzer skalieren, mit normalerweise 20 bis 40 Seitenaufrufen pro Tag und Benutzer - hauptsächlich für Transaktionen, die keine statischen Ansichten sind. In jeder Ansicht werden Daten abgerufen und aktualisiert. ACID-Konformität ist notwendig (glaube ich). Das Transaktionsvolumen ist also nicht riesig.
Es wäre ein Kinderspiel gewesen, eine dieser Optionen nach meinen Wünschen auszuwählen, aber für diese eine Anforderung, von der ich glaube, dass sie typisch für eine SaaS-App ist: Das Schema ändert sich, wenn ich mehr Kunden / Benutzer und für jeden Kunden hinzufüge sich ändernde Geschäftsanforderungen (ich biete eine begrenzte Flexibilität anfangs nur an). Da ich kein DB-Experte bin, kann ich, basierend auf dem, was ich mir vorstellen und gelesen habe, auf verschiedene Arten damit umgehen:
- Haben Sie ein traditionelles RDBMS-Schema-Design in MySQl / Postgresql mit einer einzelnen Datenbank, die mehrere Mandanten hostet. Fügen Sie in jede Tabelle genügend "frei schwebende" Spalten ein, um zukünftige Änderungen zu ermöglichen, wenn ich weitere Kunden oder Änderungen für einen vorhandenen Kunden hinzufüge. Dies kann den Nachteil haben, dass die Änderungen jedes Mal, wenn eine kleine Änderung am Schema vorgenommen wird, in die Datenbank übernommen werden. Ich erinnere mich, dass ich gelesen habe, dass in Postgresql Schema-Updates in Echtzeit ohne Sperren durchgeführt werden können. Aber nicht sicher, wie schmerzhaft oder wie praktisch es in diesem Anwendungsfall ist. Und auch, da die Schemaänderungen auch neue / kleinere SQL-Änderungen einführen könnten.
- Haben Sie ein RDBMS, aber entwerfen Sie das Datenbankschema auf flexible Weise: mit einem Entity-Attribut-Wert oder einfach als Schlüsselwertspeicher. (Arbeitstag, FriendFeed zum Beispiel)
- Habe das ganze Ding im Speicher als Objekte und speichere sie regelmäßig in Log-Dateien (zB edval, lmax)
- Entscheiden Sie sich für eine NoSQL-Datenbank wie MongoDB oder Redis. Aber soweit ich das beurteilen kann, sind sie nicht für diesen Anwendungsfall geeignet und nicht vollständig ACID-konform.
- Entscheiden Sie sich für einige NewSQL-Datenbanken wie VoltDb oder JustoneDb (Cloud-basiert), die das SQL- und ACID-kompatible Verhalten beibehalten und RDBMS der neuen Generation sind.
- Ich habe mir neo4j (graphdb) angesehen, bin mir aber nicht sicher, ob das in diesen Anwendungsfall passt
In meinem Anwendungsfall geht es nicht nur um Skalierbarkeit oder verteiltes Computing, sondern auch um einen besseren Weg, um "Flexibilität in Schema + ACID + angemessene Leistung" zu erzielen. Die meisten Artikel, die ich im Internet finden konnte, sprechen von Flexibilität im Schema als Ursache für Leistung (im Fall von NoSQL-DBs) und Skalierbarkeit, während die ACID / Transactions-Seite weggelassen wird.
Handelt es sich um ein "Entweder" oder einen "Fall" von "Schema-Flexibilität gegen ACID" -Transaktionen oder gibt es einen besseren Ausweg?