2

SAAS ベースのモデルの STANDARD および USER SPECIFIC レコードのデータ モデルの設計。

私の SAAS ベースのアプリケーションには、ユーザーとそれに関連付けられた (1 対 1) ロールがあります。テナントは、会社に固有の独自の役割を作成し、ユーザーに割り当てることができます。また、SYSTEM には、テナントが使用できる標準的なロールがいくつか用意されています。SYSTEM 定義の標準ロールは、すべてのテナントに共通です。

次のように ROLE および COMPANY テーブルがあります。

表: 会社

    COMPANY_ID   |  COMPANY_NAME    
    100          |  Acme Inc.
    101          |  E Technologies.

表: 役割

    ROLE_ID |   COMPANY_ID  | ROLE_NAME         | IS_STANDARD_ROLE
    1       |               | ADMINISTRATOR     |Yes
    2       |               |MANAGER            |Yes
    3       |   100         |MyAdmin            |No
    4       |   100         |MySpecialist       |No
    5       |   101         |Supervisor         |No

ここに ROLE.COMPANY_ID 参照 COMPANY.COMPANY_ID があります

標準ロールとユーザー定義ロールの両方を同じテーブルに収容し、注釈付きの Hibernate 3.0 を複雑にすることなくプルできるようにする最善の方法を見つけようとしています。

ここに私が用意している代替案があります。

  1. 上記と同じテーブルに標準ロールと顧客定義ロールの両方を配置し、ROLE.COMPANY_ID フィールドを (mysql が許可する場合) 標準の場合は空白のままにすることができます。しかし、課題は、hibernate3.0 が ROLE.COMPANY_ID=100 または ROLE.COMPANY_ID= の両方を取得することです。

  2. company テーブルに SYSTEM というダミーの会社を定義し、すべての標準/SYSTEM レコードを SYSTEM という Company に参照させることができます。再び aootations を使用して hinnernate 3.0 で OR を使用してレコードをプルするという同じ課題。カスタムHQLなしでアノテーションを使用してhibernate 3.0でこのOR句を実行する方法がわからない? どういうわけか、チームはデータベース内のダミーの会社レコードのアイデアが好きではありません.

  3. 各テナントの標準レコードのコピーを作成し、それらを独自の company_id に割り当てることができます。しかし、ここでの変更点は、各テナントに少なくとも 80 の標準レコードを用意し、1000 のフリー トレイル テナントを予想する場合、最終的に 80,000 レコード スペースを割り当てることになります。このデザインについて何か考えはありますか?クローバーオプションではありませんが、オプションが残っていない場合はこれを選択してください..

代わりに、システム レコードであるため、すべてのテナントが共有できる標準レコードのコピーを 1 つ用意することをお勧めします。

プログラマビリティ、メンテナンス、SAAS スタートアップ用の DB スペースの観点から、パーフェクト氏の設計について何か考えはありますか?

4

2 に答える 2

0

いくつかのオプションを見てきました。

私が推奨するのは、標準ロール用と顧客定義ロール用の 2 つのテーブルを用意することです。これは微妙ですが、基本的には、すべてのテナントに共通のロールとテナントのカスタム ロールという 2 つの異なるエンティティです。これらは最終的に属性および/または関係が異なる可能性があります。

もう 1 つは、最初の 2 つの提案のように、それらを 1 つの表にまとめることです。これは本質的に同じ解決策です。これが気に入らない理由は、COMPANY_ID の定義をオーバーロードしているからです。ほとんどの場合、列定義をオーバーロードすると後悔します。

いずれにせよ、次のいずれかの方法で選択します。

1) 2 つのセットを結合するストアド プロシージャを Hibernate に呼び出させます。

2) 2回コールして、あなたのコレクションに集めてください。標準ロールは揮発性ではないため、少なくとも標準ロールをキャッシュします。したがって、これによりパフォーマンスが低下することはありません。

于 2014-03-29T14:50:32.840 に答える