我有一个列,它将有三个可能的值(可能更晚一些),我将其存储为枚举:
yes immediately
yes later
no
如果选择yes later
,我们还需要存储事件发生的日期。在我看来,这必须是另一个专栏。
我的问题是设计缺乏完整性。即使枚举不是date
,也没有什么可以阻止yes later
拥有值,如果有date
也没有任何强制执行。
这个设计可以改进,以便两列之间有完整性吗?使用单独的表和不同的列类型肯定是可能的。
答案 0 :(得分: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')
答案 1 :(得分:0)