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

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

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

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

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

2) 仅使用一个 table 与存储在 date_from 字段和 date_to 字段中的事件,每次生成mysql 和 php 包含事件的所需范围的天数列表

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

数据库存储目前应该不是问题,但我不知道将来是否会一样。我担心第二个选项需要太多资源。

两种方法我都用过。以下是我注意到的优点和缺点列表:


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

优点:

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

缺点:

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

一个 table: events(id, start, end)

缺点:

  • 查询以检查在给定日期或给定日期之间是否有事件 is tricky
  • 查询 select 事件的日期列表 is tricky

优点:

  • 插入事件很简单
  • 这种结构在涉及时间的情况下table