日历中重复的事件

时间:2018-11-28 15:24:25

标签: doctrine-orm calendar database-schema database-performance api-platform.com

首先,请原谅我精通英语,我是法语。

我要就数据库设计问题征求一些意见。

我必须设计一个带有事件的日历。简要地说,事件包括开始日期/时间,结束日期/时间和说明。

问题是我必须考虑重复;创建事件时,有可能表明事件将在下周开始,并重复进行直到某个日期为止。

我看到两种设计可能性:

  1. 使用 id start_datetime end_datetime description 创建事件表领域。 添加新事件时,我们生成的行与重复事件的数量一样。

优势:我们可以使用SELECT *来检索所有事件,而无需使用特定算法。此外,可以将每次事件的描述进行修改,只要它们被认为是完全不同的。

劣势(重大!):如果我们不设置无限重复的结束日期,我们将不会记住无限的事件...

  1. this thread中描述的方法(即两个表)中汲取灵感:
    • 事件
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
  • event_repetitions
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。

预先感谢您的回答。

1 个答案:

答案 0 :(得分:0)

我允许自己做一点事情,希望有其他答案。