繁体   English   中英

MySQL体系结构:空列与联接

[英]MySQL architecture: null columns vs. joins

我有一个重复事件的应用程序。 因此,事件可以按日,“每隔n天”,按周,“每隔n周在周一/周二/周三/等”重复,以及按月重复“每隔n个月的1、2、3等”重复。

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

1)以上各5列,日间1列,每周和每月各2列。 不使用的任何一个都将为null。 在我的应用程序中,我可以看到null并选择忽略它们。

2)有第二张表,例如events_dateinfo或其他内容,我将加入该表以进行查询。

似乎选项2可能更“规范化”了,不是吗?但是,对于这样一个简单的事情,它是否会让您感到过分杀伤力? 另外,如果我要使用选项2,是否可以将行转换为列-也就是说,为特定事件选择2周属性并将其视为列?

如果我了解正确的事件可以有多个时间表(这就是为什么要“将行转换为列”)。

在这种情况下,您将不需要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;

我更喜欢处理这种规范化的事件:一个表中的事件,另一个表中的事件重复。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM