私は 2 年近く Symfony を使用しています。これまでのところ、私が構築する各プロジェクトは、各クライアント (つまり、1 つのクライアント、1 つのコードベース、1 つのデータベース) に合わせてデプロイされています。
多くのクライアントに展開したいプロジェクト管理アプリがあるとします。私がシステムに組み込んだ機能がクライアントに適用されると仮定すると、クライアントごとに異なるコードベース (したがって、異なるデータベース) をデプロイすると、次のような問題が予想されます。
バグ修正やアップグレードをプッシュするのは苦痛です。デプロイしたすべてのリポジトリにプッシュする必要があります。同じアプリを使用しているクライアントが 50 ある場合、うまくスケーリングできません。
管理が苦痛。すべてのプロジェクトを 1 つの HTML テーブルにまとめる管理システムを自分で構築するにはどうすればよいですか? 結局のところ、各クライアントには独自のデータベースがありますよね? すべてのクライアントのすべてのレコードで意味のあることを行うには、すべてのデータベースを一度に調べる方法が必要です.. Symfony では許可されていないと思います。(わからない)
ユーザー アカウントの問題。ユーザーがたまたま複数の会社で働いており、そのすべてが私の Project Management アプリを使用している場合、そのユーザーは複数回サインアップする必要があります。(oauth を使用すればこれを回避できることはわかっていますが、できる限りそこには行かないようにしています)
これが私が考え、ある程度試した解決策です。
解決策 1
すべてのクライアントに 1 つのデータベースと 1 つのコードベース。プロジェクトは 1 つのテーブルの下にあり、請求書は 1 つのテーブルの下にあり、すべて独自の client_id でマークされています。ユーザーをプロジェクトに割り当てることができるため、何度もサインアップする必要はありません。
これを作成するのはそれほど難しくありません。しかし、異なるクライアントが請求書に異なる列を必要とする場合はどうなるでしょうか? 私の Invoice テーブルは (さまざまなクライアントが必要とするさまざまなフィールドで) 拡大し続け、各行には多くの null フィールドが含まれる可能性があります。言うまでもなく、私の Invoice エンティティはファイル サイズが大きくなり、新しいカスタマイズが行われるたびにデータベース スキーマを更新する必要があります。
解決策 2
各クライアントが独自のテーブル プレフィックスを持つ 1 つのデータベース。したがって、クライアント A の場合、clientA_projects、clientA_invoices、clientA_configuration などを使用できます。
これは、各クライアントがフィールドをカスタマイズしたい場合に理想的です。しかし、これは、システムに入ってきた新しいクライアントごとに、新しいエンティティ クラスとフォーム クラスを作成する必要があるということですか? このソリューションでは、新しいクライアントを取得するたびにデータベース スキーマを更新する必要があるようです。
現在、私はスキーマのないデータベース (mongo とソファ) を試しています。テーブル スキーマを前もって指定する必要がなく、解決策 1 を手間をかけずに実装できることを願っています。しかし、私はまだ実験中であり、Symfony での mongo とソファの問題に慣れていないため、本番対応のアプリをあえてデプロイする前に進む方法があります。
だから、これは私が立ち往生しているところです。自己訓練を受けたプログラマーである私は、(CS のバックグラウンドを持つ人とは対照的に) 埋めなければならない知識に多くの穴があると感じています。Web 上で Symfony 2 とマルチテナンシーについて話している場所はあまりありません (私の探し方が間違っているのかもしれません)。誰かがより明確な方向性、おそらくベストプラクティス、サンプルプロジェクトを教えてくれれば、本当に感謝しています!
ところで、これを Symfony の最新バージョン (現時点では 2.3.2) で実行する予定です。
よろしくお願いします。