2011-04-22 37 views
1

我有以下(簡化)結構,它允許我跟蹤已分配給單元的設備。由於設備只能位於表格中的單元格中,因此我創建了一個約束條件,指出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約束關係)

我是否需要從代碼,事務,不同模型中強制執行這些關係?

也許有一種我不知道的設計模式可以幫助存儲這樣的歷史數據?

+0

你說過:「這個約束確保我永遠不會將同一件裝備添加到細胞兩次。」但它允許您將同一件設備添加到多個單元。這是你的意圖嗎? – 2011-04-22 11:25:00

+0

不幸的是有些情況下允許。例如,有一個烤箱(一個非常大的烤箱)可以供應多個電池。由於烤箱「校準」,因此需要對其進行跟蹤。 – Hucker 2011-04-22 11:34:38

+0

我不會說這是不幸的。我只是說這就是業務的運作方式。 – 2011-04-22 12:51:04

回答

1

因爲我不知道是什麼設備細胞對你意味着什麼,我可能是大錯特錯這裏。

但是在我看來,重要的信息出現在「工作單號使用什麼設備?」的問題中。日期並不真的給你提供這些信息。但是這個(空碼)結構可能。

create table work_order_equpiment (
    idEquipment integer not null, 
    idCell integer not null, 
    foreign key (idEquipment, idCell) references CellEquipment (idEquipment, idCell), 
    work_order_number integer not null references workorders (work_order_number), 
    primary key (idEquipment, idCell, work_order_number) 
); 

這使得在給定工單上使用設備變得非常簡單。要獲取給定日期使用的設備,請加入CellEquipment,work_order_equipment和工作單,並查看工單表中的日期。

+0

我認爲這會增加數據庫的冗餘度,儘管您可能無法看到我所說的內容。我們目前記錄生產中的每個相關步驟,誰(員工),什麼(工作順序),如何(工作步驟),何時(時間戳),何處(工作單元)。如果電池/設備表可以通過日期瞭解,我可以通過僅爲每件設備添加2個日期來查找數據。如果我按你的建議做,我會有數十或數十萬的新條目(許多步驟*許多機器)。 – Hucker 2011-04-22 11:50:19

+0

你的建議確實具有跟蹤工作單元當前狀態的好處。我提出的解決方案可以跟蹤不是必需的工作單元的完整歷史(可能不會)。 – Hucker 2011-04-22 11:55:11

+0

「如果電池/設備表可以通過日期瞭解,我可以通過僅爲每件設備添加2個日期來查找數據。」我不這麼認爲。我認爲您需要爲每個工單添加一行,包括這兩個日期。而且我也沒有看到任何明顯的方式讓數據庫說這*件設備是用於*工單。它只能說*這件*設備是用於那個*日期的。在大多數情況下不是一回事,但在你的情況下可能是一樣的。 – 2011-04-22 12:54:54