我应该为多客户端应用程序使用单个还是多个数据库设置?

Aro*_*eel 61 architecture database-design multi-tenant database-schema

我正在开发一个旨在简化公司工作流程和项目管理的PHP应用程序,让我们说像BasecampGoPlan这样的东西.

我不确定最佳方法是什么,数据库方面.我应该使用单个数据库并为每个表添加特定于客户端的列,还是应该为每个新客户端创建数据库?一个重要因素是自动化:我希望创建一个新客户端变得简单(并且可能会为自己注册).

我可以想到使用一个数据库的可能缺点:

  • 缺乏可扩展性
  • 安全问题(虽然首先不应该出现错误)

你对此有何看法?您有什么想法,上述公司最有可能选择哪种解决方案?

ids*_*tam 37

我通常会将ClientID添加到所有表中并使用一个数据库.但由于数据库通常难以扩展,我还可以在部分或全部客户端的不同数据库实例上运行.

这样,您可以在一个数据库中拥有大量小型客户端,而在不同服务器上拥有大型客户端.

但是,可维护性的关键因素是您在所有数据库中保持架构相同.如果不引入客户端特定模式,将会有足够的麻烦来管理版本控制.

  • 是的,分片的经典例子.您还可以将客户端移动到不同的数据库进行维护等.关键是构建移动数据的工具和API以查找帐户所在的服务器.一旦完成,天空就是限制. (4认同)

Phi*_*mid 34

收听Stackelflow播客,其中Joel和Jeff谈论同样的问题.Joel正在谈论他们提供托管版软件的经验.他指出,在整个数据库中添加客户端ID会使设计和代码复杂化(您确定不会忘记将其添加到某些WHERE子句中吗?)并使托管功能复杂化,例如客户端特定的备份.

这是在第20集或第21集(查看成绩单的详细信息).

  • 这是#19 @ [50:45] => https://stackoverflow.fogbugz.com/default.asp?W24218 (15认同)

Jon*_*ler 22

在我看来,这将取决于您可能的客户群.如果你可能遇到主要竞争对手都在使用你的系统的情况,那么你最好使用不同的数据库.它还取决于DBMS如何实现多个数据库.如果每个数据库都有一个单独的基础结构副本,则建议使用单个数据库(或更改DBMS).如果基础架构的单个副本可以提供多个数据库,那么我将使用单独的数据库.

想想数据库备份.客户A说"请寄给我一份我的数据".在单独的数据库设置中,比共享单个数据库要容易得多.考虑删除客户; 再次,使用单独的数据库更容易.

('基础设施'部分是粉饰的,因为不同的DBMS之间在构成'数据库'与'服务器实例'之间存在重大差异.例如. 添加:问题被标记为'mysql',所以也许这些想法不是完全相关.)

添加:还有一个问题 - 在单个数据库中有多个客户,每个SQL查询都需要确保选择正确客户的数据.这意味着SQL将更难以编写和读取,并且DBMS将不得不更加努力地处理数据,并且索引将更大,并且......我真的会使用单独的数据库客户有很多目的.

显然,StackOverflow(作为示例)每个用户没有单独的数据库; 我们都使用相同的数据库.但是,如果您为不同的公司运行会计系统,我认为(对于公司,可能不是合法人员)共享数据库是不可接受的.


fly*_*ire 13

  • 开发 对于快速开发,请按客户使用数据库.想想备份,恢复或删除客户数据是多么容易.或者衡量/监控/账单使用情况.您不需要自己编写代码,只需使用数据库原语.

  • 性能 为了提高性能,请为所有人使用数据库.考虑连接池,共享内存,缓存等.

  • 业务 如果您的业务计划是拥有大量小客户(想想hotmail),那么您应该使用单个数据库.并将所有管理任务(例如注册,删除,数据迁移等)完全自动化并在友好的界面中公开.如果您计划拥有数十个或几百个大客户,那么您可以在每个客户的一个数据库中工作,并拥有可由客户支持人员操作的系统管理脚本.


Mak*_*jer 12

以下截屏视频介绍了如何在salesforce.com上完成.他们使用一个带有特殊列OrgId的数据库来识别每个租户的数据.还有更多,所以你应该看看这个.我会采用他们的方法.

在MSDN上还有另外一篇关于它的文章.当您应该使用共享或隔离方法时,它会深入解释.请记住,为所有租户提供共享数据库会产生一些重要的安全隐患,如果他们共享相同的数据库对象,您可能需要使用[行级别安全] - 这取决于您使用的DBMS(我确信它可能在MS中使用) SQL Server和Oracle,也可能在IBM DB2中).您可以在mySQL中使用行级安全性等技巧来实现类似的结果(视图+触发器).


Mar*_*wis 10

对于多租户,性能通常会增加您在租户之间共享的资源,请参阅

http://en.wikipedia.org/wiki/Multitenancy

所以,如果可以,请使用单个数据库.我同意安全问题只会由于错误而发生,因为您可以在应用程序中实现所有访问控制.在某些数据库中,您仍然可以通过仔细使用视图来使用数据库访问控制(以便每个经过身份验证的用户获得不同的视图).

有一些方法可以提供可扩展性.例如,您可以创建一个具有扩展属性的表(由租户,基本记录和扩展属性ID键控).或者,您可以创建每个租户扩展表,以便每个租户都有自己的扩展架构.


da5*_*5id 5

要考虑的另一点是,您可能有法律义务将一个公司的数据与其他公司的数据分开。


小智 5

在设计多租户数据库时,通常有三个选项:

  1. 每个租户有一个数据库
  2. 每个租户都有一个架构
  3. 让所有租户共用同一张桌子

您选择的选项会影响可伸缩性,可扩展性和隔离性.这些含义已在不同的StackOverflow问题和数据库文章中得到广泛讨论.

在实践中,三种设计方案中的每一种 - 只要付出足够的努力 - 就可以解决围绕规模的问题,不同租户的数据以及隔离.决定取决于您正在构建的主要维度.摘要:

  • 如果您正在建设规模:让所有租户共享同一个表
  • 如果您要构建隔离:为每个租户创建一个数据库

例如,Google和Salesforce遵循第一种模式,让租户共享相同的表格.另一方面,Stackoverflow遵循第二种模式,并为每个租户保留一个数据库.第二种方法在受监管的行业中也更为常见,例如医疗保健.

决定归结为您正在优化数据库设计的主要维度.本文介绍如何设计SaaS数据库以进行权衡,并在PostgreSQL的上下文中提供摘要.