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

但问题是如果两个租户只想查看特定类别,我需要在 Category 表中添加一个带有其他 TenantId 的新行。这意味着我正在查找表中创建重复条目。有什么建议可以实现新要求吗?

4

2 回答 2

2

因此,租户 A 可能会看到:

  • (1) 主类别,
  • (2) 属于租户 A 的类别,
  • (3) 属于另一个租户并且另一个租户明确允许租户 A 看到的类别

您当前的架构似乎满足要求。特别是,前两个规则确实可以使用表TenantId中的可空列来实现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
;

要实施第三条规则,除了可以使用前两条规则访问的类别之外,您还可以使用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 回答