我正在开发基于Web的组织工具。我并不瞄准与美妙的Basecamp相同的市场,但让我们说用户和数据交互的方式看起来一样。
我将不得不处理用户自定义,文件上传和图形调整。每个帐户都有一个论坛。我想提供一种方法来轻松备份每个帐户。
我一直在考虑如何创建一个合理的架构,并且已经过训练,可以在一个(如果需要的话,还需要分发)MySQL数据库中使用精美的规范化数据。最近我一直想知道: 是否可以考虑使用一个SQLITE DB存储每个帐户的数据,并仅使用MYSQL进行常规网站管理?
专家:
缺点:
更多的缺点是专业人士,它仍然让我怀疑(zepplin风格)。
你说什么?
答案 0 :(得分:8)
基本上你的问题是:对于多租户SaaS应用程序,上述哪一种更好?
一千个小的sqlite数据库可能会吸引人,但可能无法扩展。
我将依次说明你的观点:
如果在备份期间发生更新会怎样?您的备份需要多长时间(例如,每个帐户有一百万个帖子)?您的备份是在备份期间锁定数据库,还是备份数据的一致视图,或者两者都没有?在每种情况下,更新期间进行的数据库备份是否正确恢复?你测试过这些东西吗?
我认为备份一个sqlite数据库并不像你想象的那么容易,因为并发访问问题。
你暗示MySQL连接时间“昂贵”可能是错误的。你有硬数据吗?通过LAN连接到服务器实际上不需要很长时间。
如果您需要更改这1,000个小型数据库的架构,您是否考虑过如何进行迁移?它会对服务产生什么影响?
我现在要添加一些自己的:
由于sqlite不是基于网络的系统,因此您不能只添加更多Web服务器。您需要在多个服务器上对用户进行分区,并确保它们只能访问自己的“主”服务器(这会引入一些问题但可能是可行的),或者找出在服务器之间共享sqlite数据库的方法,它不会很漂亮,并且可能会消除它曾经拥有的任何感知性能优势(例如)MySQL。
我认为使用一千个小型sqlite数据库扩展系统将无法扩展。特别是,您可能最终会发现,而不是1000个小的,最终会有995个微小的,以及5个相当大的。
使用专用的MySQL服务器可以执行集中备份和迁移。它将使您能够使用该框中的资源(即RAM)来缓存数据库中最常用的部分,无论它们恰好在哪个帐户中。
用于缓存大型MySQL数据库(例如Innodb缓冲池)的RAM可以在请求之间重用,并在其中的所有数据(例如表,行,列)之间共享。每次需要时,sqlite数据库都会从光盘中读取数据,但在单个会话中除外。
我的建议:
答案 1 :(得分:6)
我给了它更多的想法,我看到了更多的问题:
这是个坏主意。
无论如何,在SO上写这篇文章迫使我认真考虑它。在开始之前最好有一个清醒的头脑。
如果有一天,有人像我一样愚蠢,希望他能打到页面,这样可以帮助他重新考虑
喜欢这个网站(即使它是ASP :-p):最快捷的方式来帮助自己,同时还能帮助他人。
答案 2 :(得分:4)
SQLite并不是最具扩展性的解决方案。你有理由使用一个漂亮的,规范化的数据库,可以根据需要进行分发。它具有可扩展性,并且更易于维护。
我会坚持使用单个MySQL数据库,因为您已经熟悉该架构,而且它很可能是该工作的最佳解决方案。
答案 3 :(得分:3)
如果我从头开始构建系统,我会使用mysql。由于我使用的是预先构建的系统,并且每个用户都有自己的孤岛,因此sqlite工作正常。
答案 4 :(得分:0)
你可以看看CouchDB的大规模并发性。