0

私は、すべてのトランザクション用のマスター データベースと、各テナント用のユーザー ベースおよび個別のデータベースを使用して、SaaS アプリケーションを構築中です。各テナントには一意のサブドメインが与えられ、それに基づいて、正しいデータベースがテナントに向けられます。Web アプリケーションは php を使用して構築され、MySQL はデータ ストレージに使用されます。

私にはいくつかの問題があります。

  1. ユーザーがテナントのホームページ (Sub.abc.com など) にアクセスすると、ログイン機能が利用可能になります。ユーザー名パスワードとユーザーベースはマスターデータベースにあるため、ユーザーを認証するにはどうすればよいですか? マスター データベースの別のデータベース接続を介してですか、それとも Web API を介してですか? 最善の方法は何ですか?

  2. テナントによって作成されたロールがあります。そのため、特定のテナントのスタッフが Web API を呼び出して取得され、ロールがユーザー ID と共にテナント データベースに格納されているとします。直接の外部キー マッピングがなく、ユーザーが取得されたら、テナント データベースに格納するか、単にメモリに保持する必要があるため、これは正しい方法ですか?

  3. ビジネス オーナーが各テナント データベース固有のレポートを必要としている場合、個々のテナント データベースからすべてのデータを取得するには、どのような方法が最適でしょうか?

  4. 各テナントのデータベース使用状況、ファイル ストレージをキャプチャし、スーパー管理者に表示するにはどうすればよいですか?

4

2 に答える 2

3

ユーザーを認証するにはどうすればよいですか? master データベースの別のデータベース接続を介してですか、それとも Web API を介してですか? 最善の方法は何ですか?

「最善の方法」の質問には注意してください。これは、この質問が意見に基づいているため、トピックから外れていることを示しています。

あなたのアプリケーションが完全にクローズドソースである場合 (私はそうだと思います)、それは問題ではありません。すべてのクライアント実装が全体的なソフトウェア パッケージの一部になるため、必要に応じてマスター データベースに直接アクセスできます。

そうは言っても、スケーラビリティと保守性のためには、認証 API インターフェイスを構築してそれを使用する方がおそらく良い考えです。そのため、クライアント ソフトウェアのデータベース接続コンポーネントを管理する必要はありません。

...ロールは、ユーザー ID とともにテナント データベースに格納されます。直接の外部キー マッピングがなく、ユーザーが取得されたら、テナント データベースに格納するか、単にメモリに保持する必要があるため、これは正しい方法ですか?

これで問題ありません。ユーザーはすべての実装に共通ですが、ロールは各クライアント実装に固有です。これは、最初に認証してから、ログインしたユーザーにクライアントの役割を割り当てるという点で、アプローチしている方法が正しいことを示しています。これをローカル データベースに対して確認し (明らかに)、ユーザーのセッションに割り当てる必要があります。彼らの訪問の間、それは固執します。

ビジネス オーナーが各テナント データベース固有のレポートを必要としている場合、個々のテナント データベースからすべてのデータを取得するには、どのような方法が最適でしょうか?

これは広すぎて答えられません。クライアントのデータはあなたのものではない可能性があるため、ここでも注意が必要です。

各テナントのデータベースの使用状況、ファイル ストレージをキャプチャし、スーパー管理者に表示するにはどうすればよいですか?

繰り返しますが、非常に大まかですが、各クライアント データベースのデータベース統計について MySQL サーバーにクエリを実行することで、このようなことを達成できると思います。また、クライアントのファイルをホストするサーバーにクエリを実行することで、ファイル ストレージについても同じことを行うことができると思います。


これがお役に立てば幸いです。より具体的なヘルプが必要な場合は、質問をもう少し絞り込んでください。

于 2016-03-03T01:56:04.760 に答える
0

「最善の方法」の質問には注意してください。これは、この質問が意見に基づいているため、トピックから外れていることを示しています。

あなたのアプリケーションが完全にクローズドソースである場合 (私はそうだと思います)、それは問題ではありません。すべてのクライアント実装が全体的なソフトウェア パッケージの一部になるため、必要に応じてマスター データベースに直接アクセスできます。

そうは言っても、スケーラビリティと保守性のためには、認証 API インターフェイスを構築してそれを使用する方がおそらく良い考えです。そのため、クライアント ソフトウェアのデータベース接続コンポーネントを管理する必要はありません。

同意した。この種のシナリオでは、特にマルチテナンシーで答えを見つけるのは非常に困難です。

クローズドソースとはどういう意味ですか?

マスター データベースからデータを取得するための認証 API を使用できる場合、アプリケーション内でのみアクセスが許可され、外部からアクセスできないようにホストするにはどうすればよいでしょうか? 後で、外部ユーザーにもサービスを公開する必要があります。この場合、これを今から公開するか、後で別のサービスで作業する方が良いですか? NuSOAP 以外であなたが知っている最高の PHP Web サービス ライブラリは何ですか?

これで問題ありません。ユーザーはすべての実装に共通ですが、ロールは各クライアント実装に固有です。これは、最初に認証してから、ログインしたユーザーにクライアントの役割を割り当てるという点で、アプローチしている方法が正しいことを示しています。これをローカル データベースに対して確認し (明らかに)、ユーザーのセッションに割り当てる必要があります。彼らの訪問の間、それは固執します。

それは正しいです!ユーザーはすべての実装に共通であり、これはマスター データベースに保存され、個々のテナント データベースには保存されません。つまり、テナント アプリケーションごとに、テナントは請求単位、アカウント、したがって、これらの user_id と role_id はテナントのデータベースに格納されます。user_id がマスターデータベースのユーザーテーブルに直接マップされていないので、大丈夫かどうか尋ねたのはそのためです。

これは広すぎて答えられません。クライアントのデータはあなたのものではない可能性があるため、ここでも注意が必要です。

とりあえず、スーパー管理者がすべてのテナントのロールを知りたいと仮定しましょう。この場合、すべてのテナント データベースからデータを取得するにはどうすればよいでしょうか? これにはビューを使用しますか、それとも mysql を使用しているため、どうすればこれを達成できますか?

繰り返しますが、非常に大まかですが、各クライアント データベースのデータベース統計について MySQL サーバーにクエリを実行することで、このようなことを達成できると思います。また、クライアントのファイルをホストするサーバーにクエリを実行することで、ファイル ストレージについても同じことを行うことができると思います。

これについては非常に申し訳ありません。基本的には、テナント データベースの使用状況を追跡して、合意した量を超えているかどうかを確認したいと考えています。それが理由です。これを達成する方法があることを願っています。

また、サイトの画像はハードディスクに保存するのと、データベースにBLOBとして保存するのとではどちらが良いでしょうか?結局のところ、スケーラビリティと、より少ない帯域幅消費で画像をロードする方法について考える必要がありますか?

于 2016-03-03T08:21:30.477 に答える