我有以下(簡化)結構,它允許我跟蹤已分配給單元的設備。由於設備只能位於表格中的單元格中,因此我創建了一個約束條件,指出idEquipment和idCell在表格中必須是唯一的。SQL Server 2008數據庫中字段的複雜約束
CREATE TABLE [dbo].[CellEquipment](
[idEquipment] [int] NOT NULL,
[idCell] [int] NULL,
CONSTRAINT [PK_CellEquipment] UNIQUE NONCLUSTERED
(
[idEquipment] ASC,
[idCell] ASC
)
這個約束確保我永遠不會將兩件相同的設備添加到一個單元格中。
所以現在我的任務是保存歷史信息。我需要能夠拉起工作單,查看它的日期,然後找到該工單上使用的設備。一個解決方案是像這樣添加日期信息到表格:
CREATE TABLE [dbo].[CellEquipment](
[idEquipment] [int] NOT NULL,
[idCell] [int] NULL,
[DateAdded] [datetime] NULL,
[DateRemoved] [datetime] NULL,
)
現在我的約束從上面被打破。 idCell/idEquipment
不再是唯一的,因爲設備可以被移除並重新添加到單元中。現在我有一些棘手的日期問題需要解決。爲了確保數據的完整性以下必須爲數據庫更改爲真:
idCell/idEquipment are unique (like before) OR
idCell/idEquipment's new DateAdded doesn't fall between a DateAdded/Removed OR
idCell/idEquipment's new DateRemoved doesn't fall between a DateAdd/Removed or
idCell/idEquipment's doesn't have a record with DateRemoved=NULL
CHECK約束不必退出這個功能和獨特的指標約束不能做到這一點無論是動力。順便提一下,可以創建一個檢查約束來確保DateAdded < DateRemoved
(以及其他NULL/NOT NULL約束關係)
我是否需要從代碼,事務,不同模型中強制執行這些關係?
也許有一種我不知道的設計模式可以幫助存儲這樣的歷史數據?
你說過:「這個約束確保我永遠不會將同一件裝備添加到細胞兩次。」但它允許您將同一件設備添加到多個單元。這是你的意圖嗎? – 2011-04-22 11:25:00
不幸的是有些情況下允許。例如,有一個烤箱(一個非常大的烤箱)可以供應多個電池。由於烤箱「校準」,因此需要對其進行跟蹤。 – Hucker 2011-04-22 11:34:38
我不會說這是不幸的。我只是說這就是業務的運作方式。 – 2011-04-22 12:51:04