2011-09-22 31 views
0

我有一個group表 - 應該option_idextras_id應該在單獨的表中還是全部在一個表中?請參見下面就是我的意思:參考表:全部在一個或單獨的表中?

分組表:

mysql> select * from `group`; 
+----+-----------+--------+ 
| id | name  | type | 
+----+-----------+--------+ 
| 1 | Group One | extra | 
| 2 | Group Two | option | 
+----+-----------+--------+ 

有兩個組(額外的或選件)。

group_extra表:

mysql> select * from `group_extra`; 
+----+----------+----------+ 
| id | group_id | extra_id | 
+----+----------+----------+ 
| 1 |  1 |  123 | 
| 2 |  1 |  124 | 
+----+----------+----------+ 

group_id = 1具有參考的列表extra_id

group_option表:

mysql> select * from `group_option`; 
+----+----------+-----------+ 
| id | group_id | option_id | 
+----+----------+-----------+ 
| 1 |  2 |  45 | 
| 2 |  2 |  46 | 
+----+----------+-----------+ 

group_id = 2具有REF option_id的列表

group_option_extra表:

mysql> select * from `group_option_extra`; 
+----+----------+-----------+----------+ 
| id | group_id | option_id | extra_id | 
+----+----------+-----------+----------+ 
| 1 |  1 |   0 |  123 | 
| 2 |  1 |   0 |  124 | 
| 3 |  2 |  45 |  0 | 
| 4 |  2 |  46 |  0 | 
+----+----------+-----------+----------+ 

還是應該表這個樣子的,結合group_optiongroup_extra成一個?哪一個是推薦的。

回答

3

保持它們分開。

您不需要類型列 - 您可以檢查其他表中是否存在任何行以查看它是哪種類型。

+0

你會如何編寫SQL查詢檢查其他表中是否存在任何行?我沒有寫兩個單獨的查詢 –

+0

'SELECT id,name,EXISTS(SELECT * FROM group_extra WHERE group_id = group.id)has_extra,EXISTS(SELECT * FROM group_option WHERE group_id = group.id)has_option FROM group'注意:這不是在所有表格中命名ID列ID是一個好主意 - 當你進行連接時,它會使你瘋狂。爲每個id列指定一個不同的名稱,即使在組表中,仍然將其稱爲group_id而不是id。 (這隻適用於你想加入的列,其他列可以有重複的名稱,你不需要在每列都加上前綴,這也會使你瘋狂。) – Ariel

+0

感謝您的建議Ariel。只是最後一個問題......你能想到好的「組」表名嗎?因爲它的相關選項或額外的食物表。 –