admin

列取决于其他列值

sql

我有一列将具有三个可能的值(可能稍后会有更多值),将其存储为枚举:

yes immediately
yes later
no

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

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

是否可以改进此设计,以使两根色谱柱之间保持完整性?绝对有可能使用单独的表和不同的列类型。


阅读 133

收藏
2021-06-07

共1个答案

admin

您可以通过添加子类型表来解决此问题(我还希望查找表胜于枚举,甚至更多,因为您想灵活一些并在以后添加更多类型):

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')
2021-06-07