2013-10-31 24 views
0

我无法找到解决构建独特索引表的问题的方法。独特索引的故障构造表

我有哪里的项目被保留一个表,但是也有一些用于弥补

ItemID - INT 
Date - DATE 
TimeOfDay - INT (morning = 1, afternoon = 2) 
ReservationStatus - VARCHAR (expired, cancelled, confirmed, cancelled by admin) 

的问题是与reservationStatus字段进行多个领域。系统应该允许多行被取消,但只有一行被确认或过期(应用程序从确认变为过期)。我出来的想法,任何帮助将不胜感激。

编辑:

全表结构

ReservationID - PK Auto-incrementing Integer 
SubItemID - INT FK 
MemberID - INT FK 
Date - DATE 
TimeOfDay - INT 
ReservationStatus - VARCHAR 

SubItemID,日期的TimeOfDay,更改为reservationStatus必须是唯一的:一个以上的成员不能预留相同的子项下午在同一天。

我通过我的应用程序验证了这一点,但是我想通过表结构来确保完整性(在程序员错误的情况下)。

+0

这是整桌吗?是否有与每行相关的用户ID?你是否考虑过使用ENUM来保留状态而不是VARCHAR? – ModulusJoe

+0

_“对于同一个'ItemID',系统应该允许多行被取消”_?另外,桌子的PK是什么? – geomagas

+0

@acyclic - 我省略了其他字段,请参阅编辑。请原谅我,但我对ENUM不熟悉,现在将对此进行研究。 – Raythe

回答

2

要在此表结构中实现具有唯一键约束的业务规则,您将不得不做一些稍微不自然的事情。

您可以添加一个名为CancellationCode的列。把它变成一个INT。保留该列中的值0意味着活动/过期,并将其作为默认值。然后,如果您取消预订,请将唯一的非零值分配给该行中的取消代码。您可以在该行的行中使用您的ReservationID值,或者可以使用具有其自己唯一标识的“取消”表。

您可以保留您的ReservationStatus列,以便您可以了解预订情况。但是,当您查找有效/过期的预订时,请使用WHERE CancellationCode = 0,以防万一CancellationCode和ReservationStatus不同步。

然后让自己成为(SubItemId,Date,TimeOfDay,CancellationNumber)上的唯一索引。这将阻止尝试为现有行的SubItemId,Date,TimeOfDay值的相同组合插入新的活动保留行。

+0

非常容易实现的令人难以置信的答案。非常感谢,如果能够的话,我会加倍努力。 – Raythe

+0

不客气,先生。 –