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

Database design 如何在Symfony2环境之间分离数据?,database-design,symfony,doctrine,Database Design,Symfony,Doctrine,以下是场景: 我们想建立一个Symfony2应用程序,我们将主机上的不同客户端。每个客户机都有自己的环境,而不是一个环境(比如说事实上的“prod”环境) 那么,假设我们有客户“foo”和“bar”。然后我们将有三个环境:一个用于“foo”,一个用于“bar”,然后一个用于我们的开发(我们称之为“dev”)。我只是举个例子,假设我们可以有几十到几百个客户 这一点是,我们希望为客户机分离数据。我们的应用程序在我们的所有客户机中都能正常工作(相同的捆绑包等),但是,每个客户机都有自己的数据,其他客户

以下是场景:

我们想建立一个Symfony2应用程序,我们将主机上的不同客户端。每个客户机都有自己的环境,而不是一个环境(比如说事实上的“prod”环境)

那么,假设我们有客户“foo”和“bar”。然后我们将有三个环境:一个用于“foo”,一个用于“bar”,然后一个用于我们的开发(我们称之为“dev”)。我只是举个例子,假设我们可以有几十到几百个客户

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

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

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

  • 为每个客户机提供自己的数据库服务器。这将提供最大的性能,并将分离数据。将这些信息输入配置文件也很容易。然而,这是昂贵的,难以维护
  • 使用一个数据库服务器,但为每个服务器提供各自的模式。这会分离数据,而且是最经济高效的,但是,我确信最终会出现性能问题(随着模式计数变得相当大),并且仍然很难维护(比如在必须更新表结构时)
  • 但是,将所有信息放入一个数据库和一个模式中,使用某种应用程序逻辑来区分它们。虽然这是合理的(这是我们目前在遗留应用程序中所做的;将所有内容绑定到客户端PKID),但我不太确定使用ORM会有多容易,我们希望使用ORM
  • 就我个人而言,我在第三种选择(一个db、一个模式和按应用程序逻辑过滤)和第一种和第二种选择(给每个客户机自己的模式,提供新的服务器,并在性能问题出现时调动人员)之间左右为难。我相信我的1和2的混合将是最简单的,因为它只需要更改配置选项(将环境指向服务器和模式)。但是,我认为选项3在性能方面是最好的,如果可能的话,它可能更难设置

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

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


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

    我想首先声明,symfony中的环境不会在客户端之间有所不同,而是在dev/test/staging/prod之间有所不同。从我的头脑中我不知道您使用环境的方式会导致问题的用例,但是,与框架背道而驰通常是个坏主意

    当然,我并不完全了解您的项目,但在我看来,您有一个非常常见的用例,即不同的“用户”(您称之为客户机)访问您的项目,并且需要在具有不同“设置”(您称之为配置)的同时查看不同的数据

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

    然而,当面对更新时,这个解决方案当然是至关重要的。部署应用程序时,必须更新100个数据库。由于您不能只为一个客户机部署,因此您要么关闭整个应用程序,直到数据库迁移完成,要么以向后兼容的方式开发应用程序。这可能行得通,但当需要第三种解决方案来解决关于模式布局的错误决策时,它往往会变得难看

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

    我会选择第三种选择。如果您认为您可能存在性能问题,您可能需要考虑扩展技术,尤其是在MySQL(或任何RDBMS)的情况下。由于我们的资源(我们负担不起,并且希望使用MySQL),这不是我们真正的选择,但是我想提到它,因为我觉得它非常有趣,它将在数据库级别解决我们的问题

    Oracle数据库(我相信是企业版)有一个名为“虚拟”的功能