我已经设计了下表。
现在新要求是我需要为所有人显示一些类别 租户。此外,每个租户都应该能够添加新的类别 主类别。所以他们可以看到所有主人+他们的具体 类
租户表
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的新行 表。这意味着我在查找表中创建重复条目。任何 建议实现新要求?
答案 0 :(得分:2)
因此,租户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
-
除非您存储创建类别的人(用于审计目的),否则这应该有效。如果没有,我误解了你的问题,你应该澄清你想要做的事情。