我有以下(简化)结构,它允许我跟踪已分配给单元的设备。由于设备只能位于表格中的单元格中,因此我创建了一个约束条件,指出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