2011-04-22 134 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