2012-01-27 118 views
2

我有,将有三种可能的值(可能更多更高版本)我存储作为一个枚举列:列依赖于其他列的值

yes immediately 
yes later 
no 

如果yes later的做出选择,我们也需要存储事件发生的日期。在我看来,这必须是另一个专栏。

我的问题是设计缺乏完整性。即使枚举不是yes later,也没有什么可以阻止date的值,如果是的话,也没有什么可以执行date

该设计是否可以改进,使两列之间具有完整性?使用单独的表格和不同的列类型绝对是一种可能性。

+0

的MySQL缺少'CHECK'约束所以想必你必须求助于触发器来执行这种约束的支持。 – onedaywhen 2012-01-27 16:04:24

+0

@onedaywhen我正在寻找一种可能的改进设计,以避免需要外部检查。 – 2012-01-27 16:06:15

+0

可能有,但它有助于了解更多其他设计/要求。给定的信息不一定足以做出适当的决定。 – 2012-01-27 17:03:22

回答

3

你可以通过添加亚型表解决这个问题(我也希望能有一个查找表过枚举,甚至更多,因为你想成为灵活,以后添加更多类型):

ChoiceType 
----------   --- the lookup table 
Choice  
Desciption 
PRIMARY KEY(Choice) 

Event 
-----     --- your table 
EventId 
Choice 
... other stuff for all events 
PRIMARY KEY(EventId) 
FOREIGN KEY (Choice) 
    REFERENCES ChoiceType(Choice) 

EventYL 
-------    --- the YesLater table 
EventId 
EventDate 
... other stuff for YesLater events only 
PRIMARY KEY(EventId) 
FOREIGN KEY (EventId) 
    REFERENCES Event(EventId) 

如果您要存储的其他选择不同的数据,那么你可以添加一个EventYI表(用于Yes Immediate),一个EventNO

这种设计的唯一问题是,没有什么能够阻止一个事件,是不是要添加'Yes Later'EventYL表,所以这应该被强制执行,否则。如果,仅在MySQL有检查约束,该表可改为:

EventYL 
-------    --- YesLater version 2 
EventId 
Choice 
EventDate 
PRIMARY KEY(EventId, Choice) 
FOREIGN KEY (EventId, Choice) 
    REFERENCES Event(EventId, Choice) 
CHECK (Choice = 'YL') 
+0

这可能是矫枉过正,但我​​很高兴知道我认为是什么样的“正确”*解决方案 – 2012-01-28 04:21:22