26

これが「サービスとしてのソフトウェア」カテゴリ全体に分類されることに気づいていなかったので、用語の一部が少し間違っている可能性があるため、ここで私に耐える必要がありますが、ここではそうです。

クライアント用のメンバーシップシステム(PHP)を開発しました。現在、サブドメイン(または独自のドメイン)を提供する、他のクライアント向けの完全にホストされたソリューションとして提供することを検討しています。

データストレージに関する限り、私がテーブルに持っていると思われるオプションは次のとおりです。

オプション1-すべてを1つの大きなデータベースに格納し、それを必要とするテーブルに「client_id」フィールドを設定し(適用されるテーブルは約30個あります)、メイン設定と詳細を格納する「clients」テーブルを設定します、などとそれらにマップするドメイン。次に、個々のクライアントIDを含むグローバルにアクセス可能な変数を設定します。client_id列を確認するために、すべてのクエリを変更する必要があることは明らかです。

オプション2-「共有参照」テーブルと「クライアント」テーブルを含むマスターテーブルを用意します。次に、他のデータベースの「ブロック」を作成します。各データベースには、たとえば10個のクライアントが含まれています。クライアントは、クライアントIDのプレフィックスが付いた独自のデータベーステーブルを取得します。これにより、何かが本当にうまくいかなかった場合に他のクライアントデータが表示されないように保護するためのセキュリティが少し追加されます。

オプション3-オプション2とまったく同じですが、クライアントごとに1つのデータベースがあり、他のクライアントから完全に分離されており、理論的には、1つのクライアントのテーブルがハッキングされたり、その他の方法で破損したりしても、もう少し保護されます。他の誰かに影響を与えます。最大の欠点は、新しいクライアントを展開するときに、データベース全体、ユーザーとパスワードを設定する必要があることです。これにより、かなりのオーバーヘッドが発生する可能性があります。または、全員が1人でいる場合とほぼ同じです。データベース?

いくつかのポイントも-これらのクライアントの一部には5000以上の「顧客」とそれらの顧客のすべての詳細があります-これがオプション1が少し問題になる理由です-100のクライアントがある場合、それは等しい可能性があります1つのテーブルに50万行を超える行。

顧客データ(および支払い情報)のセキュリティが重要な状況では、オプション3が最善の方法であると私は考えていますか。私が持っていた推奨事項から、「簡単」という理由でオプション1を選択すると言う人もいますが、実際にはそのようには見えません。クライアントが独自のデータベースを持っていれば、クライアントをはるかに簡単に移動できるので、これは将来の潜在的なボトルネックだと思います。

(FYIシステムはMySQLをベースにしたPHPです)

4

3 に答える 3

18

オプション3が最もスケーラブルです。最初はもっと複雑に見えるかもしれませんが、完全に自動化することができ、将来の頭痛の種を減らすことができます。複数のサーバーにクライアントデータベースを配置してパフォーマンスを向上させることで、より効率的に拡張することもできます。

于 2012-11-10T21:26:07.397 に答える
2

私はOzzyに同意します-私はオンラインデータベース製品のためにこれを行いました。基本的に栄光のユーザーテーブルを持つマスターデータベースが1つありました。各顧客は独自のデータベースを持っていました。これの優れた点は、1つの顧客データベースをサーバーAからサーバーBに簡単に移動でき[mysql]、コマンドラインツールを使用してピンチで移動できることです。また、大きなテーブルのメンテナンスを行う場合、インデックスを削除/追加すると、アプリケーションが実際に台無しになる可能性があります。特に、インデックスを追加すると、テーブルがロックされます[mysql]。それはすべての人に影響を及ぼします。おそらく、データベースが小さいほど、これに対する影響を受けにくく、スキーマレベルの変更をロールアウトする必要がある場合に、より多くのオプションがあります。私は柔軟性が好きです。

于 2013-04-03T16:41:56.693 に答える
1

何年も前にPHPでSaaSアプリケーションを構築するためのプラットフォームを設計したとき、3番目のオプションであるマルチテナントコードシングルテナントデータベースを選択しました。

私の経験では、これが最もスケーラブルなオプションですが、コードの更新、DBスキーム、テナントへのアプリケーションの有効化などの際に変更を伝達するための一連のスクリプトも必要です。

そのため、私の努力の多くは、コンポーネントベースの拡張可能なエンジンを構築して、これらすべてのタスクを完全に自動化し、システム管理を最小限に抑えることに費やしました。3番目のオプションを採用する場合は、このようなアーキテクチャを構築することを強くお勧めします。

于 2015-05-20T17:41:32.583 に答える