2009-04-20 52 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,一个表中的事件,以及另一个表中的事件重复。

以合适的方式处理索引,可以通过视图处理数据请求,或者数据变大时,将其作为带触发器的审计表。