2013-07-27 60 views
10

我已经使用Symfony近2年了,到目前为止,我构建的每个项目都专门为每个客户端部署(即一个客户端,一个代码库,一个数据库)。Symfony2中的SAAS和多租户?

可以说我有一个项目管理应用程序,我想为许多客户端部署。假设客户将去什么功能我构建到系统中,如果我部署的每个客户不同的代码库(因此,不同的DB),这里有我预见到的问题:

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

  2. 管理是痛苦的。我如何为自己构建管理系统,以便将所有项目拖放到一个HTML表格中?毕竟,每个客户都有自己的数据库,对吧?对于我来说,对所有客户的所有记录做任何有意义的事情,我都需要一种方式来一次查看所有数据库,这......我不认为Symfony允许。 (我不确定)

  3. 用户帐户问题。如果用户碰巧为多家公司工作,他们都使用我的项目管理应用程序,该用户必须多次注册。 (我知道这可能如果我使用OAuth被规避,但我想,如果我不能去那里)

下面是我想到了,并试图在一定程度上的解决方案。


解决方案1 ​​

一个数据库和我所有的客户一个代码库。项目将在一张桌子下面,发票在一张桌子下面,全部由他们自己的client_id标记。用户可以分配到项目,因此不需要多次注册。

这并不难。但是,如果不同客户需要不同列的发票,会发生什么?我的发票表格将继续展开(使用不同客户需要的不同字段),并且每行可能包含许多空字段。更何况,我的发票实体将在文件大小成长,我将有每一个新的定制是以时间来更新数据库架构。


解决方案2

一个数据库,在那里每一个客户有他们自己的表前缀。所以对于客户端A,我可以使用clientA_projects,clientA_invoices,clientA_configuration等。

如果每个客户想要定制他们的字段,这是理想的。但是,这是否意味着我需要为每个进入系统的新客户创建新的实体和表单类?它看起来像这个解决方案,我需要更新每个新客户端的数据库模式。


目前,我正与方案较少的数据库(蒙戈和沙发)实验,希望无需指定表架构的前期,我可以实现方案1毫不费力。但是我仍在尝试,在敢于部署一款可以生产准备的应用程序之前,我们还有很多方法可以解决,因为我们不熟悉Mongf和沙发与Symfony的问题。


所以,这是我卡在哪里。作为一名训练有素的程序员,我觉得在我的知识中有很多漏洞需要填补(而不是CS背景的人)。网上没有很多地方在谈论Symfony 2和多租户(也许我在寻找错误的东西)。如果任何人能指出我更清晰的方向,也许最佳实践,示例项目,我会非常感激!

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

在此先感谢你们。

+0

@ LU0 - 德章是存在的你有没有可能分享你的结果?我正在开发一个使用Symfony3的新SaaS应用程序,但对于数据库和Symfony3项目组织也一点都不了解,所以......难以置信? – ReynierPM

回答

6

我也使用Symfony2的时间相当(因为BETA之一),我建议你去解决方案#1。如果您打算使用SaaS,您无法根据您撰写的原因向客户提供代码(主要是更新/升级问题)。整个麻烦将在用户管理上 - 哪个用户可以访问哪些数据,属于哪个组,哪家公司等等。所有其他事情,如果正确完成,将被编码为与用户无关的相同方式。您应该如何处理不同公司的不同要求?使这样的功能configurable。您可以在各个层次上实现这一点:

  • 简单的实体属性:有attributes场中的每个表,并保存一切,JSON,YAML或其他动态结构化的内容,
  • 一般配置:有一个地方实体存储基础配置(以我上面所写的方式),并允许用户从那里管理新功能,所有更改都传播到简单实体,
  • 实现我所谓的Entity Parameters Pattern - 设计数据库表,其中包含参数类型,参数值和与不同级别上的其他实体的关系,然后制作通用可配置参数类型可以应用于任何具有预定意义的地方。例如,“preferred_season”是类型的参数“choice_string”包含配置“春,夏,秋,冬”并连接到给定的实体时将总是呈现<select>场与选择和保存选择的值与相对于两个实体和参数类型。

此外,解决方案#1有一个无与伦比的优势 - 它可以处理更多的一家公司,即使你想在最后给出代码。你只需要掩盖添加更多内容的能力。 :)

这个问题是标签Symfony2但它确实不应该。不管你使用的是什么框架,你都应该从代码中抽象出你的应用程序设计,然后使用框架作为单纯的工具来顺利地完成工作。我想说,即使考虑到前面的句子,我完全爱上了Symfony2。 :)

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/