2012-01-27 164 views
2

我有,將有三種可能的值(可能更多更高版本)我存儲作爲一個枚舉列:列依賴於其他列的值

yes immediately 
yes later 
no 

如果yes later的做出選擇,我們也需要存儲事件發生的日期。在我看來,這必須是另一個專欄。

我的問題是設計缺乏完整性。即使枚舉不是yes later,也沒有什麼可以阻止date的值,如果是的話,也沒有什麼可以執行date

該設計是否可以改進,使兩列之間具有完整性?使用單獨的表格和不同的列類型絕對是一種可能性。

+0

的MySQL缺少'CHECK'約束所以想必你必須求助於觸發器來執行這種約束的支持。 – onedaywhen 2012-01-27 16:04:24

+0

@onedaywhen我正在尋找一種可能的改進設計,以避免需要外部檢查。 – 2012-01-27 16:06:15

+0

可能有,但它有助於瞭解更多其他設計/要求。給定的信息不一定足以做出適當的決定。 – 2012-01-27 17:03:22

回答

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') 
+0

這可能是矯枉過正,但我​​很高興知道我認爲是什麼樣的「正確」*解決方案 – 2012-01-28 04:21:22