这是场景:
我们想要构建一个 Symfony2 应用程序,我们将在其上托管不同的客户端。每个客户都拥有自己的环境,而不是拥有一个环境(假设是事实上的“prod”环境)。
所以,假设我们有客户“foo”和“bar”。然后我们将拥有三种环境:一种用于“foo”,一种用于“bar”,然后一种用于我们的开发用途(我们称之为“dev”)。虽然我只举这个例子,但假设我们可以拥有数十到数百个客户。
这样做的重点是我们要为客户端分离数据。我们的应用程序将在我们所有的客户端(相同的包等)中运行相同,但是,它们每个都有自己的数据,并且其他客户端确实不应该访问它(这为他们提供了数据安全性并使我们更容易为每个客户端备份、恢复、导入和导出数据)。我们已经有了允许这种功能的方法(每个环境一个客户端),但是,在存储数据库数据时,我们相信我们会遇到一些麻烦。
根据我在文档中阅读的内容,我假设 Symfony2 环境实际上只允许您加载不同的配置文件(除非进行了其他更改)。所以,我还假设如果在这些配置文件中,它们都指向同一个数据库配置,那么环境将“共享”数据库。或多或少,无论有人在环境“foo”中输入什么,都可以在环境“bar”中访问。这是不希望的。
使用这种开箱即用的环境概念,我看到了三个选择:
- 给每个客户自己的数据库服务器。这将提供最大的性能并分离数据。将这些信息放入配置文件也很容易。然而,它昂贵且难以维护。
- 使用一台数据库服务器,但为每个服务器提供自己的架构。这样可以分离数据并且最具成本效益,但是,我确信最终会出现性能问题(因为模式计数变得相当大),并且仍然难以维护(例如必须更新表时结构体)。
- 将所有信息放入一个数据库和一个模式中,但是,使用某种应用程序逻辑来区分它。虽然这是合理的(这是我们目前在旧版应用程序中所做的;将所有内容与客户端 PKID 绑定),但我不太确定使用我们想要使用的 ORM 会有多容易......
就个人而言,我在第三种选择(一个数据库、一个模式和按应用程序逻辑过滤)和第一种和第二种混合(为每个客户端提供自己的模式并提供新服务器并在一次性能后调动人员)之间纠结问题出现)。我相信我的 1 和 2 的混合将是最简单的,因为它只需要更改配置选项(将环境指向服务器和模式)。但是,我认为选项 3 在性能方面是最好的,即使可能的话,它可能更难设置。
那么,我想知道是否有办法通过第三个选项(使用应用程序逻辑来分离数据)来实现这一点?我真的在寻找一个“简单”的解决方案。“简单”是指使用 Symfony2 或 Doctrine 中已经内置的工具和功能,例如可能是一个教义配置设置,甚至是编写一个 Doctrine 扩展,以某种方式记录一段数据的环境并将其链接到它。
或者,如果有人有其他建议,我也有兴趣听听。
我们预计将 MySQL 用于数据库。此应用程序将在安装了 Apache 和 PHP 的 Linux VM 上运行。我们还将使用最新版本的 Symfony2。