列依赖于其他列值

时间:2012-01-27 15:37:06

标签: mysql sql database-design

我有一个列,它将有三个可能的值(可能更晚一些),我将其存储为枚举:

yes immediately
yes later
no

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

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

这个设计可以改进,以便两列之间有完整性吗?使用单独的表和不同的列类型肯定是可能的。

2 个答案:

答案 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)