我有,将有三种可能的值(可能更多更高版本)我存储作为一个枚举列:列依赖于其他列的值
yes immediately
yes later
no
如果yes later
的做出选择,我们也需要存储事件发生的日期。在我看来,这必须是另一个专栏。
我的问题是设计缺乏完整性。即使枚举不是yes later
,也没有什么可以阻止date
的值,如果是的话,也没有什么可以执行date
。
该设计是否可以改进,使两列之间具有完整性?使用单独的表格和不同的列类型绝对是一种可能性。
我有,将有三种可能的值(可能更多更高版本)我存储作为一个枚举列:列依赖于其他列的值
yes immediately
yes later
no
如果yes later
的做出选择,我们也需要存储事件发生的日期。在我看来,这必须是另一个专栏。
我的问题是设计缺乏完整性。即使枚举不是yes later
,也没有什么可以阻止date
的值,如果是的话,也没有什么可以执行date
。
该设计是否可以改进,使两列之间具有完整性?使用单独的表格和不同的列类型绝对是一种可能性。
你可以通过添加亚型表解决这个问题(我也希望能有一个查找表过枚举,甚至更多,因为你想成为灵活,以后添加更多类型):
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')
这可能是矫枉过正,但我很高兴知道我认为是什么样的“正确”*解决方案 – 2012-01-28 04:21:22
的MySQL缺少'CHECK'约束所以想必你必须求助于触发器来执行这种约束的支持。 – onedaywhen 2012-01-27 16:04:24
@onedaywhen我正在寻找一种可能的改进设计,以避免需要外部检查。 – 2012-01-27 16:06:15
可能有,但它有助于了解更多其他设计/要求。给定的信息不一定足以做出适当的决定。 – 2012-01-27 17:03:22