我正在构建一个事件日历。基本功能是这样的:
每天有3种状态,“可用”、“不可用”和“需要确认”。每一天都可以设置为一个状态(即一个事件)。每个事件都可以设置为每周或每月重复一次,或者根本不重复。
每个日历都特定于一个对象(每个对象都有自己的日历)。
日历没有“结束日期”: future 的任何给定日期都可能有事件。
我想象中的数据模型是这样的:
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
这似乎是一种相当优雅的数据存储方式,但我担心检索:获取给定日期的状态会相当复杂。
是否有更好或标准的方法来做到这一点?
最佳答案
假设那一天是开始日期(否则我误解了),格式对我来说似乎不错。稍后您可能需要开始/结束日期和开始/结束时间,在这种情况下,您将不得不使用时间戳。
为了检索数据,我创建了一个日期表,如下所示:
+------------+
| 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"
;
CHECK_RECCUR() 将是一个检查 cday 是否在重复范围内的函数,如下所示:
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
;
未测试,但这是我要做的
关于mysql - 如何优化事件日历的数据模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4648065/