【发布时间】:2011-04-22 09:30:35
【问题描述】:
我有以下(简化的)结构,允许我跟踪已分配给单元的设备。由于设备只能在表格中的单元格中出现一次,因此我创建了一个约束,规定 idEquipment 和 idCell 在表格中必须是唯一的。
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
检查约束没有能力解决这个问题,唯一索引约束也不能做到这一点。顺便说一句,可以创建一个检查约束以确保 DateAdded < DateRemoved(以及其他 NULL/NOT NULL 约束关系)
我是否需要从代码、事务、不同的模型中强制执行这些关系?
也许有一种我不知道的设计模式可以帮助存储此类历史数据?
【问题讨论】:
-
你说,“这个约束确保我永远不会将同一件设备添加到一个单元格中两次。”但它允许您将相同的设备添加到多个单元。这是你的意图吗?
-
不幸的是,有些情况是允许的。例如,有一个烤箱(一个非常大的烤箱)为多个电池提供服务。由于烤箱已“校准”,因此需要对其进行跟踪。
-
我不会说这很不幸。我只想说这就是业务的运作方式。
标签: sql-server-2008 unique-constraint