Mysql 如何优化活动日历的数据模型?

Mysql 如何优化活动日历的数据模型?,mysql,calendar,Mysql,Calendar,我正在制作活动日历。基本功能如下: 每天有3种状态,“可用”、“不可用”和“需要确认”。每天可以设置为单一状态(即事件)。可以将每个事件设置为每周或每月重复,也可以完全不重复 每个日历特定于一个对象(每个对象都有自己的日历) 日历没有“结束日期”:在未来的任何给定日期都可能有活动 我想象的数据模型是这样的: Table: Calendar id user_id Table: Status id label Table: Event id calendar_id start_date stat

我正在制作活动日历。基本功能如下:

每天有3种状态,“可用”、“不可用”和“需要确认”。每天可以设置为单一状态(即事件)。可以将每个事件设置为每周或每月重复,也可以完全不重复

每个日历特定于一个对象(每个对象都有自己的日历)

日历没有“结束日期”:在未来的任何给定日期都可能有活动

我想象的数据模型是这样的:

Table: Calendar
id
user_id

Table: Status
id
label

Table: Event
id
calendar_id
start_date
status_id
recurring -- enum type: NULL, W, or M for weekly or monthly
这似乎是一种相当优雅的数据存储方式,但我担心检索:获取给定日期的状态相当复杂


有更好的或标准的方法吗?

检查iCalendar格式


对于标准格式。

假设那天是开始日期(否则我会误解),格式对我来说似乎不错。稍后,您可能需要有开始/结束日期和开始/结束时间,在这种情况下,您将不得不添加时间戳

为了检索数据,我创建了一个日期表,如下所示:

+------------+
| cday (PK)  |
+------------+
| ...        |
| 2011-01-01 |
| 2011-01-02 |
| 2011-01-03 |
| 2011-01-04 |
| 2011-01-05 |
| 2011-01-06 |
| ...        |
+------------+
如果您需要在给定的时间段内获得状态为A(可用)的约会,您可以执行以下操作

SELECT ev.*
FROM cdays AS cd
JOIN event AS ev ON (
  CHECK_RECCUR(cd.cday, ev.day, cd.recurring)
)
WHERE TRUE
  AND cd.cday BETWEEN "given_start" AND "given_end"
  AND ev.day < "given_end"
;
选择电动汽车*
从cd日到cd日
以ev ON的身份加入活动(
检查记录(cd.cday、ev.day、cd.RECCUR)
)
哪里是真的
和cd.cday介于“给定的开始”和“给定的结束”之间
和ev.day<“给定的结束”
;
CHECK_RECCUR()将是一个检查cday是否在reccurence范围内的函数,如下所示:

CREATE FUNCTION CHECK_RECCUR(cday DATE, start_date DATE, recurring CHAR(1))
BEGIN
  IF cday < start_date
  THEN RETURN FALSE
  END IF;
  SET dformat = CASE recurring
    WHEN 'W' THEN '%W'
    WHEN 'M' THEN '%d'
    WHEN 'Y' THEN '%m-%d'
    ELSE ''
  END;
  RETURN (DATE_FORMAT(cday, dformat) == DATE_FORMAT(start_date, dformat));
END
;
CREATE FUNCTION CHECK\u RECCUR(cday日期、start\u日期、循环字符(1))
开始
如果cday<开始日期
然后返回FALSE
如果结束;
SET dformat=案例重复出现
当“W”时,则为“%W”
当“M”时,则为“%d”
当为“Y”时,则为“%m-%d”
否则“
结束;
返回(日期格式(cday,dformat)=日期格式(开始日期,dformat));
结束
;

未测试,但这是我要做的

作为状态的可空bool难道不够吗?或者您想保留稍后添加不同状态的可能性吗?是的,稍后可能会出现其他一些状态