首先,请原谅我精通英语,我是法语。
我要就数据库设计问题征求一些意见。
我必须设计一个带有事件的日历。简要地说,事件包括开始日期/时间,结束日期/时间和说明。
问题是我必须考虑重复;创建事件时,有可能表明事件将在下周开始,并重复进行直到某个日期为止。
我看到两种设计可能性:
优势:我们可以使用SELECT *来检索所有事件,而无需使用特定算法。此外,可以将每次事件的描述进行修改,只要它们被认为是完全不同的。
劣势(重大!):如果我们不设置无限重复的结束日期,我们将不会记住无限的事件...
id description 1 Single event on 2018-11-23 08:00-09:30 2 Repeated event : * every monday from 10:00 to 12:00 from Monday 2018-11-26 * every wednesday from 2018-11-28 from 14:00 to 14:45 until 2019-02-27
id event_id start_datetime end_datetime interval end_date 1 1 2018-11-23 08:00:00 2018-11-23 09:30:00 NULL NULL 2 2 2018-11-26 10:00:00 2018-11-26 12:00:00 604800 NULL 3 2 2018-11-28 14:00:00 2018-11-28 14:45:00 604800 2019-02-27
注意: interval 是每次出现之间的秒数,604800 = 24(小时)* 3600(秒)* 7(天)。
优点:在无限重复的情况下(发生ID 2的事件),我们只需要编写很少的行,并且可以提高性能。
缺点:如果我们要针对特定事件而不是其他事件修改事件的描述(或其他可能的字段),则不能不创建第三个表,例如 event_descriptions :
id event_id user_id datetime description 1 2 1 2018-11-26 10:00:00 Comment from 2018-11-26 2 2 2 2018-12-03 10:00:00 Comment of the second occurrence, i.e. from 2018-12-03
注意: user_id 是写评论的登录用户。
另一个缺点是,要获取给定日,周或月的事件列表,选择查询将更加复杂并使用联接。当有成千上万个事件时, event_descriptions 表可能会很大。
我的问题是:您会推荐什么作为更有效的替代方法?也许第二个解决方案很好?你觉得呢?
就使用的技术而言,我打算使用MySQL,这是我最了解的DBMS。但是,如果您认为在行数非常多的情况下,例如使用MongoDB会更好,请立即举报。
有关信息,我的应用程序是使用API平台开发的API,所以Symfony 4使用Doctrine ORM。
预先感谢您的回答。
答案 0 :(得分:0)
我允许自己做一点事情,希望有其他答案。