为什么要使用两个(或更多)数据库而不是一个?

时间:2010-06-28 23:41:52

标签: php database scripting

为多个数据库连接设置了许多数据库库 - 但我从未真正知道在运行期间需要连接到两个数据库的脚本应用程序。 (编译后,守护程序运行语言是另一回事)。

我理解拥有数据库从属设备以便您可以分散负载 - 但通常在启动时只选择其中一个来处理脚本需求。

那么为什么PHP或Ruby应用程序需要连接到多个数据库? 或者更确切地说,为什么要在几个数据库之间分配数据?

我唯一能想到的就是从一个缓慢发展的系统中设计糟糕的设计,这个系统是从多个独立的部分开始的。

8 个答案:

答案 0 :(得分:3)

您是在谈论不同的物理数据库服务器还是“架构”意义上的不同数据库?

关于物理服务器,如果您正在使用MySQL复制,您可能会写入主服务器并始终从从服务器读取。这有助于在每个数据库之间分配负载。

答案 1 :(得分:2)

简单的答案是“可扩展性”。

许多数据库产品中的复制和群集的现成可用性使得多个数据库使用一定的“必须可行”。任何体面的ORM都应该知道如何根据需要连接到多个数据库。

但是即使主应用程序没有连接到多个应用程序,通常也会有其他需求。报告生成(无论是脚本还是临时)通常涉及长时间运行的查询。这些最好在专用(和配置)这些查询的数据库复制器上运行,这样它们就不会中断主应用程序。

另一个好用途是一种脚本处理。许多应用程序将有一个需要翻阅大部分数据库的常规流程。 Whislt更新显然必须转到master,大读取查询可以运行一个复制器。

当然,显而易见的需求是简单的性能。我监督了一个webapp和数据库,它是从一个拥有3Gb的32位双核机器上的一个MySQL数据库中幸存下来,到需要两个带8Gb的8核64位服务器。到达此阶段后,依赖数据库处理程序将流量定向到两个服务器。我们有一个大约50分钟的窗口,它可以在一个数据库中存活。

答案 2 :(得分:2)

通常情况下,您需要的某些数据存储在错误的数据库中。有时它是PeopleSoft(Oracle)数据库中的人员记录。也许是Informix上的企业CRM数据。或者某些部门数据库存储在MS SQL Server中。无论是什么,它都在不同的数据库中,但您仍然需要访问(希望只读)。

除非您的主数据库是基于魔法的,否则它无法为每个其他数据库提供远程表访问。 (大多数只提供对相同类型的其他数据库的远程访问,例如:MySQL-> MySQL。)当这种情况太频繁发生时,除了拥有多个数据库连接之外别无其他选择,并且很高兴你的框架支持它。

答案 3 :(得分:1)

我有一个连接两个数据库的站点。一个支持网站内容(CMS DB),另一个驱动网站内运行的Web应用程序(大量非CMS数据)事实上,后者使用复制。

我觉得这不好设计。如果一组数据与另一组数据没有关系,那么即使从纯粹的组织角度来看它也可以将它放在一个单独的数据库中。否则,人们只需将所有表放在一个数据库中。

答案 4 :(得分:1)

我有一个连接到多个数据库的Ruby应用程序。一个数据库包含用户登录凭据(在其他几个项目之间共享)。另一个数据库包含我的应用程序跟踪和比较的归档数据(只有我的应用程序访问)。另一个数据库包含有关我的应用程序用于生成新数据的物理机器资源的数据(这些资源由几个不同的应用程序使用)。通过将数据拆分为多个数据库,不同的应用程序只访问他们需要访问的数据。

答案 5 :(得分:1)

好吧,从一个人那里读书并写一个是另一个很常见的用例。编写从一个连接读取的数据访问层(从从站读取)并写入另一个连接(主站)是一件容易而有趣的事情。单个脚本可能在写入之前进行多次读取 - 例如,可能需要进行一些查找以进行验证。

脚本语言也经常用于集成。您可能有两个现成的代码库,这两个代码库都希望维护自己的数据库。您的集成代码可能希望与它们进行对话。

通常,您通常可以设计不使用多个连接,但一般来说,我没有看到使用多个数据库连接的根本错误。

答案 6 :(得分:0)

为了增加安全性,我总是为每个数据库创建两个帐户:一个只读帐户(适用于SELECT)和一个读写帐户(用于SELECT,UPDATE,INSERT,DELETE以及我可能需要的任何其他内容)。在某些页面上,我可能需要使用这两个帐户,因此我将仅为一个数据库使用两个连接。

答案 7 :(得分:0)

拥有多个数据库的其他原因。我们有一个人人都可以访问的应用程序。我们还有客户端数据库,从客户端到客户端非常不同。如果client_specific数据被分离到他们自己的数据库,则更容易维护所有客户端使用的应用程序(并由不同的团队维护)。当客户端成为大型企业客户端而不是在具有许多其他客户端的服务器上运行的较小的客户端时,也更容易将客户端移动到新服务器。

此外,有些类型的数据是事务性的,需要位于具有完整事务日志记录的完全恢复模式的数据库中。其他数据仅从导入填充,不需要事务日志记录,并且可能会因为日志增长到足以处理10,000,000条记录导入而降低系统速度。这些通常被拆分为单独的数据库,因此它们可以处于简单的恢复模式,因为如果出现问题则无需从事务日志中恢复数据,可以通过重新运行导入轻松恢复。

然后将数据拆分为数据仓库,这些数据仓库针对数据报告而非事务进行了优化。同样,这些报告数据库通常是单独的数据库(通常在不同的服务器上)。

然后你有多个不同COTS应用程序的数据库(我们有会计数据库,信用卡交易访问数据库,人力资源数据库,我们的项目管理数据库)。特定网站可能需要访问多个网站或将信息从一个网站传输到另一个网站。相信我供应商不会让你将他们的数据库结构复制到一个数据库来统治它们。

我们在许多不同的服务器上有数百个数据库。