2

次のテーブルは既に設計されています。

新しい要件は、すべてのテナントのカテゴリを表示する必要があることです。また、各テナントは新しいカテゴリをマスター カテゴリに追加できる必要があります。そのため、すべてのマスターと特定のカテゴリを確認できます

テナント表

TenantId
Name

グループテーブル

GroupId
Name

カテゴリー表

CategoryId
Name

テナント X カテゴリ

TenantId
CategoryId

それを達成するために、上記の表でどのような変更を加えることができますか? 私はこれを以下で試しました

カテゴリ表を以下に変更。

カテゴリー表

CategoryId
Name
TenantId NULL // This indicates tenant specific category

TenantId と Name の一意のキーを追加します

次に問い合わせた

SELECT *
  FROM Category where TenantId = 1
  UNION
SELECT *
  FROM Category where TenantId IS NULL

しかし問題は、2 つのテナントが特定のカテゴリのみを表示したい場合、Category テーブルに他の TenantId を含む新しい行を追加する必要があることです。これは、ルックアップ テーブルに重複するエントリを作成していることを意味します。新しい要件を達成するための提案はありますか?

4

2 に答える 2

2

したがって、テナント A には次のように表示されます。

  • (1) マスターカテゴリー、
  • (2)テナントAに属するカテゴリー、
  • (3) 別のテナントに属し、その別のテナントが明示的にテナント A に表示を許可したカテゴリ

現在のスキーマは要件を満たしているようです。特に、最初の 2 つのルールはTenantId、テーブル内の null 許容列を使用して実際に実装できCategoryます。ここで、NULL はマスター カテゴリを表し、NULL 以外の値はカテゴリの作成者/所有者を参照するため、テナント固有のカテゴリを示します。 . OwnerTenantId(わかりやすくするために、列の名前を のように変更するかもしれませんが、それは私だけかもしれません。)

マスター カテゴリのみ、または指定したテナントに属するカテゴリのみを取得するには、質問に投稿したクエリまたはこれを使用できます (クエリと同じ実行プランが得られる可能性があります)。

SELECT
  CategoryId,
  CategoryName,
  CASE
     WHEN TenantId = @TenantId    THEN 'Mine'
     WHEN TenantId IS NULL        THEN 'Master'
  END AS Ownership
FROM Category
WHERE TenantId = @TenantId
   OR TenantId IS NULL
;

3 番目のルールを実装するには、テーブルを使用して、最初の 2 つのルールを使用してアクセスできるカテゴリに加えTenantXCategoryて、テナントが使用できるカテゴリを格納できます。つまり、テナント M がテナント N にテナント M のカテゴリの一部を表示することを許可した場合、カテゴリの ID がテナント N の ID とともに挿入されます。TenantXCategory

したがって、特定のテナントで利用可能なすべてのカテゴリを照会するには、次のようにします。

SELECT
  c.CategoryId,
  c.CategoryName,
  CASE
     WHEN c.TenantId = @TenantId    THEN 'Mine'
     WHEN c.TenantId IS NULL        THEN 'Master'
     WHEN tc.CategoryId IS NOT NULL THEN 'Someone else''s'
  END AS Ownership
FROM Category c
LEFT JOIN TenantXCategory tc
  ON tc.CategoryId = c.CategoryId AND tc.TenandId = @TenantId
WHERE c.TenantId = @TenantId
   OR c.TenantId IS NULL
   OR tc.CategoryId IS NOT NULL
;
于 2013-02-11T08:33:40.850 に答える
1

カテゴリを追加する場合は、マスターカテゴリとユーザー定義カテゴリを区別するための識別子が必要です。

CREATE TABLE CategoryType (
    [CategoryTypeID] int primary key identity,
    [Description]
)

CREATE TABLE Category (
    [CategoryID] int primary key identity,
    [CategoryName] nvarchar(max)
    [CategoryTypeID] int
)

/*  CategoryTypes
    1    Master
    2    User-defined  */

特定のテナントのカテゴリを表示する

SELECT *
FROM TenantXCategory txc
JOIN Tenant t
    ON t.TenantID = txc.TenantID
JOIN Category c
    ON c.CategoryID = txc.CateoryID
WHERE t.TenantName = N'user1909604'
    -- AND c.CategoryTypeID = 1 -- Only show master categories
    -- AND c.CategoryTypeID = 2 -- Only show user-defined categories
    -- AND c.CategoryID in (1, 2) -- Only show specific categories

ユーザーのカテゴリを追加するには、そのカテゴリを相互参照テーブルに保存します。カテゴリが存在しない場合は、最初にカテゴリテーブルに追加する必要があります。

INSERT TenantXCategory (TenantID, CategoryID)
SELECT @TenantID, @CategoryID

-

カテゴリを作成した人を(監査目的で)保存していない限り、これは機能するはずです。そうでない場合、私はあなたの質問を誤解しました、そしてあなたはあなたが何をしようとしているのかを明確にするべきです。

于 2013-02-10T16:01:12.253 に答える