Database design 我应该为多客户端应用程序使用单个或多个数据库设置吗?

Database design 我应该为多客户端应用程序使用单个或多个数据库设置吗?,database-design,architecture,database-schema,multi-tenant,Database Design,Architecture,Database Schema,Multi Tenant,我正在开发一个PHP应用程序,旨在简化公司的工作流程和项目管理,比如说和 就数据库而言,我不确定什么是最好的方法。我应该使用单个数据库并向每个表中添加特定于客户机的列,还是应该为每个新客户机创建一个数据库?一个重要的因素是自动化:我希望创建一个新客户非常简单(并且可能为您自己的注册打开了可能性) 可能的缺点我可以考虑使用一个数据库: 缺乏可扩展性 安全问题(尽管bug本来就不应该存在) 你对此有何看法?您是否知道上述公司最有可能选择什么解决方案 对于多租户,性能通常会增加您在租户之间共享的资

我正在开发一个PHP应用程序,旨在简化公司的工作流程和项目管理,比如说和

就数据库而言,我不确定什么是最好的方法。我应该使用单个数据库并向每个表中添加特定于客户机的列,还是应该为每个新客户机创建一个数据库?一个重要的因素是自动化:我希望创建一个新客户非常简单(并且可能为您自己的注册打开了可能性)

可能的缺点我可以考虑使用一个数据库:

  • 缺乏可扩展性
  • 安全问题(尽管bug本来就不应该存在)

你对此有何看法?您是否知道上述公司最有可能选择什么解决方案

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

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


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

我通常将ClientID添加到所有表中,并使用一个数据库。 但是由于数据库通常很难扩展,因此我还可以为一些或所有客户机在不同的数据库实例上运行

这样,您就可以在一个数据库中拥有一组小客户机,而在不同的服务器上拥有一组大客户机


不过,维护性的一个关键因素是在所有数据库中保持模式相同。在不引入特定于客户端的模式的情况下管理版本控制将是一件非常头痛的事情。

在我看来,这将取决于您可能的客户群。如果您可以进入一个主要竞争对手都在使用您的系统的情况,那么您最好使用单独的数据库。它还取决于DBMS如何实现多个数据库。如果每个数据库都有一个独立的基础结构副本,那么这就意味着只有一个数据库(或DBMS的更改)。如果基础设施的一个副本可以为多个数据库提供服务,那么我会选择单独的数据库

想想数据库备份。客户A说“请给我发送一份我的数据副本”。在单独的数据库设置中比共享单个数据库要容易得多。考虑删除一个客户;同样,使用单独的数据库要容易得多

(例如,“基础设施”部分是含沙射影的,因为不同的DBMS之间在“数据库”和“服务器实例”的构成方面存在重大差异。补充:问题被标记为“mysql”,因此这些想法可能并不完全相关。)

加: 还有一个问题-对于单个数据库中的多个客户,每个SQL查询都需要确保为正确的客户选择数据。这意味着SQL将更难编写和读取,DBMS将不得不更加努力地处理数据,索引将更大,而且。。。我真的会为每个客户提供一个单独的数据库,用于多种用途


显然,StackOverflow(作为一个例子)并没有为每个用户提供单独的数据库;我们都使用相同的数据库。但是,如果你为不同的公司运行会计系统,我认为(公司,可能不是法人)共享数据库是不可接受的。

听Stackoverflow播客,Joel和Jeff在播客中谈到了同样的问题。Joel正在谈论他们提供托管版软件的经验。他指出,在数据库中添加客户机ID会使设计和代码复杂化(您确定没有意外忘记将其添加到WHERE子句中吗?),并使托管功能复杂化,例如特定于客户机的备份


是在第20集或第21集(检查详细记录)。

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

< P>每个客户的数据库通常没有很好的扩展。MySQL(可能还有其他数据库)为每个表保留打开的资源,这不适合一个实例上的10k+表,这在大规模多租户情况下会发生

当然,如果您在达到此级别之前遇到了导致其他问题的其他问题,则可能与此无关

此外,随着应用程序越来越大,“分片”多租户应用程序最终可能是正确的做法

然而,分片并不意味着每个租户一个数据库(或实例),而是每个分片或分片集一个数据库(或实例),每个分片或分片集可能有多个租户。您需要为自己找到合适的调优参数,可能是在生产中(因此从一开始就需要非常可调)


欧元-我不能保证。

您可以从单个数据库开始,随着应用程序的增长对其进行分区。如果您这样做,我建议您做几件事:

1) 以易于分区的方式设计数据库。例如,如果客户要共享数据,请确保在每个数据库中轻松复制数据

2) 当您只有一个数据库时,请确保它正在备份到另一个物理服务器。在发生故障转移时,您可以将通信恢复到另一台服务器,并且数据仍然保持完整。

  • 发展 为了快速开发,请为每个客户使用一个数据库。想想h