我已经使用Symfony近2年了,到目前为止,我构建的每个项目都专门为每个客户端部署(即一个客户端,一个代码库,一个数据库)。Symfony2中的SAAS和多租户?
可以说我有一个项目管理应用程序,我想为许多客户端部署。假设客户将去什么功能我构建到系统中,如果我部署的每个客户不同的代码库(因此,不同的DB),这里有我预见到的问题:
推bug修复和升级将是痛苦的。我需要将它推送到我已部署的每个存储库。如果我有50个客户端使用同一个应用程序,它将无法很好地扩展。
管理是痛苦的。我如何为自己构建管理系统,以便将所有项目拖放到一个HTML表格中?毕竟,每个客户都有自己的数据库,对吧?对于我来说,对所有客户的所有记录做任何有意义的事情,我都需要一种方式来一次查看所有数据库,这......我不认为Symfony允许。 (我不确定)
用户帐户问题。如果用户碰巧为多家公司工作,他们都使用我的项目管理应用程序,该用户必须多次注册。 (我知道这可能如果我使用OAuth被规避,但我想,如果我不能去那里)
下面是我想到了,并试图在一定程度上的解决方案。
解决方案1
一个数据库和我所有的客户一个代码库。项目将在一张桌子下面,发票在一张桌子下面,全部由他们自己的client_id标记。用户可以分配到项目,因此不需要多次注册。
这并不难。但是,如果不同客户需要不同列的发票,会发生什么?我的发票表格将继续展开(使用不同客户需要的不同字段),并且每行可能包含许多空字段。更何况,我的发票实体将在文件大小成长,我将有每一个新的定制是以时间来更新数据库架构。
解决方案2
一个数据库,在那里每一个客户有他们自己的表前缀。所以对于客户端A,我可以使用clientA_projects,clientA_invoices,clientA_configuration等。
如果每个客户想要定制他们的字段,这是理想的。但是,这是否意味着我需要为每个进入系统的新客户创建新的实体和表单类?它看起来像这个解决方案,我需要更新每个新客户端的数据库模式。
目前,我正与方案较少的数据库(蒙戈和沙发)实验,希望无需指定表架构的前期,我可以实现方案1毫不费力。但是我仍在尝试,在敢于部署一款可以生产准备的应用程序之前,我们还有很多方法可以解决,因为我们不熟悉Mongf和沙发与Symfony的问题。
所以,这是我卡在哪里。作为一名训练有素的程序员,我觉得在我的知识中有很多漏洞需要填补(而不是CS背景的人)。网上没有很多地方在谈论Symfony 2和多租户(也许我在寻找错误的东西)。如果任何人能指出我更清晰的方向,也许最佳实践,示例项目,我会非常感激!
顺便说一句,我打算在Symfony的最新版本(此时2.3.2)中执行此操作。
在此先感谢你们。
@ LU0 - 德章是存在的你有没有可能分享你的结果?我正在开发一个使用Symfony3的新SaaS应用程序,但对于数据库和Symfony3项目组织也一点都不了解,所以......难以置信? – ReynierPM