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

Posted

技术标签:

【中文标题】我应该为多客户端应用程序使用单个还是多个数据库设置? [关闭]【英文标题】:Should I use a single or multiple database setup for a multi-client application? [closed] 【发布时间】:2010-09-20 07:34:09 【问题描述】:

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

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

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

缺乏可扩展性 安全问题(虽然错误一开始就不应该存在

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

【问题讨论】:

我也有同样的问题。以下是我得到的一些答案。 ***.com/questions/69128/…查看LinkedIn架构的幻灯片 是否也考虑过速度?具有 100 万条记录的数据库搜索的性能将明显优于具有 10 亿条记录的数据库搜索。我很好奇你在这方面的表现如何。 What are the advantages of using a single database for EACH client?的可能重复 【参考方案1】:

在设计多租户数据库时,您通常有三种选择:

    每个租户拥有一个数据库 每个租户有一个架构 让所有租户共享同一张桌子

您选择的选项会影响可伸缩性、可扩展性和隔离性。这些影响已在不同的*** questions 和数据库文章中得到广泛讨论。

在实践中,三个设计选项中的每一个都可以通过足够的努力来解决有关规模、跨租户变化的数据和隔离的问题。该决定取决于您要构建的主要维度。总结:

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

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

决定取决于您优化数据库设计的主要维度。 This article on designing your SaaS database for scale 讨论了权衡并提供了 PostgreSQL 上下文中的摘要。

【讨论】:

【参考方案2】:

开发 为了快速开发,请为每个客户使用一个数据库。想想备份、恢复或删除客户数据是多么容易。或测量/监控/账单使用情况。您无需自己编写代码,只需使用您的数据库原语即可。

性能 为了提高性能,请为所有人使用数据库。想想连接池、共享内存、缓存等。

商业 如果您的业务计划是拥有大量小客户(想想 hotmail),您可能应该在单个数据库上工作。并让所有管理任务(如注册、删除、数据迁移等)完全自动化并显示在友好的界面中。如果您计划拥有数十个或多达数百个大客户,那么您可以在每个客户一个数据库中工作,并拥有可由您的客户支持人员操作的系统管理脚本。

【讨论】:

【参考方案3】:

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

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

2) 当您只有一个数据库时,请确保将其备份到另一台物理服务器。如果发生故障转移,您可以将流量恢复到这台其他服务器,而您的数据仍然完好无损。

【讨论】:

1,“如果客户要共享数据”是什么意思?我面临这样一种情况,即必须在客户之间共享数据才能由管理实体访问,那么您将如何设计它?【参考方案4】:

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

当然,如果您在达到此级别之前有其他问题导致其他问题,这可能无关紧要。

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

但是,分片并不意味着每个租户一个数据库(或实例),而是每个分片或一组分片一个,每个分片可能有多个租户。您将需要为自己找到正确的调整参数,可能在生产中(因此它可能需要从一开始就进行非常好的调整)

€ 我不能保证。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

(例如,“基础设施”部分是粉饰的,因为不同的 DBMS 在“数据库”和“服务器实例”的构成方面存在重大差异。添加:问题是标记为“mysql”,所以这些想法可能并不完全相关。)

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

显然,***(例如)没有每个用户单独的数据库;我们都使用相同的数据库。但是,如果您为不同的公司运行会计系统,我认为共享数据库是不可接受的(对公司而言,可能对法律人员而言也是如此)。

【讨论】:

【参考方案7】:

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

它出现在第 20 或第 21 集(详情请查看成绩单)。

【讨论】:

这是第 19 集 @ [50:45] => ***.fogbugz.com/default.asp?W24218【参考方案8】:

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

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

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

【讨论】:

是的,分片的经典例子。您还可以将客户端移动到不同的数据库进行维护等。关键是构建移动数据的工具和用于查找帐户所在服务器的 API。一旦完成,天空就是极限。【参考方案9】:

对于多租户,性能通常会提高您设法在租户之间共享的资源越多,请参阅

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

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

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

【讨论】:

以上是关于我应该为多客户端应用程序使用单个还是多个数据库设置? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

有多个媒体查询还是单个媒体查询更好

WCF:单个服务的多个绑定配置

将多个标准输出重定向到单个文件

解析并对其进行一些更改后,为多部分电子邮件设置的内容类型应该是啥?

是否可以在单个应用程序中配置多个解析客户端?

MongoDB 结构:单个集合与多个较小的集合