2

这是场景:

我们想要构建一个 Symfony2 应用程序,我们将在其上托管不同的客户端。每个客户都拥有自己的环境,而不是拥有一个环境(假设是事实上的“prod”环境)。

所以,假设我们有客户“foo”和“bar”。然后我们将拥有三种环境:一种用于“foo”,一种用于“bar”,然后一种用于我们的开发用途(我们称之为“dev”)。虽然我只举这个例子,但假设我们可以拥有数十到数百个客户。

这样做的重点是我们要为客户端分离数据。我们的应用程序将在我们所有的客户端(相同的包等)中运行相同,但是,它们每个都有自己的数据,并且其他客户端确实不应该访问它(这为他们提供了数据安全性并使我们更容易为每个客户端备份、恢复、导入和导出数据)。我们已经有了允许这种功能的方法(每个环境一个客户端),但是,在存储数据库数据时,我们相信我们会遇到一些麻烦。

根据我在文档中阅读的内容,我假设 Symfony2 环境实际上只允许您加载不同的配置文件(除非进行了其他更改)。所以,我还假设如果在这些配置文件中,它们都指向同一个数据库配置,那么环境将“共享”数据库。或多或少,无论有人在环境“foo”中输入什么,都可以在环境“bar”中访问。这是不希望的。

使用这种开箱即用的环境概念,我看到了三个选择:

  1. 给每个客户自己的数据库服务器。这将提供最大的性能并分离数据。将这些信息放入配置文件也很容易。然而,它昂贵且难以维护。
  2. 使用一台数据库服务器,但为每个服务器提供自己的架构。这样可以分离数据并且最具成本效益,但是,我确信最终会出现性能问题(因为模式计数变得相当大),并且仍然难以维护(例如必须更新表时结构体)。
  3. 将所有信息放入一个数据库和一个模式中,但是,使用某种应用程序逻辑来区分它。虽然这是合理的(这是我们目前在旧版应用程序中所做的;将所有内容与客户端 PKID 绑定),但我不太确定使用我们想要使用的 ORM 会有多容易......

就个人而言,我在第三种选择(一个数据库、一个模式和按应用程序逻辑过滤)和第一种和第二种混合(为每个客户端提供自己的模式并提供新服务器并在一次性能后调动人员)之间纠结问题出现)。我相信我的 1 和 2 的混合将是最简单的,因为它只需要更改配置选项(将环境指向服务器和模式)。但是,我认为选项 3 在性能方面是最好的,即使可能的话,它可能更难设置。

那么,我想知道是否有办法通过第三个选项(使用应用程序逻辑来分离数据)来实现这一点?我真的在寻找一个“简单”的解决方案。“简单”是指使用 Symfony2 或 Doctrine 中已经内置的工具和功能,例如可能是一个教义配置设置,甚至是编写一个 Doctrine 扩展,以某种方式记录一段数据的环境并将其链接到它。

或者,如果有人有其他建议,我也有兴趣听听。

我们预计将 MySQL 用于数据库。此应用程序将在安装了 Apache 和 PHP 的 Linux VM 上运行。我们还将使用最新版本的 Symfony2。

4

2 回答 2

1

我想首先声明 symfony 中的环境在客户端之间没有区别,而是在 dev/test/staging/prod 之间有所不同。我不知道您使用环境的方式会导致问题的用例,但是针对框架工作通常是一个坏主意。

我当然对您的项目一无所知,但在我看来,您有一个非常常见的用例,即不同的“用户”(您称他们为客户)访问您的项目并且需要在具有不同“设置”的同时查看不同的数据(你称之为配置)。

但是,如果这是您决定构建应用程序的方式,那么让我们使用它。您的解决方案点 1 和 2 与 symfony 相同。Symfony 不关心 dbms 是否在不同的服务器上,或者服务器上是否正在运行 100 个数据库。它只需要一个主机和正确的凭据。因此,您可以从 1 台数据库服务器开始,如果发现性能下降,您可以添加第二台。

然而,这个解决方案在面临更新时当然是至关重要的。您部署应用程序并且必须更新 100 个数据库。由于您不能只为一个客户端部署,您要么关闭整个应用程序,直到数据库迁移完成,要么开发具有向后兼容性的应用程序。这可能会奏效,但当需要第三个解决方案以做出关于模式布局的错误决策时,它往往会变得难看。

您的第三个解决方案将是经典方法。根据安全风险,您将在应用程序和原则之间添加另一层,以改变查询的方式,只有特定客户端的数据可以访问。

我会选择选项三。如果您认为您可能有性能问题,您可能需要考虑扩展技术,特别是因为使用 MySQL(或任何 RDBMS)这往往不是那么容易。

于 2012-11-07T22:48:10.110 回答
0

由于我们的资源(我们负担不起并且想要使用 MySQL),这对我们来说不是一个真正的选择,但我想提一下,因为我觉得它非常有趣,它可以解决我们在数据库中的问题等级。

Oracle 数据库(我相信是企业版)有一个名为“虚拟专用数据库”的特性,它完全可以满足我们的需求。基本上,您可以根据连接到数据库的用户在 SQL 引擎中为表、行甚至列添加访问策略。这样,数据可以全部保存在同一个表中,但您可以使用 SQL 引擎自动隐藏和阻止对用户不应该看到的数据行/列的访问。

这似乎是一个很棒的功能,但是许可要求和其他成本会阻止我们(可能还有很多人)能够使用它......

虚拟专用数据库

使用 Oracle 虚拟专用数据库控制数据访问

于 2012-11-08T21:34:33.453 回答