收听Stackoverflow播客,在那里Joel和Jeff谈论了同样的问题。 Joel谈到他们提供托管软件版本的经验。他指出,将客户端ID添加到数据库中会使设计和代码变得复杂(您确定没有意外忘记将其添加到某个WHERE子句中吗?),并且会增加托管功能的复杂性,例如客户特定的备份。
这是第20或21集(请查看交录以获取详细信息)。
开发 为了快速开发,请为每个客户使用一个数据库。想象一下备份、恢复或删除客户数据有多容易。或者测量/监控/计费使用情况。您不需要编写代码来完成它,只需使用数据库基元。
性能 为了提高性能,请为所有用户使用一个数据库。考虑连接池、共享内存、缓存等问题。
业务 如果你的业务计划是拥有大量小客户(比如 hotmail),那么你应该在单个数据库上工作。并且将所有管理任务(例如注册、删除、数据迁移等)完全自动化,并以友好的界面公开。如果你计划拥有几十个到几百个大客户,那么你可以为每个客户使用一个数据库,并准备系统管理脚本,供你的客户支持人员操作。
对于多租户,通常共享资源的能力越强,性能就越好,详见http://en.wikipedia.org/wiki/Multitenancy
所以如果可以的话,请使用单个数据库。我同意,安全问题只会由于漏洞引起,因为您可以在应用程序中实现所有访问控制。在某些数据库中,您仍然可以通过谨慎使用视图来使用数据库访问控制(以便每个经过身份验证的用户获得不同的视图)。
还有提供可扩展性的方法。例如,您可以创建一个带有扩展属性的单个表(由租户、基本记录和扩展属性ID进行键入)。或者,您可以创建每个租户的扩展表,以便每个租户都有自己的扩展架构。
您可以从单个数据库开始,随着应用程序的增长将其分区。如果这样做,我建议您注意以下几点:
1)以易于分区的方式设计数据库。例如,如果客户要共享数据,请确保该数据在每个数据库中都可以轻松复制。
2)当您只有一个数据库时,请确保它正在备份到另一台物理服务器。在故障转移的情况下,您可以将流量恢复到此其他服务器,并仍然保持数据完整。