【问题标题】:MySQL architecture: null columns vs. joinsMySQL 架构:空列与连接
【发布时间】:2010-10-20 14:14:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: mysql database database-design architecture normalization


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 2013-02-27
        • 1970-01-01
        • 2020-02-27
        • 1970-01-01
        相关资源
        最近更新 更多