Estoy buscando reescribir una aplicación local basada en VB (instalada localmente) (facturación + inventario) como una aplicación Clojure basada en la web para clientes de pequeñas empresas. Tengo la intención de que esto se ofrezca como una aplicación SaaS para clientes en el comercio similar.
Estaba buscando opciones de base de datos: mi elección fue un RDBMS: Postgresql / MySQL. Podría escalar hasta 400 usuarios en el primer año, con un promedio de 20 a 40 páginas vistas por día por usuario, principalmente para transacciones que no son vistas estáticas. Cada vista implicará buscar datos y actualizar datos. El cumplimiento de ACID es necesario (o eso creo). Entonces el volumen de la transacción no es enorme.
Hubiera sido obvio elegir cualquiera de estos según mi preferencia, pero para este requisito, que creo que es típico de una aplicación SaaS: el esquema cambiará a medida que agregue más clientes / usuarios y para cada cliente requisitos comerciales cambiantes (para empezar, ofreceré cierta flexibilidad limitada). Como no soy un experto en bases de datos, según lo que puedo pensar y leer, puedo manejarlo de varias maneras:
- Tenga un diseño de esquema RDBMS tradicional en MySQl / Postgresql con una única base de datos que hospede a varios inquilinos. Y agregue suficientes columnas "flotantes" en cada tabla para permitir cambios futuros a medida que agregue más clientes o cambios para un cliente existente. Esto podría tener la desventaja de propagar los cambios a la base de datos cada vez que se realiza un pequeño cambio en el esquema. Recuerdo haber leído que en el esquema de Postgresql las actualizaciones se pueden hacer en tiempo real sin bloqueo. Pero no estoy seguro, qué tan doloroso o práctico es en este caso de uso. Y también, como los cambios en el esquema también pueden introducir cambios SQL nuevos / menores.
- Tenga un RDBMS, pero diseñe el esquema de la base de datos de manera flexible: con un valor cercano al atributo de la entidad o simplemente como un almacén de valores clave. (Workday, FriendFeed por ejemplo)
- Tenga todo en la memoria como objetos y guárdelos periódicamente en archivos de registro (por ejemplo, edval, lmax)
- Elija una base de datos NoSQL como MongoDB o Redis. Pero según lo que puedo reunir, no son adecuados para este caso de uso y no son totalmente compatibles con ACID.
- Elija algunos NewSQL Dbs como VoltDb o JustoneDb (basados en la nube) que conservan el comportamiento compatible con SQL y ACID y son RDBMS de "nueva generación".
- Miré neo4j (graphdb), pero no estoy seguro de si eso encajará en este caso de uso
En mi caso de uso, más que la escalabilidad o la informática distribuida, estoy buscando una mejor manera de lograr "Flexibilidad en Schema + ACID + un rendimiento razonable". La mayoría de los artículos que pude encontrar en la red hablan de la flexibilidad en el esquema como una causa que conduce al rendimiento (en el caso de NoSQL DB) y la escalabilidad mientras se omite el lado ACID / Transacciones.
¿Es este un caso "cualquiera o" de transacciones de 'Flexibilidad de esquema vs ACID' o hay una mejor salida?