Sto cercando di riscrivere un'applicazione on-premise (installata localmente) basata su VB (fatturazione + inventario) come applicazione Clojure basata sul web per i clienti delle piccole imprese. Intendo che questo sia offerto come applicazione SaaS per clienti in attività simili.
Stavo guardando le opzioni del database: la mia scelta era un RDBMS: Postgresql / MySQL. Potrei scalare fino a 400 utenti nel primo anno, con in genere 20-40 visualizzazioni di pagina / al giorno per utente, principalmente per transazioni non viste statiche. Ogni vista coinvolgerà il recupero dei dati e l'aggiornamento dei dati. È necessaria la conformità ACID (o almeno così penso). Quindi il volume delle transazioni non è enorme.
Sarebbe stato un gioco da ragazzi scegliere uno di questi in base alle mie preferenze, ma per questo requisito, che credo sia tipico di un'app SaaS: lo schema cambierà quando aggiungo più clienti / utenti e per ogni cliente cambiamento delle esigenze aziendali (offrirò una flessibilità limitata solo per cominciare). Dato che non sono un esperto di DB, in base a ciò che posso pensare e che ho letto, posso gestirlo in diversi modi:
- Disporre di uno schema RDBMS tradizionale in MySQl / Postgresql con un singolo DB che ospita più tenant. E aggiungi abbastanza colonne "fluttuanti" in ogni tabella per consentire modifiche future mentre aggiungo più clienti o modifiche per un cliente esistente. Ciò potrebbe avere un aspetto negativo nel propagare le modifiche al DB ogni volta che viene apportata una piccola modifica allo schema. Ricordo di aver letto che in Postgresql gli aggiornamenti dello schema possono essere eseguiti in tempo reale senza blocco. Ma non sono sicuro di quanto sia doloroso o pratico in questo caso d'uso. Inoltre, poiché le modifiche allo schema potrebbero introdurre anche modifiche SQL nuove / minori.
- Avere un RDBMS, ma progettare lo schema del database in modo flessibile: con un valore di attributo-entità vicino o semplicemente come un archivio di valori-chiave. (Workday, FriendFeed per esempio)
- Conserva l'intero oggetto in memoria come oggetti e memorizzalo periodicamente nei file di registro (ad esempio, edval, lmax)
- Scegli un DB NoSQL come MongoDB o Redis. Ma in base a ciò che posso raccogliere, non sono adatti per questo caso d'uso e non sono pienamente conformi all'ACID.
- Scegli alcuni Dbs NewSQL come VoltDb o JustoneDb (basati su cloud) che mantengono il comportamento conforme a SQL e ACID e sono RDBMS "di nuova generazione".
- Ho guardato neo4j (graphdb), ma non sono sicuro che si adatterà a questo caso d'uso
Nel mio caso d'uso, più che scalabilità o calcolo distribuito, sto cercando un modo migliore per ottenere "Flessibilità nello schema + ACID + alcune prestazioni ragionevoli". La maggior parte degli articoli che ho trovato in rete parlano di flessibilità nello schema come causa che porta alle prestazioni (nel caso dei DB NoSQL) e alla scalabilità, lasciando fuori il lato ACID / Transazioni.
È un caso "uno o" delle transazioni "Flessibilità dello schema rispetto all'ACID" o Esiste una via d'uscita migliore?