我正在考虑将基于 VB 的本地(本地安装)应用程序(发票+库存)重写为面向小型企业客户的基于 Web 的 Clojure 应用程序。我打算将其作为 SaaS 应用程序提供给类似行业的客户。
我正在查看数据库选项:我的选择是 RDBMS:Postgresql/MySQL。我可能会在第一年扩大到 400 个用户,通常每个用户每天有 20-40 次页面浏览量 - 主要用于交易而不是静态浏览量。每个视图都将涉及获取数据和更新数据。ACID 合规性是必要的(或者我认为是这样)。所以交易量并不大。
根据我的偏好选择其中任何一个是不费吹灰之力的,但是对于这一要求,我认为这是 SaaS 应用程序的典型要求:随着我添加更多客户/用户以及每个客户的不断变化的业务需求(我将只提供一些有限的灵活性)。由于我不是数据库专家,根据我能想到和读过的内容,我可以通过多种方式处理它:
- 在 MySQl/Postgresql 中使用传统的 RDBMS 模式设计,单个数据库托管多个租户。并在每个表中添加足够的“自由浮动”列,以便在我添加更多客户或对现有客户进行更改时进行更改。每次对 Schema 进行小的更改时,这可能具有将更改传播到 DB 的缺点。我记得读过 Postgresql 架构更新可以实时完成而无需锁定。但不确定在这个用例中它有多痛苦或有多实用。而且,由于架构更改也可能引入新的/次要的 SQL 更改。
- 拥有 RDBMS,但以灵活的方式设计数据库模式:接近实体属性值或仅作为键值存储。(例如工作日,FriendFeed)
- 将整个事物作为对象保存在内存中,并定期将它们存储在日志文件中。(例如,edval、lmax)
- 选择像 MongoDB 或 Redis 这样的 NoSQL 数据库。但根据我收集到的信息,它们不适合这个用例,也不完全符合 ACID。
- 选择一些 NewSQL Db,例如 VoltDb 或 JustoneDb(基于云),它们保留了 SQL 和 ACID 兼容行为并且是“新一代”RDBMS。
- 我查看了 neo4j(graphdb),但不确定它是否适合这个用例
在我的用例中,不仅仅是可扩展性或分布式计算,我正在寻找一种更好的方法来实现“架构中的灵活性 + ACID + 一些合理的性能”。我可以在网上找到的大多数文章都将架构的灵活性作为导致性能(在 NoSQL DB 的情况下)和可伸缩性的原因,同时忽略了 ACID/Transactions 方面。
这是“架构灵活性与 ACID”事务的“非此即彼”的情况,还是有更好的出路?