所以我有两张桌子:
Requests
--------
Id
RequestSchemeId
ReceivedByUserId
ForwardedRequests
-----------------
Id
RequestId (FK to Id column of Requests Table)
ForwardedToUserId
现在,一条业务规则表明用户只能收到一个特定RequestScheme的请求。所以我为RequestSchemeId + ReceivedByUserId创建了一个UniqueKey约束。哪个应该解决我的问题
第二个业务规则是,只有当转发用户在任何其他用户的同一方案下没有转发请求时,才能将请求转发给其他用户。
我能想到的解决方案是ForwardedRequests表中的RequestSchemeId列,它只是Requests表相关行中值的副本,然后在ForwardedToUserId + RequestSchemeId上添加唯一约束。
这是正确的做法吗?如果不是什么?
如果在后者中创建新行,如何从Forquests to ForwardedRequests获取RequestSchemeId的值? UDF是我看过的东西,但它似乎有一些陷阱,我需要标准/推荐的方式来做到这一点,而不是片状。
答案 0 :(得分:2)
您可以在视图上使用唯一索引来强制执行此约束。示例如下。
CREATE TABLE dbo.Requests
(
Id INT PRIMARY KEY,
RequestSchemeId INT,
ReceivedByUserId INT,
UNIQUE (RequestSchemeId, ReceivedByUserId)
)
CREATE TABLE dbo.ForwardedRequests
(
Id INT PRIMARY KEY,
RequestId INT REFERENCES Requests(Id),
ForwardedToUserId INT
)
GO
CREATE VIEW dbo.ForwardedUserRequestSchemes
WITH SCHEMABINDING
AS
SELECT ForwardedToUserId,
RequestSchemeId
FROM dbo.ForwardedRequests FR
JOIN dbo.Requests R
ON R.Id = FR.RequestId
GO
CREATE UNIQUE CLUSTERED INDEX ix
ON dbo.ForwardedUserRequestSchemes(ForwardedToUserId, RequestSchemeId)