我已经使用 Symfony 将近 2 年了,到目前为止,我构建的每个项目都是专门为每个客户端部署的(即一个客户端、一个代码库、一个数据库)。
假设我有一个要为许多客户部署的项目管理应用程序。假设客户端将使用我在系统中构建的任何功能,如果我为每个客户端部署不同的代码库(因此,不同的数据库),以下是我预见的问题:
推动错误修复和升级将是痛苦的。我需要将它推送到我部署的每个存储库。如果我有 50 个客户使用同一个应用程序,它不会很好地扩展。
管理是痛苦的。我如何为自己构建一个管理系统,我可以将所有项目拉到一个 HTML 表中?毕竟,每个客户都有自己的数据库,对吧?为了让我对所有客户的所有记录做任何有意义的事情,我需要一种方法来一次性查看他们所有的数据库,这......我认为 Symfony 不允许。(我不确定)
用户帐户问题。如果一个用户碰巧为多家公司工作,他们都使用我的项目管理应用程序,那么该用户必须多次注册。(我知道如果我使用 oauth 可以避免这种情况,但如果可以的话,我会尽量不去那里)
以下是我想出并在一定程度上尝试过的解决方案。
解决方案 1
一个数据库和一个代码库供我所有的客户使用。项目将放在一张表下,发票放在一张表下,都由他们自己的 client_id 标记。可以将用户分配到项目,因此无需多次注册。
这并不难创造。但是,如果不同客户的发票需要不同的列,会发生什么?我的 Invoice 表将不断扩展(具有不同客户想要的不同字段),并且每一行都可能包含许多空字段。更不用说,我的 Invoice 实体的文件大小会增加,每次有新的自定义项时我都必须更新数据库模式。
解决方案 2
一个数据库,其中每个客户端都有自己的表前缀。所以对于客户端 A,我可以使用 clientA_projects、clientA_invoices、clientA_configuration 等。
如果每个客户都想自定义他们的字段,这是理想的选择。但是,这是否意味着我需要为进入系统的每个新客户端创建新的实体和表单类?看起来使用这个解决方案,我需要用我得到的每个新客户端更新数据库模式。
目前,我正在试验无模式数据库(mongo 和 couch),希望无需预先指定表模式,我可以轻松实施解决方案 1。但我仍在尝试,在我敢于部署生产就绪的应用程序之前还有很长的路要走,不熟悉 mongo 和 Symfony 的沙发问题。
所以,这就是我坚持的地方。作为一名自学成才的程序员,我觉得我的知识有很多需要填补的漏洞(与具有 CS 背景的人相反)。网上没有多少地方在谈论 Symfony 2 和多租户(也许我找错了东西)。如果有人能指出我更清晰的方向,也许是最佳实践、示例项目,我将非常感激!
顺便说一句,我计划在最新版本的 Symfony(目前为 2.3.2)中执行此操作。
提前谢谢各位。