1

私は、小規模なチームを編成して作成した SAAS プロジェクトに真っ先に飛び込もうとしています。ほとんどの部分で、すべての機能に関する計画が既に立てられていますが、データベース アーキテクチャとセキュリティの問題について考え始める必要があるところまで来ています。

何百人ものユーザーがいる可能性があるため、通常の Web アプリケーション プロジェクトとは異なるセキュリティ上の懸念はありますか?

データベースに関する限り、私はデータベース設計に関する投稿を 1 日中読んでおり、すべてを 1 つのデータベースで行おうと思っていますが、遅くなるのではないかと思っています。30,000 レコードを含む "clients" テーブルがあるとします。顧客ごとにデータベースを実行するよりも読み込みが遅くなりませんか?

また、サインアップとMY顧客情報は、実際のSAASアプリと同じデータベースに保存する必要があります. 言い換えれば、私のサイトにアクセスして無料試用版にサインアップしたユーザーは 1 つのデータベースにアクセスし、そのユーザーのチームやクライアントなどはすべて実際の製品データベースにアクセスする必要がありますか?

これに飛び込む前に、他に考慮すべきことはありますか?Codeigniter フレームワークでビルドします。

4

3 に答える 3

0

SaaS での私の経験では、アクセスごとに同じデータベースにデータを保持するのが最善です。MySQL を使用している場合、データベースごとに一度に開くことができるテーブルの数に制限があります。多数のテーブルを備えた多数のデータベースを使用している場合、メモリと I/O の問題が後で発生します。クライアントごとに 1 つのデータベースがあり、10 クライアント (それぞれ 30 ~ 40 テーブル) の後で 4GB サーバーのメモリ制限に達していた 1 つのプロジェクトを覚えています。

ウィリアムが言ったように、可能であれば過度の正規化は避けたいと思います。たとえば、各クライアントがサイトごとに異なる構成を持つ可能性がある users テーブルなど、オブジェクトのプロパティに可能な場合は EAV テーブルを実装する必要があります。ユーザー ロール、ユーザー グループなどについても同様です。e コマース機能を構築している場合は、間違いなく EAV を使用する必要があります。通常の Web サイトの場合、3NF は問題ありません。ほとんどの反復データは分離され、外部キーでリンクされるため、20 ~ 30 列のテーブルはありません。SaaS アプリケーションの場合、追加のアプリケーションの柔軟性を可能にするために、4NF の BCNF にステップアップする必要がある場合があります。

サイト/アプリケーションの決定:

使用する URL に対して正しい Web サイトを表示することが非常に重要です。最も単純な形式は、XML/JSON ファイルを使用し、要求に応じて XML ファイルをスキャンして URL を照合することです。新しいサイトごとにトラフィックが直線的に増加することがわかるため、可能な限りメモリにキャッシュします。3 つの Web サイトがある場合、1 つのアプリケーションへのトラフィックは、3 つの異なるアプリケーションに分散する場合の 3 倍になります。

安全:

必要なセキュリティのレベルによって異なります。SSL 証明書が必要な場合、同じ IP からすべてのサイトをホストする場合は、共有サーバー証明書を購入する必要はありません。各サイトで独自の SSL が必要な場合は、サイトごとに異なる IP に対応する必要があります。その場合、URL => IP をマップする必要があります。

ユーザーベースのセキュリティは、正しいサイトを表示することと同じくらい重要です。インジェクションベースの攻撃を検出していることを確認する必要があります。組み込みの CI 関数を活用できますが、安全のために、独自のフィルタリングを行う必要があります。整数が実際に整数であることを確認してください。これを実現するために、追加のライブラリを CI に追加できます。ACL はSaaS アプリケーションでは非常に重要です。なぜなら、誰が何を閲覧できるかを制限し、各人を自分のサイトのコンテンツに制限する必要があるからです。概念化するのは簡単ですが、実装するのは難しいため、正しく理解するための最大の開発タスクと見なす必要があります。ACL を設計し、設計をテストし、テスト ケースを作成して、機能する場合は実装します。

パフォーマンス:

CI は、パフォーマンスの点でかなり優れており、メモリ フットプリントが少なく軽量です。データベース、ファイル、APC、Memcache などのキャッシュを可能な限り活用する必要があります。データベース キャッシュは常にファイル キャッシュよりも高速ですが、データベース サーバーへのソケット/TCP 要求が増えることに注意してください。 . DB サーバーにボトルネックがあると、サイトのパフォーマンスに影響します。

パフォーマンスに関して私がお勧めすることの 1 つは、いくつかの異なる Web サーバーを使用して、実行するハードウェアで負荷テストを行うことです。適切なオプションは、Apache、Nginx、LiteSpeed です。以前に Apache と Nginx を使用したことがあります。どちらも特定の状況下でうまく機能し、適切に調整すれば、大量のトラフィックを簡単に処理できます。Nginx の構成は Apache とは異なるため、htaccess ルールを Nginx 形式で記述し、サイト構成に保存する必要があることに注意してください。また、suexec の代わりに php-fpm を使用します。Apache を使用する場合は、ルート ディレクトリで .htaccess ファイルを使用するのではなく、htaccess ルールがサイト構成ファイルに保存されていることを確認してください。その理由は、ファイル統計が I/O 要求を作成し、多くの I/O 要求が最終的にボトルネックを作成するためです。

可能であれば、アプリケーション レベルのキャッシュを 100% 使用します。ただし、各クライアント サイトで正しくキャッシュされた情報を取得できるように、キー インデックスについて前もって計画を立ててください。良い方法は、サイト名をハッシュするか、URL をキー インデックスの一部として使用することです (例: www_joeblogs_com_somekeyasdasd)。一部の CMS アプリケーション (Joomla) はそれを行わないことを知っているので、別のサイトからデータを返すことになります!

于 2013-09-07T02:50:34.433 に答える
0

SaaS アプリケーションに単一のデータベースを使用する場合に考慮すべき重要な点の 1 つ:

  • accountId をすべてのテーブルに追加します。
  • データベースへのすべてのクエリでは、常に accountid を使用してください。そうしないと、アカウント間でデータを混同する可能性があります。

また、試用アカウントと有料アカウントに別々のデータベースを用意することを決定する前に、試用アカウントが有料アカウントに切り替わったときに何が起こるかを考えてください。彼らは間違いなくすべてのデータを保持したいと思うでしょう。すべてのデータをトライアル DB から有料 DB に移動しますか?

于 2013-05-14T17:01:31.733 に答える