2

我有一个应用程序,我将在其中重复事件。因此,一个事件可以按天、“每 n 天”、“按周”、“每 n 周的 Mon/Tue/Wed/etc”和“按月”、“每 n 个月的 1 日、2 日、3 日等”重复。

从表格设计的角度来看,处理这个问题的最佳方法是什么?我可以想到两种方法,但我不确定哪一种更好。

1) 5 列用于上述情况,1 列用于日情况,2 列用于周和月。无论哪个未被使用,都将为空。在我的应用程序中,我可以看到空值并选择忽略它们。

2)有第二个表,比如 events_dateinfo 或其他东西,我会加入查询。

似乎选项 2 可能更“规范化”,什么不是,但是对于这样一个简单的事情,它会让你觉得过分吗?此外,如果我选择选项 2,是否有办法将行转换为列 - 即,为特定事件选择 2 周属性并将它们视为列?

4

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 可能性,但您可以在 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;
于 2009-04-20T20:23:47.047 回答
0

我更愿意处理这个标准化的,一个表中的事件,以及另一个表中的事件重复。

以适当的方式处理索引,您可以通过视图处理对数据的请求,或者如果数据变大,作为带有触发器的审计表。

于 2009-04-20T14:40:30.210 回答