我有一列将具有三个可能的值(可能稍后会有更多值),将其存储为枚举:
yes immediately yes later no
如果做出选择yes later,我们还需要存储事件发生的 日期 。在我看来,这必须是另一专栏。
yes later
我的问题是设计缺乏完整性。date即使枚举不是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,等等。
EventYI
Yes Immediate
EventNO
此设计的唯一问题是,没有什么可以阻止不'Yes Later'添加到EventYL表中的事件,因此应以其他方式强制执行。如果只有MySQL具有检查约束,则可以将该表更改为:
'Yes Later'
EventYL
EventYL ------- --- YesLater version 2 EventId Choice EventDate PRIMARY KEY(EventId, Choice) FOREIGN KEY (EventId, Choice) REFERENCES Event(EventId, Choice) CHECK (Choice = 'YL')