Mysql (+php) 存储、检索和显示日期范围的正确方法


Mysql (+php) Right approach to store, retrieve and show date ranges

我正在开发一个日历应用程序,您可以在其中设置可以持续多天的事件。在给定日期,可以有多个事件,已经开始或从当天开始。用户将以日历的形式查看所有内容。

现在,我的问题是:以下哪种方法是正确的?有没有更好的方法?

1)使用2个表,事件和events_days,并将每个事件的日期存储在event_days表中

2)仅使用一个表,其中包含与date_from字段和date_to字段一起存储的事件,并且每次使用MySQL和PHP生成所需范围的天数列表,其中包含事件

显然,第一个选项需要更多的数据库存储,而第二个选项将需要服务器进行更大的工作来生成列表(每次用户要求它时)。

数据库存储现在应该不是问题,但我不知道将来是否会相同。我担心第二种选择将需要太多的资源。

我使用了这两种方法。以下是我注意到的优缺点列表:


两个表:events(id)events_dates(eventid, date)

优点:

  • 用于检查给定日期或给定日期之间是否有事件的查询很简单:
SELECT eventid FROM events_dates WHERE date BETWEEN '2015-01-01' AND '2015-01-10'
  • 为事件选择日期列表的查询很简单
SELECT date FROM events_dates WHERE eventid = 1

缺点:

  • 虽然选择日期列表很简单,但插入事件的日期列表需要编写脚本(或日期表)
  • 确保数据保持一致所需的其他措施,例如,在插入跨越三天的事件时,需要四个插入查询
  • 此结构不适用于涉及时间的情况,例如会议时间表

一张桌子:events(id, start, end)

缺点:

    查询以检查给定日期
  • 或给定日期之间是否有事件是棘手的。
  • 查询以选择事件的日期列表很棘手。

优点:

  • 插入事件很简单
  • 这种结构适用于涉及时间的情况