[解決済み] テーブル構造を共有するマルチテナントデータベースを作成するには?
質問
私たちのソフトウェアは現在 MySQL で動作しています。すべてのテナントのデータは、同じスキーマに格納されています。私たちは Ruby on Rails を使用しているので、どのデータがどのテナントに属しているかを簡単に判断できます。しかし、データが漏洩することを恐れる企業ももちろんありますので、他のソリューションを評価しているところです。
今のところ、3つのオプションを見ています。
- マルチデータベース (各テナントがそれぞれを取得します。顧客ごとに 1 台のサーバーとほぼ同じです)
- マルチスキーマ (MySQLでは利用できません。各テナントが共有データベースで独自のスキーマを取得します。)
- 共有スキーマ (現在のアプローチ。各カラムに識別レコードが追加されるかもしれません)
マルチスキーマは私のお気に入りです (コストを考慮すると)。しかし、新しいアカウントを作成し、移行を行うことは、すべてのスキーマを繰り返し、それらのテーブル/列/定義を変更しなければならないので、かなり苦痛になるようです。
Q: マルチスキーマは、テナントごとにわずかに異なるテーブルを持つように設計されているようですが、私はこれを望みません。テーブル構造がすべてのテナント間で共有される、マルチスキーマ・マルチテナントソリューションを使用できる RDBMS はありますか?
追伸:マルチというのは、超マルチ (10.000 以上のテナント) のようなものを意味しています。
どのように解決するのですか?
<ブロッククオートしかし、企業によっては しかし、中にはデータの漏洩を恐れる企業もあります。 そのため、私たちは他のソリューションを評価しています。 他の解決策を検討しています。
これは残念なことで、顧客は、物理的な分離だけが十分なセキュリティを提供できるという誤解に苦しむことがあります。
というタイトルの興味深い MSDN の記事があります。 マルチテナントデータアーキテクチャ という興味深い記事がありますので、ご覧ください。これは、著者が共有アプローチに対する誤解に対処した方法です。
よくある誤解として 物理的な分離のみが適切なレベルのセキュリティを提供することができる 適切なレベルのセキュリティを提供できると考えられています。しかし を使用して保存されたデータも、強力なデータセキュリティを提供することができます。 て保存されたデータも、強力なデータ安全性を提供することができます。 の安全性を確保することができますが、より高度な設計パターンを使用する必要があります。 より洗練されたデザインパターンを使用する必要があります。
技術的およびビジネス的な考慮点として、この記事では、あるアプローチが他のアプローチよりも適切である可能性がある場所について、簡単な分析を行っています。
<ブロッククオートサービスを提供するテナントの数、性質、ニーズは テナントの数、性質、およびニーズはすべて データアーキテクチャの決定に 影響を与えます。次のような は、より分離されたアプローチに偏るかもしれません。 を選択する場合もあれば、より共有化されたアプローチを選択する場合もあります。 より共有的なアプローチに偏るものもあります。 アプローチに偏るかもしれません。
-
ターゲットとする入居希望者は何人くらいでしょうか?このままでは 推定することはできませんが を推定するのは難しいかもしれませんが 桁数で考えてみてください。 数百人のテナントを対象としたアプリケーションを構築するのですか? 数百人のテナント?数千人?数万人? 数千人?それ以上?テナント数が多ければ多いほど テナントの規模が大きくなればなるほど より共有型のアプローチを検討することになります。 より共有のアプローチを検討することになるでしょう。
-
平均的なテナントのデータが占めるストレージ容量はどの程度になると予想されますか? 一部またはすべてのテナントが非常に大量のデータを保存することを想定している場合 非常に大量のデータを保存するのであれば 分離データベースのアプローチがおそらく がベストでしょう。(実際、データストレージの要件により を採用せざるを得ないかもしれません。 を採用せざるを得ないかもしれません。もしそうなら を設計するのはずっと簡単です。 アプリケーションを最初からそのように設計する方が を設計する方が、後で分離型に移行するよりもずっと簡単です。 後で別々のデータベースのアプローチに移行するよりも、最初からそのようにアプリケーションを設計する方がはるかに簡単です)。
-
平均的なテナントがサポートする同時使用エンドユーザーは何人くらいを想定していますか? 数が多ければ多いほど、より より分離されたアプローチが適切です。 が適切です。
-
テナントごとのバックアップやリストアなど、テナントごとの付加価値サービスを提供する予定ですか? テナントごとのバックアップやリストア機能など 機能など、テナントごとの付加価値サービスを提供する予定はありますか?そのようなサービスは より分離されたアプローチで提供することが アプローチです。
UPDATE 入居予定者数について、さらに更新しました。
予想されるテナントの数 (10k) は、すべてのシナリオではないにしても、ほとんどの場合、マルチデータベース方式を除外する必要があります。10,000 個のデータベース インスタンスを維持し、毎日何百もの新しいインスタンスを作成しなければならないというのは、あまり好ましいこととは思えません。
このパラメーターだけからすると、共有データベース、単一スキーマのアプローチが最も適しているように見えます。テナントごとに約 50 MB を保存し、テナントごとのアドオンを使用しないという事実が、このアプローチをより適切なものにしています。
上で引用した MSDN の記事では、共有データベース アプローチのセキュリティの考慮事項に取り組む 3 つのセキュリティ パターンが言及されています。
アプリケーションのデータ安全対策に自信がある場合、クライアントに サービス レベル アグリーメント を提供することができます。SLA では、保証とは別に、データが危険にさらされないようにするための対策も説明できます。
UPDATE 2: どうやらマイクロソフトの連中はこの件に関して新しい記事を移動/作成したようで、元のリンクはなくなり、これが新しいものです。 マルチテナント型 SaaS データベースのテナントパターン (Shai Kererに感謝)
関連
-
MHAの高可用性構成とフェイルオーバー
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] SQL Server : 列を行に変換する
-
[解決済み] テーブルネーミングのジレンマ:単数形と複数形の名前【非公開
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
plsql-stored-procedure ORA-06550 エラー処理
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] SQL Server : 列を行に変換する
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] Entity Framework VS LINQ to SQL VS ADO.NETでストアドプロシージャを使う?[クローズド]
-
[解決済み] 別のテーブルに一致する項目がない行を選択するにはどうすればよいですか?