4

現在、各ユーザーがデータベースを取得するシステムがあります。現在、1つのデータベースに複数の顧客を収容できるように、1つのデータベースのマルチテナントスキーマに移行しています。単一のクライアントSQL Serverデータベースをシングルデータベースのマルチテナントに変換する

いくつかの質問:

  1. は、現存するマルチテナント変換ツールですか?または、Tenantテーブルを作成し、他のすべてのテーブルにTenantIDを追加するだけのプロセスですか?

  2. データベースと通信するコードをリファクタリングすることなく、マルチテナントを実装する簡単な方法はありますか?

    私たちはOdata.svcを持っています。これはデータベースとのすべての対話を行います(私たちのフロントエンドクライアントは.netフロントエンドからiOSデバイスまで)。フェデレーションを使用してtenantID述語でフィルタリングを実行する方法について少しお読みください。コードをまったく変更する必要はありません。これは可能ですか?

  3. データベースに入居するテナントの数は推奨されていますか?

これは愚かな質問です(文字列の長さはどれくらいですか)。 Azureで最終的なソリューションをホストしている可能性が最も高いでしょう。

誰でも私に教えてくれるアドバイスを楽しみにしています。私たちはプロセスに根本的な変更を加えていますので、私たちがその下にいる前にそのプロセスの上にいたいと思っています。

答えて

2

オートメーション?

理論的には、はるかに簡単(マルチテナントにシングルテナントから行く)この困難な操作を実行することを可能にするツールを作ることが可能であるべきです。しかし、私はそのような製品が限られているため、そのようなツールは存在しないと考えています。 1つが浮かび上がっていれば、とても素敵でしょう。新しいマルチテナントデータベーススキーマを設計することにより

アイデア手動変換について

スタート。 (これは、すべてのシングルテナントデータベーススキーマを、可能であれば共有スキーマとマージすることを意味します)。これは、従来の考慮事項なしに設計された場合と同じようにしたいと思います。

明らかにTenantテーブルが必要です。既存のシングルテナントテーブルの多くは、Tenant_idカラムを参照する必要があります。たとえば、ユーザーがいるテーブルでは、ユーザーとテナントを一意に関連付ける必要があります。簡単Productsテーブルの場合

(主キーとしてProduct_idで)、複合キー(Tenant_idProduct_id)でテーブルを得、Tenant_id列を追加することが可能であるべきです。しかし、最初からアプリケーションを書いたのであれば、テナント参照がないProductテーブルが適切な方法だと信じています。これにより、重複を追加するのではなく、テナントが製品を共有することもできます。 1人のテナントがProduct_id 1,2,3と1,2,3の製品を持っている可能性があるので、同じIDを2回使用することはできないため、テーブルをマージすることはできません。 この問題を解決する1つの方法は、テナントデータベースのすべてのデータをインメモリオブジェクトに読み込んだ後、マルチテナントスキーマにデータを書き込むプログラム(Javaまたは別の高水準言語)を作成することです。このプロセスは、次のテナントデータベースに対して繰り返されます。そうすれば、Product_idの値1,2,3,4,5が得られます。クイックアンドダーティな方法は、各スキーマ内のすべてのID値に、たとえば1,000,2,000などの数値を追加し、矛盾が発生しないように簡単に指を渡すことです。データベース

と通信

コードは、データベースは現在、マルチテナントであるという事実を考慮して、ほとんどのデータベースクエリを書き換える必要があります。これは、特に、あるテナントが別のテナントのデータを使用してしまうようなバグを導入することの意味を考慮して、難しい作業です。しかし、いくつかの手法では、この作業を簡単にすることができます。例えば、Tenant View Filterは、実質的に必要な作業量を減らすことができます。テナント

の数に

リミットIは、マルチテナント構造におけるテナントの数を制限する勧告を見たことがありません。逆に、strength of the multi-tenant approachはスケーラビリティです。今日、データベースサーバーのクラスタを簡単に作成したり、クラウドベースのソリューションを使用して、必要に応じてより多くのハードウェア電源をシームレスに追加することができます。関心の

リンク

2

私の経験では、これを自動化することはできません。非常に重要なデータをインフラストラクチャからデータモデルに移行しています。すべてのクエリは、テナントがすでに確立されていることを前提に書かれています。したがって、すべてのクエリ& SPは、テナント表への参照およびパラメータ化のために変更されます。

各テーブルにtenantIDを追加するだけであればQ1で質問します。それは1つのアプローチですが、私が主張するアプローチではありません。間違ったデータを持っていることにつながります(子供たちが親と同じテナントIDを持っているという強制はありません)。テナントテーブルを追加して、必要なテーブルを慎重に選択する必要がありますそれを参照してください。それはすべてではありません。いくつかはそれを必要としますが、パフォーマンス上の理由からそこに置くこともできます。後者を決定した場合、データを意味のあるものにするために余分なチェックメカニズムが必要になります。あなたは、Oracleにあった場合

は、あなたが行うことができるかもしれませんどのようにそれにいくつかのファイングレイン・アクセスをセッションにtenantIDを詰め込むその後、(まだ上記のすべてをやって)ビューに各テーブルを手直ししてやるですほとんどの詳細をクライアントから隠す。しかし、うまくいくのは難しいし、SQL Serverの類義語がわからない。いくつかの研究に値するかもしれない。

DBをマージする理由は何ですか?クロスDBレポートなどが必要ですか?そうでなければ、シングルテナントには多くの利点があります(複数のアップグレード&ダウンタイムスケジュール、あなたが正規化する方法、シングルテナントデータ抽出/レポートの容易さ、テナントを失ったときの取り外しの容易さに応じてパフォーマンスが向上します)。雲の解&単一のテナントがここであなたの好意で潜在的に働く可能性があります。

関連する問題