如何在Symfony2环境之间分离数据?

时间:2012-11-07 22:09:55

标签: database-design symfony doctrine

以下是该方案:

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

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

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

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

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

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

    就个人而言,我在第三个选项(一个数据库,一个模式和应用程序逻辑过滤)和第一个和第二个选项的混合之间徘徊(为每个客户端提供自己的模式并配置新服务器并移动人员一旦性能问题出现了)。我相信我的1和2的混合将是最简单的,因为它只需要更改配置选项(将环境指向服务器和架构)。但是,我认为选项3将是性能最佳的,如果可能的话,它可能更难设置。

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

    或者,如果有人有其他建议,我也会有兴趣听取他们的意见。

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

2 个答案:

答案 0 :(得分:1)

我想首先说明symfony中的环境不是在客户端之间,而是在dev / test / staging / prod之间。我不知道从头脑中使用环境会导致问题的用例,但是反对框架通常是一个坏主意。

我当然不了解你的项目的一切,但在我看来,你有不同的“用户”(你称之为客户)访问你的项目的常见用法,需要看到不同的数据,同时有不同的“设置”(您称之为配置)。

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

然而,在面对更新时,此解决方案当然是至关重要的。您部署应用程序并且必须更新100个数据库。由于您无法仅部署一个客户端,因此您可以删除整个应用程序,直到数据库迁移完成,或者开发具有向后兼容性的应用程序。这可能有用,但是当需要针对模式布局做出错误决策的第三种解决方法时,它会变得很难看。

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

我会选择三。如果您认为可能存在性能问题,则可能需要考虑扩展技术,尤其是因为MySQL(或任何RDBMS)对此并不容易。

答案 1 :(得分:0)

由于我们的资源(我们负担不起并且想要使用MySQL),这对我们来说不是一个真正的选择,但我想提一下它,因为我发现它非常有趣并且它会解决我们的问题吧在数据库层面。

Oracle数据库(我相信企业版)有一个名为“虚拟专用数据库”的功能,可以完全满足我们的需要。基本上,您可以根据连接到数据库的用户,在SQL引擎内直接向表,行甚至列添加访问策略。这样,数据可以存放在同一个表中,但您可以使用SQL引擎自动隐藏和阻止访问用户无法看到的数据行/列。

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

Virtual Private Database

Using Oracle Virtual Private Database to Control Data Access