2013-01-09 189 views
1

我有一個數據庫表,如下所述。它恰好支持具有多種形式的Java EE辨別器實體,但我不認爲這對於這個問題很重要,我提供了完整性的信息。MySQL可選約束

表中的行可以採用多種形式,允許哪些字段爲空,哪些字段必須爲非空值由'type'列的值定義。在這種情況下,例如,當type = 'sail'eShipePort列應該爲非零並且eShip,ePort & eDate應該是唯一的。

有沒有寫約束來支持它的方法?我真正追求的是eShip,ePort & eDate的唯一性約束當`type ='sail'但不介意它們是多行時,它們全都爲null當'type'是其他值時?

這樣做的另一種方式是將表格拆分成兩個表格,一個表格中包含公共列,另一個表格是'帆'特定的東西。但是,如果可以的話,我想避免這種情況,因爲當我手動搜索數據庫時,數據庫選擇更容易編寫。

非常感謝您提供任何建議或幫助。

mysql> desc vLegs; 
+---------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+---------+--------------+------+-----+---------+----------------+ 
| type | varchar(10) | NO |  | NULL |    | 
| id  | mediumint(9) | NO | PRI | NULL | auto_increment | 
| end  | datetime  | YES |  | NULL |    | 
| start | datetime  | NO |  | NULL |    | 
| flight | varchar(255) | YES |  | NULL |    | 
| oprtv | mediumint(9) | NO | MUL | NULL |    | 
| dDate | date   | YES | MUL | NULL |    | 
| dPort | varchar(5) | YES |  | NULL |    | 
| dShip | varchar(10) | YES |  | NULL |    | 
| eDate | date   | YES | MUL | NULL |    | 
| ePort | varchar(5) | YES |  | NULL |    | 
| eShip | varchar(10) | YES |  | NULL |    | 
| landing | varchar(5) | YES | MUL | NULL |    | 
| takeoff | varchar(5) | YES | MUL | NULL |    | 
+---------+--------------+------+-----+---------+----------------+ 
+0

「可選約束」 - 有點矛盾。在數據庫中有一個'type'字段對我來說看起來很糟糕,「因爲它使得數據庫選擇更容易編寫」不應該是數據庫設計背後的驅動因素。如果必須獲得一個好的ORM。 –

+0

@WaleedKhan:「好的ORM」也有點矛盾;) –

回答

0

根據您所描述的關於您的要求,我建議您爲每種類型創建一個表。我不太瞭解mysql,以確定你是否有可能在約束條件下做什麼。即使有可能,這聽起來也很難理解和維護。

也許一個視圖將有助於用例,當你必須手工編寫SQL。