シナリオは次のとおりです。
さまざまなクライアントをホストする Symfony2 アプリを構築したいと考えています。1 つの環境 (事実上の "prod" 環境としましょう) を持つ代わりに、各クライアントは独自の環境を取得します。
では、クライアント "foo" と "bar" があるとします。その場合、3 つの環境が必要になります。1 つは「foo」用、もう 1 つは「bar」用、そしてもう 1 つは開発用 (「dev」と呼びましょう) です。私はこの例を示しているだけですが、数十から数百のクライアントを持つことができるとしましょう。
これのポイントは、クライアントのデータを分離したいということです。私たちのアプリはすべてのクライアント (同じバンドルなど) で同じように動作しますが、それぞれに独自のデータがあり、他のクライアントからアクセスできないようにする必要があります (これにより、データのセキュリティが確保され、簡単になります)。各クライアントのデータをバックアップ、復元、インポート、およびエクスポートします)。この種の機能 (環境ごとに 1 つのクライアント) を許可する方法は既にありますが、データベース データの保存に関しては、問題が発生すると考えられます。
ドキュメンテーションで読んだことから、Symfony2 環境では (他の変更が行われない限り) さまざまな構成ファイルをロードできるだけであると想定しています。したがって、これらの構成ファイルで、それらがすべて同じデータベース構成を指している場合、環境がデータベースを「共有」することも想定しています。多かれ少なかれ、環境「foo」で誰かが入力したものは、環境「bar」でも同じようにアクセスできます。これは望ましくありません。
すぐに使用できるこの環境の概念を使用すると、次の 3 つの選択肢があります。
- 各クライアントに独自のデータベース サーバーを提供します。これにより、最大のパフォーマンスが得られ、データが分離されます。この情報を構成ファイルに取り込むのも簡単です。ただし、高価であり、維持するのは困難です。
- 1 つのデータベース サーバーを使用しますが、それぞれに独自のスキーマを与えます。これはデータを分離し、最もコスト効率に優れていますが、最終的にはパフォーマンスの問題が発生し (スキーマ数がかなり大きくなるため)、維持するのは難しいでしょう (テーブルを更新する必要がある場合など)。構造)。
- すべての情報を 1 つのデータベースと 1 つのスキーマに入れますが、何らかのアプリケーション ロジックを使用してそれらを区別します。これはもっともらしいことですが (これは私たちが現在レガシー アプリで行っていることです。すべてをクライアント PKID に結び付けています)、使用したい ORM を使用してこれがどれほど簡単になるかはわかりません...
個人的には、3 番目のオプション (1 つのデータベース、1 つのスキーマ、およびアプリケーション ロジックによるフィルタリング) と、1 番目と 2 番目のオプションのハイブリッド (各クライアントに独自のスキーマを与え、新しいサーバーをプロビジョニングし、パフォーマンスを向上させるために人々を移動させる) の間でちょっと悩んでいます。問題が表示されます)。1 と 2 のハイブリッドが最も簡単だと思います。構成オプションを変更するだけでよいためです (環境をサーバーとスキーマに向ける)。しかし、オプション 3 がパフォーマンス的には最高だと思います。可能であれば、セットアップが難しくなる可能性があります。
したがって、私が知りたいのは、3 番目のオプション (アプリケーション ロジックを使用してデータを分離する) を介してこれを達成する方法があるかどうかです。私は本当に「簡単な」解決策を探しています。「簡単」とは、Symfony2 または Doctrine に既に組み込まれているツールと機能を使用することを意味します。たとえば、doctrine の構成設定や、データの一部の環境を何らかの方法で記録してリンクする Doctrine 拡張機能を作成するようなものです。
または、誰か他の提案があれば、私もそれらを聞くことに興味があります.
データベースには MySQL を使用する予定です。このアプリは、Apache と PHP がインストールされた Linux VM 上で実行されます。Symfony2 の最新リリースも使用します。