在主表中添加客户特定记录

时间:2013-02-10 10:39:52

标签: sql-server database sql-server-2008 database-design multi-tenant

我已经设计了下表。

  

现在新要求是我需要为所有人显示一些类别   租户。此外,每个租户都应该能够添加新的类别   主类别。所以他们可以看到所有主人+他们的具体   类

租户表

TenantId
Name

群组表

GroupId
Name

类别表

CategoryId
Name

TenantXCategory

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
  

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

2 个答案:

答案 0 :(得分: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
;

答案 1 :(得分: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

-

除非您存储创建类别的人(用于审计目的),否则这应该有效。如果没有,我误解了你的问题,你应该澄清你想要做的事情。