如果代码本身很大/笨拙,那么您可能仍想使用可用的代理。
由于您只想强制执行类匹配,因此您的映射表可能是
ClauseID,
GroupClauseID,
Class (or possibly ClassID)
对于您的主表,您仍然有 PK (ClauseID) 和唯一约束 (ClauseID, Class)。然后,您可以决定是只使用 FK (ClauseID,Class) 还是在映射表和每个主表之间有两个 FK(实际上,您会说一个 FK 是外键引用,而另一个是用于执行你的规则)。
我在我的一个数据库中有一个类似的设置(想想调查系统):
CREATE TABLE [dbo].[DataItems](
[DataItemID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[TypeRequired] [varchar](10) NOT NULL,
[Name] [varchar](50) NOT NULL,
/* Other Columns */
CONSTRAINT [PK_DataItems] PRIMARY KEY NONCLUSTERED
(
[DataItemID] ASC
),
CONSTRAINT [UX_DataItems_ClientAnswerFKTarget] UNIQUE CLUSTERED
(
[DataItemID] ASC,
[TypeRequired] ASC
),
CONSTRAINT [UX_DataItems_Name] UNIQUE NONCLUSTERED
(
[Name] ASC
)
)
CREATE TABLE [dbo].[ClientAnswers](
[ClientAnswersID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[ClientID] [uniqueidentifier] NOT NULL,
[DataItemID] [uniqueidentifier] NOT NULL,
[TypeRequired] [varchar](10) NOT NULL,
[BoolValue] [bit] NULL,
[IntValue] [int] NULL,
[CharValue] [varchar](6500) NULL,
[CurrencyValue] [int] NULL,
[DateValue] [datetime] NULL,
/* Other Columns */
CONSTRAINT [PK_ClientAnswers] PRIMARY KEY CLUSTERED
(
[ClientID] ASC,
[DataItemID] ASC
)
)
GO
ALTER TABLE [dbo].[ClientAnswers] ADD CONSTRAINT [FK_ClientAnswers_DataItems] FOREIGN KEY([DataItemID],)
REFERENCES [dbo].[DataItems] ([DataItemID])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[ClientAnswers] ADD CONSTRAINT [FK_ClientAnswers_DataItems_TypesMatch] FOREIGN KEY([DataItemID],TypeRequired)
REFERENCES [dbo].[DataItems] ([DataItemID],TypeRequired)
GO
然后我走得更远,有更多的约束确保类型列与非空 *Value 列匹配