Aro*_*eel 61 architecture database-design multi-tenant database-schema
我正在开发一个旨在简化公司工作流程和项目管理的PHP应用程序,让我们说像Basecamp和GoPlan这样的东西.
我不确定最佳方法是什么,数据库方面.我应该使用单个数据库并为每个表添加特定于客户端的列,还是应该为每个新客户端创建数据库?一个重要因素是自动化:我希望创建一个新客户端变得简单(并且可能会为自己注册).
我可以想到使用一个数据库的可能缺点:
你对此有何看法?您有什么想法,上述公司最有可能选择哪种解决方案?
ids*_*tam 37
我通常会将ClientID添加到所有表中并使用一个数据库.但由于数据库通常难以扩展,我还可以在部分或全部客户端的不同数据库实例上运行.
这样,您可以在一个数据库中拥有大量小型客户端,而在不同服务器上拥有大型客户端.
但是,可维护性的关键因素是您在所有数据库中保持架构相同.如果不引入客户端特定模式,将会有足够的麻烦来管理版本控制.
Phi*_*mid 34
收听Stackelflow播客,其中Joel和Jeff谈论同样的问题.Joel正在谈论他们提供托管版软件的经验.他指出,在整个数据库中添加客户端ID会使设计和代码复杂化(您确定不会忘记将其添加到某些WHERE子句中吗?)并使托管功能复杂化,例如客户端特定的备份.
这是在第20集或第21集(查看成绩单的详细信息).
Jon*_*ler 22
在我看来,这将取决于您可能的客户群.如果你可能遇到主要竞争对手都在使用你的系统的情况,那么你最好使用不同的数据库.它还取决于DBMS如何实现多个数据库.如果每个数据库都有一个单独的基础结构副本,则建议使用单个数据库(或更改DBMS).如果基础架构的单个副本可以提供多个数据库,那么我将使用单独的数据库.
想想数据库备份.客户A说"请寄给我一份我的数据".在单独的数据库设置中,比共享单个数据库要容易得多.考虑删除客户; 再次,使用单独的数据库更容易.
('基础设施'部分是粉饰的,因为不同的DBMS之间在构成'数据库'与'服务器实例'之间存在重大差异.例如. 添加:问题被标记为'mysql',所以也许这些想法不是完全相关.)
添加:还有一个问题 - 在单个数据库中有多个客户,每个SQL查询都需要确保选择正确客户的数据.这意味着SQL将更难以编写和读取,并且DBMS将不得不更加努力地处理数据,并且索引将更大,并且......我真的会使用单独的数据库客户有很多目的.
显然,StackOverflow(作为示例)每个用户没有单独的数据库; 我们都使用相同的数据库.但是,如果您为不同的公司运行会计系统,我认为(对于公司,可能不是合法人员)共享数据库是不可接受的.
fly*_*ire 13
开发 对于快速开发,请按客户使用数据库.想想备份,恢复或删除客户数据是多么容易.或者衡量/监控/账单使用情况.您不需要自己编写代码,只需使用数据库原语.
性能 为了提高性能,请为所有人使用数据库.考虑连接池,共享内存,缓存等.
业务 如果您的业务计划是拥有大量小客户(想想hotmail),那么您应该使用单个数据库.并将所有管理任务(例如注册,删除,数据迁移等)完全自动化并在友好的界面中公开.如果您计划拥有数十个或几百个大客户,那么您可以在每个客户的一个数据库中工作,并拥有可由客户支持人员操作的系统管理脚本.
Mar*_*wis 10
对于多租户,性能通常会增加您在租户之间共享的资源,请参阅
http://en.wikipedia.org/wiki/Multitenancy
所以,如果可以,请使用单个数据库.我同意安全问题只会由于错误而发生,因为您可以在应用程序中实现所有访问控制.在某些数据库中,您仍然可以通过仔细使用视图来使用数据库访问控制(以便每个经过身份验证的用户获得不同的视图).
有一些方法可以提供可扩展性.例如,您可以创建一个具有扩展属性的表(由租户,基本记录和扩展属性ID键控).或者,您可以创建每个租户扩展表,以便每个租户都有自己的扩展架构.
小智 5
在设计多租户数据库时,通常有三个选项:
您选择的选项会影响可伸缩性,可扩展性和隔离性.这些含义已在不同的StackOverflow问题和数据库文章中得到广泛讨论.
在实践中,三种设计方案中的每一种 - 只要付出足够的努力 - 就可以解决围绕规模的问题,不同租户的数据以及隔离.决定取决于您正在构建的主要维度.摘要:
例如,Google和Salesforce遵循第一种模式,让租户共享相同的表格.另一方面,Stackoverflow遵循第二种模式,并为每个租户保留一个数据库.第二种方法在受监管的行业中也更为常见,例如医疗保健.
决定归结为您正在优化数据库设计的主要维度.本文介绍如何设计SaaS数据库以进行权衡,并在PostgreSQL的上下文中提供摘要.