PHP Web应用程序:MySQL数据库设计最佳实践问题

18
我目前正在与同事辩论有关创建PHP Web应用程序的数据库设计的最佳实践。该应用程序是为企业设计的,每个注册的公司将有多个用户使用该应用程序。
我的设计方法是为每个注册的公司创建一个新数据库。这样一切都是沙盒式、模块化和小型化的。我的同事的理念是将所有人放入一个数据库中。他的论点是,如果我们有1000多家公司注册,我们就会有1000多个数据库要处理。更不用说处理商业智能时所面临的混乱。
为了举例说明,假设该应用程序是一个订单输入系统。分开的数据库可以使表格大小保持可管理性,即使每个公司每天都进行100多个订单。在单一的数据库应用程序中,表格可能会变得非常大。
有最佳实践吗?我尝试在网上搜索,但并没有取得太多成功。链接、白皮书和演示文稿都可以提供。
提前致谢,
The1Rob
8个回答

24
我和WordPress托管服务wordpress.com的数据库架构师交谈过。他说他们一开始只有一个数据库,将所有客户一起托管。毕竟,单个博客网站的内容并不多。因此,使用单个数据库更易于管理。
直到他们获得了数千名客户,他们才意识到需要进行扩展,运行多台物理服务器,并在每台服务器上托管客户的子集。添加服务器后,将个别客户迁移到新服务器很容易,但是将属于单个客户博客的单个数据库中的数据分离则更加困难。
随着客户的来去以及某些客户的博客活动量高而其他博客很少更新,对多个服务器进行重新平衡的维护工作变得更加复杂。监视每个个别数据库的大小和活动量也更容易。
同样,与包含数千兆字节数据的单个数据库相比,备份或恢复单个几兆字节的数据库备份和恢复更为重要。考虑:客户打电话说由于某些错误的数据输入导致数据丢失,请您从昨天的备份中恢复数据?如果所有客户共享一个数据库,您如何恢复单个客户的数据呢?
最终,他们决定将每个客户拆分成一个单独的数据库,尽管这很难管理,但是他们认为这样可以提供更大的灵活性,并重新架构了他们的托管服务。
因此,从数据建模的角度来看,将所有内容放在单个数据库中似乎是正确的做法,但是一旦数据量超过一定的阈值,某些数据库管理任务会变得更容易。

数据分区(通过分区表规则)可能也是另一个选项,但有时更加复杂。而且,对于那些反对使用多个数据库的人,你应该知道这并不会影响报告,对吧?可以轻松地在数据库之间联合/连接适当的表,甚至创建跨数据库视图,编译出所有你所需的报告数据。 - Kevin Peno

2
我不会为每个公司创建新的数据库。如果您想要模块化设计,可以使用表格和正确连接的主键和外键来实现。这就是我学习到的数据库规范化的地方,我相信它会对您有所帮助。
这是我会使用的方法。SQL文章

1

我必须同意你的同事。关系型数据库被设计用来处理大量数据,而你所谈论的数字(1000多家公司,每家公司多个用户,每天100多个订单)都在预期范围内。分离数据库意味着:

  • 每个脚本中有多个数据库连接(会占用内存和速度)
  • 维护更加困难(DB系统通常不提供针对数据库组的操作工具),因此模式更改、备份和类似任务将更加困难
  • 更难以查询来自多个公司的数据

如果你的网站变得非常庞大,最终可能需要将数据分布在多个服务器上。等到那时再处理。出于性能原因而从一开始就这样做听起来像是过早优化。


0

我个人没有处理过这种情况,但我认为如果你想做商业智能,你应该将数据聚合到一个离线数据库中,然后可以对其进行任何分析。

此外,将它们保留在单独的数据库中可以更容易地在服务器之间进行分区(如果你有1000多个客户,则可能需要这样做),而不必使用混乱的复制技术。


0

我之前也有类似的问题,最终得出的结论是单一数据库更易于管理。现在我们有多个数据库(大约10个),即使只是升级代码,管理已经变得非常麻烦了。我们必须迁移每一个数据库。

好处是数据被清晰地隔离。由于我们数据的敏感性,这是一件好事,但这确实使得跟进变得更加困难。


0
独立数据库方法在以下方面具有非常大的优势:
+ 您可以将其分解为较小的组,这种架构更易于扩展。
+ 您可以轻松地创建独立服务器。

0

这取决于您的模式更改的可能性。如果它们需要更改,您能否安全地对1000个不同的数据库进行更改?如果您的设计存在可扩展性问题,您将如何为1000个数据库解决此问题?


0

我们经营着一个拥有大量客户的SaaS(软件即服务)业务,并决定将所有客户保存在同一个数据库中。管理成千上万个单独的数据库是一场运营噩梦。

您必须非常勤奋地创建数据模型和访问它们的业务对象/报告查询。您可能要考虑的一种方法是在每个表中携带公司ID,并确保每个WHERE子句都包含当前登录用户的公司ID。如果使用数据访问层,可以在那里强制执行该条件。

随着您的业务规模扩大,您仍然可以通过将公司组放置在每个物理服务器上来进行垂直分区,例如,在服务器A上放置前100家公司,在服务器B上放置下一个100家公司。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接