2009-04-20 76 views
2

我有一個應用程序,我將有重複事件。因此,活動可以在白天,「每隔n天」,按周,「每週/週二/週三/每隔n周」重複一次,按月,「每隔一個月重複一次,二次,三次等」。MySQL架構:空列與連接

從表格設計角度處理這個問題的最佳方法是什麼?我可以想到兩種方法,但我不確定哪一種更好。

1)上述5列,當天案件1件,周和月各2件。無論哪個不被使用都是空的。在我的應用程序中,我可以看到空值並選擇忽略它們。

2)有第二個表,說event_dateinfo或者什麼,我會加入查詢。

看起來像選項2可能更「正常化」,什麼不是,但它會打擊你如此簡單的東西過度殺傷?另外,如果我去選項2,有沒有辦法將行翻譯爲列 - 也就是說,選擇特定事件的2周屬性並將它們視爲列?

回答

1

如果我理解正確的事件可以有超過1個時間表(這就是爲什麼你想「將行翻譯成列」)。

在這種情況下,您將不需要2個而是3個表;第三個必須是聯結表。如果您將來需要使用此方案,您可以輕鬆添加新時間表。 所以,這樣的事情:

table events (event_id, event_name, description) 
table schedules (sch_id, schedule) 
table event_schedule (event_id, sch_id) 

沒有在MySQL PIVOT可能性,因爲我知道,但你可以使用GROUP_CONCAT()在選擇功能;它將是每個事件一行,一個事件的所有時間表將在一列中。

SELECT e.event_name AS Event, GROUP_CONCAT(s.schedule SEPARATOR ', ') AS Schedule 
     FROM events e 
    (LEFT) JOIN event_schedule es 
    ON e.event_id = es.event_id 
    JOIN schedules s 
    ON s.sch_id = es. sch_id 
     GROUP BY e.event_name; 
0

我寧願處理這個normallized,一個表中的事件,以及另一個表中的事件重複。

以合適的方式處理索引,可以通過視圖處理數據請求,或者數據變大時,將其作爲帶觸發器的審計表。