Estou olhando para reescrever um aplicativo baseado no local do VB (instalado localmente) (faturamento + inventário) como um aplicativo Clojure baseado na Web para clientes de pequenas empresas. Pretendo que isso seja oferecido como um aplicativo SaaS para clientes de comércio semelhante.
Eu estava olhando para as opções de banco de dados: Minha escolha foi um RDBMS: Postgresql / MySQL. Posso escalar até 400 usuários no primeiro ano, normalmente com 20 a 40 visualizações de página / por dia por usuário - principalmente para transações que não são estáticas. Cada visualização envolve buscar dados e atualizar dados. A conformidade com o ACID é necessária (ou assim eu acho). Portanto, o volume de transações não é enorme.
Teria sido um acéfalo escolher um destes com base na minha preferência, mas para este requisito, que acredito ser típico de um aplicativo SaaS: o esquema mudará à medida que adiciono mais clientes / usuários e para cada cliente. alteração dos requisitos de negócios (oferecerei flexibilidade limitada apenas para começar). Como não sou especialista em DB, com base no que posso pensar e ter lido, posso lidar com isso de várias maneiras:
- Tenha um design de esquema RDBMS tradicional no MySQl / Postgresql com um único banco de dados hospedando vários inquilinos. E adicione colunas "flutuantes" suficientes em cada tabela para permitir alterações futuras à medida que adiciono mais clientes ou alterações a um cliente existente. Isso pode ter uma desvantagem em propagar as alterações no banco de dados toda vez que uma pequena alteração é feita no esquema. Lembro-me de ler que no Postgresql as atualizações de esquema podem ser feitas em tempo real sem travar. Mas não tenho certeza, quão doloroso ou prático é neste caso de uso. E também, conforme as mudanças no esquema também podem introduzir novas / pequenas alterações no SQL.
- Tenha um RDBMS, mas projete o esquema do banco de dados de maneira flexível: com um valor próximo ao atributo da entidade ou apenas como um armazenamento de valor-chave. (Dia útil, FriendFeed por exemplo)
- Tenha tudo na memória como objetos e armazene-os em arquivos de log periodicamente (por exemplo, edval, lmax)
- Escolha um banco de dados NoSQL como MongoDB ou Redis. Mas, com base no que posso reunir, eles não são adequados para este caso de uso e não são totalmente compatíveis com ACID.
- Escolha alguns Dbs NewSQL como o VoltDb ou o JustoneDb (baseado em nuvem) que mantêm o comportamento compatível com SQL e ACID e são RDBMS de "nova geração".
- Eu olhei para neo4j (graphdb), mas não tenho certeza se isso se encaixará nesse caso de uso
No meu caso de uso, mais do que escalabilidade ou computação distribuída, estou procurando uma maneira melhor de obter "Flexibilidade no esquema + ACID + desempenho razoável". A maioria dos artigos que pude encontrar na rede fala da flexibilidade no esquema como causa que leva ao desempenho (no caso dos bancos de dados NoSQL) e à escalabilidade, deixando de fora o lado ACID / Transações.
Esse é um caso "de uma ou" operação de 'Flexibilidade do esquema versus ACID' ou Existe uma saída melhor?