【问题标题】:One or many databases for application for many clients in PHP一个或多个数据库,用于 PHP 中的多个客户端的应用程序
【发布时间】:2011-05-19 11:07:38
【问题描述】:

我正在用 ZF 编写一个 PHP 应用程序。客户将使用它向最终客户销售他们的产品。客户将在我的服务器上托管他们的应用程序,或者他们可以使用自己的。他们中的大多数会在我的服务器上托管这个应用程序。

我可以一次为所有客户设计一个数据库,因此每个客户都将使用相同的数据库,但当然产品等将分配给特定客户。微不足道。

我可以为每个客户使用单独的数据库,这样数据库结构会更简单。然后我可能会使用单独的子域,甚至可能使用文件位置,但这只是一个细节。

哪种解决方案的性能更好,差异会有多大?你会选择哪一个?

【问题讨论】:

  • 我没有详细解释你应该做什么,但你不应该做的是创建多个本质上是重复的数据库。原因是推出更新/错误修复变得非常困难,造成碎片和支持遗留问题。这些都是阻碍未来高效开发的开销。
  • @约翰·斯图尔特。但它们基本上都是应用程序的唯一实例,因此它们应该有自己的数据库。如果您有 10 个 Magento 电子商店,它们都将拥有自己的数据库。您不打算将它们全部放在一个数据库中吗?一个客户端泄露了数据库服务器的登录信息,所有客户端的数据都会被泄露。
  • +1 用于引发意见之火。 :) 这个问题很重要。要想找到灵丹妙药的答案取决于太多的小问题。

标签: php performance zend-framework database-design


【解决方案1】:

我会为每个客户使用一个单独的数据库。它使备份和扩展更容易。如果您遇到需要对架构进行一些自定义更改的大客户,您可以轻松完成。

如果一位客户需要您恢复他们的数据,使用单个数据库是微不足道的。在共享数据库上,要困难得多。

而且,如果大客户获得大量流量,您可以轻松地将它们放在另一台服务器上,只需进行最少的更改。

如果一个网站遭到入侵,您不会将所有人的所有数据都集中在一个地方,那么损失只会减轻到被黑客入侵的网站。

如果可能的话,我绝对建议每位客户使用 1 db。

【讨论】:

  • 如果你有 1000000 个客户,你会怎么做? 1000000 个数据库和 1000000 x N 个表。它会变得复杂和难以管理
  • 当您有 1,000,000 个客户向 SAP 销售时
  • @Ish Kumar:换句话说,您是在建议 1000000 个网店都使用同一个数据库?你疯了吗?
  • +1 我不明白为什么这个答案被多次否决。
【解决方案2】:

就个人而言,我会使用多个数据库 - 即每个客户都有一个数据库。

据我了解,您的所有客户都将只使用您的应用程序的一个实例,因此这些实例应该有自己的数据库。

如果您使用单个数据库,则会产生巨大的潜在安全风险。一个客户端泄露到数据库服务器的登录详细信息会自动泄露所有客户端的数据。

此外,一个安全漏洞(SQL 注入攻击)可能会破坏所有客户端的数据(对于多个数据库,您仍有时间修复安全漏洞并在所有其他站点受到攻击之前发布补丁)。

您不想拥有一支由 1000000 名疯狂客户组成的军队,而不仅仅是 1 个愤怒的客户。

多个数据库还为您提供更大的负载平衡可能性(您可以让数据库分布在更多服务器上)。

【讨论】:

  • +1 同意。单个实例的安全隐患怎么强调都不为过。
【解决方案3】:

在性能方面,您基本上是从“分片”方法开始的。因此,分片性能策略将是小菜一碟。

缺点是您可能会争辩说您在复制过程中损失了一些(未定义的)开销。

一个陷阱是您可能不会很快注意到主要组件的性能问题。这是因为它们非常分散,因此它们可能在您的雷达上不可见。负载测试是领先的方法。

【讨论】:

  • 绝对+1 螺母螺栓:只需加载测试看看!
【解决方案4】:

在某种程度上,这是个人意见的问题。两种模式各有利弊。

就个人而言,由于“他们可以使用自己的”评论,我会为每个客户使用单独的数据库。这给了你

  • 必要时移动客户数据的能力。例如,根据负载等因素将单个客户转移到不同的服务器/设置上。
  • 如果出现问题,您只会影响一位客户,而不是所有人。
  • 如有必要,您可以将数据库负载分散到多个数据库服务器。
  • 如果客户向您提出特定要求,您可以更轻松地满足这一要求,而不会影响其他客户。

从性能的角度来看,老实说,我认为这两种模型都没有真正的性能提升。也就是说,这当然取决于您的数据库的结构及其运行的硬件。

【讨论】:

  • 起初,我打算(现在仍然)拥有一个大数据库。当我把图表交给我的上司时,他看着它说:“嗯……我想,我们将为此拥有多个数据库”。在那之后,我开始想知道这个想法如何导致更清晰的代码和更好的客户端分离。毕竟,一个愚蠢的DELETE FROM 会导致只有一个客户想要杀我,而不是所有客户;)
  • 有很多方法可以防止DELETE FROM,例如日常备份、使用像 cakephp、zend 等健壮的框架
【解决方案5】:

如果您的需求可以通过一个数据库来满足,请不要选择多数据库解决方案。因为多个数据库会导致从长远来看会带来很大的负担,并且随着您的成长,您的系统将变得非常复杂且难以管理。

使用适当的关系可以走很长的路

一个客户端模型可以有很多产品 // 为什么有多个数据库?

性能可以通过任何一种方式实现,仅使用多个数据库将不会在该方向上受益

【讨论】:

  • 但他说的是让所有客户都使用同一个数据库。想象一下使用相同数据库的 1000 个网店。那只是一团糟。每个商店都应该有自己的数据库。当然,它们应该具有相同的模式。您也不打算在一个 wordpress 数据库中托管 1000 个博客。
  • @Richard,关键是它很快就会变得无法管理,并且在 clients 表中拥有 1000 条记录和在 products 表中拥有 1000*100 条记录也可以。他没有充分的理由去多个数据库
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多