10

私は 2 年近く Symfony を使用しています。これまでのところ、私が構築する各プロジェクトは、各クライアント (つまり、1 つのクライアント、1 つのコードベース、1 つのデータベース) に合わせてデプロイされています。

多くのクライアントに展開したいプロジェクト管理アプリがあるとします。私がシステムに組み込んだ機能がクライアントに適用されると仮定すると、クライアントごとに異なるコードベース (したがって、異なるデータベース) をデプロイすると、次のような問題が予想されます。

  1. バグ修正やアップグレードをプッシュするのは苦痛です。デプロイしたすべてのリポジトリにプッシュする必要があります。同じアプリを使用しているクライアントが 50 ある場合、うまくスケーリングできません。

  2. 管理が苦痛。すべてのプロジェクトを 1 つの HTML テーブルにまとめる管理システムを自分で構築するにはどうすればよいですか? 結局のところ、各クライアントには独自のデータベースがありますよね? すべてのクライアントのすべてのレコードで意味のあることを行うには、すべてのデータベースを一度に調べる方法が必要です.. Symfony では許可されていないと思います。(わからない)

  3. ユーザー アカウントの問題。ユーザーがたまたま複数の会社で働いており、そのすべてが私の 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) で実行する予定です。

よろしくお願いします。

4

2 に答える 2

6

私は Symfony2 も同様の時間 (BETA の 1 つ以来) 使用していますが、ソリューション #1 を使用することをお勧めします。SaaS に移行する場合は、あなたが書いた理由 (主に更新/アップグレードに関する問題) により、クライアントにコードを提供することはできません。全体の問題はユーザー管理にあります。どのユーザーがどのデータにアクセスできるか、どのグループに属しているか、どの会社に属しているかなどです。適切に行われた場合、他のすべてのことは、ユーザーに依存しない同じ方法でコーディングされます。さまざまな企業のさまざまな要件に対して何をすべきか? そのような機能を作りますconfigurable。これはさまざまなレベルで実装できます。

  • 単純なエンティティ属性:attributes各テーブルにフィールドを持ち、すべてを JSON、YAML、またはその他の動的に構造化可能なコンテンツとして保存します。
  • 一般的な構成: エンティティの基本構成が格納される場所が 1 つあります (上で書いた方法で)。ユーザーはそこから新しい機能を管理できます。すべての変更は単純なエンティティに伝達されます。
  • 私が呼ぶものを実装しますEntity Parameters Pattern- パラメータタイプ、パラメータ値、およびさまざまなレベルの他のエンティティとの関係を含むデータベーステーブルを設計し、定義済みの意味を持つ任意の場所に適用できる汎用の構成可能なパラメータタイプを作成します。たとえば、「preferred_season」は、構成「春、夏、秋、冬」を含むタイプ「choice_string」のパラメーターであり、特定のエンティティにアタッチされている場合、常に<select>選択肢のあるフィールドをレンダリングし、選択した値をエンティティとパラメーターの両方のタイプに関連して保存します。

また、ソリューション #1 には 1 つの優れた利点があります。最後にコードを配布したい場合でも、複数の会社を処理できます。さらに追加する機能をマスクする必要があるだけです。:)

この質問はタグ付けSymfony2されていますが、タグ付けするべきではありません。使用しているフレームワークに関係なく、アプリケーションの設計をコードから抽象化し、フレームワークを仕事をスムーズに行うための単なるツールとして使用する必要があります。前の文を考慮しても、私は Symfony2 が大好きです。:)

于 2013-08-08T21:25:21.760 に答える