我有,將有三種可能的值(可能更多更高版本)我存儲作爲一個枚舉列:列依賴於其他列的值
yes immediately
yes later
no
如果yes later
的做出選擇,我們也需要存儲事件發生的日期。在我看來,這必須是另一個專欄。
我的問題是設計缺乏完整性。即使枚舉不是yes later
,也沒有什麼可以阻止date
的值,如果是的話,也沒有什麼可以執行date
。
該設計是否可以改進,使兩列之間具有完整性?使用單獨的表格和不同的列類型絕對是一種可能性。
我有,將有三種可能的值(可能更多更高版本)我存儲作爲一個枚舉列:列依賴於其他列的值
yes immediately
yes later
no
如果yes later
的做出選擇,我們也需要存儲事件發生的日期。在我看來,這必須是另一個專欄。
我的問題是設計缺乏完整性。即使枚舉不是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
等
這種設計的唯一問題是,沒有什麼能夠阻止一個事件,是不是要添加'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')
這可能是矯枉過正,但我很高興知道我認爲是什麼樣的「正確」*解決方案 – 2012-01-28 04:21:22
的MySQL缺少'CHECK'約束所以想必你必須求助於觸發器來執行這種約束的支持。 – onedaywhen 2012-01-27 16:04:24
@onedaywhen我正在尋找一種可能的改進設計,以避免需要外部檢查。 – 2012-01-27 16:06:15
可能有,但它有助於瞭解更多其他設計/要求。給定的信息不一定足以做出適當的決定。 – 2012-01-27 17:03:22