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) はそれを行わないことを知っているので、別のサイトからデータを返すことになります!