我有一个申请,我会有重复的事件。因此,事件可以按天重复,“每n天”,按周,“周一/周二/周三等每n周”,按月,“每1个月,1日,2日,3日等”。
从表格设计角度处理此问题的最佳方法是什么?我可以想到两种方法,但我不确定哪种方式更好。
1)上述5列,白天1列,周和月2列。无论使用哪一个都是空的。在我的应用程序中,我可以看到空值并选择忽略它们。
2)有一个第二个表,比如events_dateinfo或者什么,我将加入查询。
似乎选项2可能更“标准化”而不是什么,但它是否会让你觉得这样一个简单的东西有点过分?另外,如果我要去选项2,是否有办法将行转换为列 - 也就是说,为特定事件选择2周属性并将它们视为列?
答案 0 :(得分: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可能性,但您可以在SELECT中使用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;
答案 1 :(得分:0)
我更愿意处理这个规范化的,一个表中的事件,另一个表中的事件重复性。
以适当的方式处理索引,您可以通过视图处理数据请求,或者如果数据变大,则可以作为带触发器的审计表处理。