Symfony2中的SAAS和多租户?

时间:2013-07-27 16:26:37

标签: php symfony doctrine-orm saas

我已经使用Symfony近2年了,到目前为止,我构建的每个项目都是专门为每个客户端部署的(即一个客户端,一个代码库,一个db)。

假设我有一个项目管理应用程序,我想为许多客户端部署。假设客户端将使用我构建到系统中的任何功能,如果我为每个客户端部署不同的代码库(因此,不同的数据库),这是我预见的问题:

  1. 推出错误修复和升级将是痛苦的。我需要将它推送到我部署的每个存储库。如果我有50个客户使用相同的应用程序,它将无法很好地扩展。

  2. 管理很痛苦。如何为自己构建管理系统,我可以将所有项目拉入一个HTML表格?毕竟,每个客户都有自己的数据库,对吧?为了让我对所有客户的所有记录做任何有意义的事情,我需要一种方法来一次查看他们所有的数据库,哪些......我不认为Symfony允许。 (我不确定)

  3. 用户帐户问题。如果用户碰巧为多家公司工作,所有公司都使用我的Project Management应用程序,该用户必须多次注册。 (我知道如果我使用oauth就可以规避这一点,但如果可以的话,我会尽量不去那里)

  4. 以下是我在某种程度上想到并尝试过的解决方案。


    解决方案1 ​​

    所有客户的一个数据库和一个代码库。项目将放在一个表格下,发票放在一个表格下,所有表格都标有自己的client_id。用户可以分配到项目,因此无需多次注册。

    这并不难创造。但是,如果不同的客户需要不同的发票列,会发生什么?我的发票表将继续扩展(使用不同客户端需要的不同字段),并且每行可能包含许多空字段。更不用说,我的Invoice实体将以文件大小增长,每次进行新的自定义时我都必须更新数据库模式。


    解决方案2

    一个数据库,其中每个客户端都有自己的表前缀。因此,对于客户端A,我可以使用clientA_projects,clientA_invoices,clientA_configuration等。

    如果每个客户都想自定义其字段,这是理想的选择。但是,这是否意味着我需要为进入系统的每个新客户创建新的实体和表单类?看起来这个解决方案,我需要用我得到的每个新客户端更新数据库模式。


    目前,我正在尝试使用无模式数据库(mongo和couch),希望无需事先指定表模式,我可以毫不费力地实现解决方案1。但是我还在试验,在我敢于部署生产就绪的应用程序之前还有很长的路要走,不熟悉与Symfony的mongo和沙发问题。


    所以,这就是我被困在的地方。作为一名自学成才的程序员,我觉得我的知识中有很多漏洞需要填充(而不是来自CS背景的人)。网上谈论Symfony 2和多租户的地方并不多(也许我在寻找错误的东西)。如果有人能够指出我更明确的方向,也许是最佳实践,示例项目,我将非常感激!

    顺便说一句,我打算在最新版本的Symfony(目前为2.3.2)中执行此操作。

    先谢谢你们。

2 个答案:

答案 0 :(得分:6)

我也使用Symfony2相似的时间(因为其中一个BETA),我建议你使用解决方案#1。如果您要使用SaaS,则由于您编写的原因(主要是更新/升级问题),您无法向客户端提供代码。整个麻烦都在于用户管理 - 哪个用户可以访问哪些数据,属于哪个组,公司等。如果正确完成所有其他事情将以与用户无关的方式编码。对于不同的公司,您应该如何应对不同的要求?制作此类功能configurable。您可以在各个级别实现此目的:

  • 简单实体属性:每个表中都有一个attributes字段,并将所有内容保存为JSON,YAML或其他动态可构建内容,
  • 一般配置:有一个存储实体基本配置的地方(以我上面写的方式)并允许用户从那里管理新功能,所有更改都传播到简单实体,
  • 实现我称之为Entity Parameters Pattern的东西 - 设计数据库表,其中包含参数类型,参数值以及与不同级别上其他实体的关系,然后制作可应用于具有预定义含义的任何地方的通用可配置参数类型。例如,“preferred_season”是包含“spring,summer,autumn,winter”配置的“choice_string”类型的参数,当附加到给定实体时,将总是呈现带有选项的<select>字段并保存与两者相关的选定值实体和参数类型。

此外,解决方案#1具有无可比拟的优势 - 即使您想在最后提供代码,它也可以处理更多的公司。你只需掩盖添加更多内容的能力。 :)

此问题已标记为Symfony2,但实际上并非如此。无论你使用什么框架,你都应该从代码中抽象你的应用程序设计,然后使用框架作为一个平稳地完成工作的工具。我想说,即使考虑到以前的句子,我也完全爱上了Symfony2。 :)

答案 1 :(得分:1)

我知道这是一个较旧的问题,但对其他人可能有用。

我同意@Tomasz和解决方案#1与one database - 一个数据库中的所有租户。这里最大的问题是正确的数据库设计,以解决进一步的安全问题:资源访问必须由应用程序控制,以防止租户之间的未授权访问。另一方面,由于我们只使用一个数据库来实现单个应用程序,因此我们可以轻松实现。

关于Symfony2并转向SaaS模型的好文章: http://www.browserlondon.com/blog/2015/01/moving-to-a-saas-model-with-symfony2/

关于在SaaS平台中设计数据库的“必读”文章 - 与平台无关的模式: http://labs.octivi.com/database-design-in-saas-platforms/