如果代碼本身很大/笨重,那麼您可能仍然希望在可用的情況下使用代理。
既然你只需要執行類匹配,那麼你的映射表可以
ClauseID,
GroupClauseID,
Class (or possibly ClassID)
爲了您的主表,你仍然有PK(ClauseID)和唯一約束(ClauseID,類)。然後,您可以決定是否僅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
然後我走的更遠,並有更多的約束確保類型列非空*值匹配列
砰!將一個唯一的約束(ClauseID,Class)放在主表子句本身上,這樣我就可以從事務表FK中使用它!我腦後只有一個小小的聲音,說這似乎有點誤導,因爲這個獨特約束的類部分實際上是多餘的 - 你會這麼說嗎? – InSane 2010-09-30 07:21:11
@In Sane - 這在某種程度上是多餘的。它只是一個超級密鑰,涵蓋的列數超過了唯一標識一行所必需的數量。但它可以讓你表達更多的完整性規則,這絕對不是多餘的。 – 2010-09-30 07:34:52
是的,你是絕對正確的!我將繼續與您提出的完全一致!謝謝! – InSane 2010-09-30 11:23:16