sql >> データベース >  >> RDS >> PostgreSQL

マルチテナントアプリケーション用のPostgreSQLのスキーマ

    必ずしもパフォーマンスが低下するわけではありません。記事で説明されているように、アプリケーションの設計とワークロードに応じて、スキーマのアプローチを改善または悪化させる特定の条件があります。 「テナントスキーマ」アプローチと「共有テーブル」アプローチのトレードオフについて説明します。

    テナントスキーマ かなり大きなテナントが比較的少ない場合に最適です。この例は、有料サブスクリプションユーザーのみを使用する会計アプリケーションです。それをあなたにとってより良いパフォーマンスのオプションにするものは次のとおりです:

    • それぞれに大量のデータがある少数のテナント
    • テナントごとに多くのテーブルがない比較的単純なスキーマ
    • 一部のテナントのスキーマをカスタマイズする必要があります
    • テナントごとのデータベースロールを利用する機能
    • テナントのデータをあるサーバーから別のサーバーに移行するための要件
    • テナントごとにクラウド内の専用アプリサーバーを起動する機能

    パフォーマンスの低いオプションとなるものは次のとおりです。

    • それぞれのデータが非常に少ない多数のテナント
    • 各リクエストが任意のテナントになる可能性がある接続へのステートレスアプローチ
    • すべてのテーブル(ActiveRecordなど)のメタデータをキャッシュするクライアントライブラリまたはorm
    • 効率的で高性能な接続プールやキャッシュの要件
    • 数千のテーブル間で拡張性が低いVACUUMおよびその他のPostgreSQL管理操作の問題。

    テナントスキーマが移行/スキーマ変更に適していないかどうかは、実際にはそれらをどのように行っているかによって異なります。ユニバーサルスキーマ変更を迅速に展開するのは良くありませんが、テナント間で段階的に展開するようにスキーマ変更を展開するのには適しています。

    共有テーブル テナントが多く、多くのテナントのデータが非常に少ない状況に適しています。この例は、無料のアカウントを許可し、したがって何千もの放棄されたアカウントを持つソーシャルメディアモバイルアプリケーションです。共有テーブルモデルを有益にする他のことは次のとおりです。

    • すべての接続で同じプールを使用できるため、接続プールに適しています
    • テーブルの総数が少ないため、PostgreSQLの管理に適しています
    • テーブルの「セット」は1つしかないため、移行やスキーマの変更に適しています

    共有テーブルの主な欠点は、アプリケーション層のすべてのクエリにテナントフィルター条件を追加する必要があることです。また、次の理由で問題があります。

    • テナントフィルタがクエリプランニングを破棄するため、多くのテーブルを結合するクエリのパフォーマンスが低下する可能性があります
    • テーブルが1億行に増えると、特定のパフォーマンスとメンテナンスの問題が発生する可能性があります
    • テナント固有のアプリケーションの変更やスキーマのアップグレードを行う方法はありません
    • サーバー間でテナントを移行するのに費用がかかる

    したがって、どのモデルが「パフォーマンスが優れている」かは、どのトレードオフが最も悪い結果をもたらすかによって異なります。

    実際のデータが共有テーブルに保存されるハイブリッドモデル「tenant-view」もありますが、各アプリケーション接続はセキュリティバリアビュー データを表示します。これには、各モデルのトレードオフがいくつかあります。主に、テナントスキーマモデルのセキュリティ上の利点と、両方のモデルのパフォーマンス上の欠点のいくつかがあります。




    1. mysql recursive(tree)親子カテゴリ

    2. Java/Mysqlサーバープログラムでの電子メールアカウントのパスワードストレージ

    3. 'ステートメントのsql'にパラメータを渡す方法は?

    4. データベースに保存されているパスで画像を表示するにはどうすればよいですか?