mysql - 如何优化事件日历的数据模型?

标签 mysql calendar

我正在构建一个事件日历。基本功能是这样的:

每天有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/

相关文章:

mysql - 更新 Magento 中的 sales_flat_order_item 表

php - 如何使用 php 将事件插入用户谷歌日历?

mysql - 检查每行的 id 是否在另一个表中作为 id 存在

mysql - 引用多个表的 SQL 查询的正确结构是什么?

php - 在 while 循环中访问第二个表

Javascript d3 热图日历,如何附加一个月中的某一天?

objective-c - 从 NSMutableArray 中删除对象

java - Java中int月份之间的间隔

emacs - 更改某些面孔后如何正确对齐 Emacs 日历的布局?

mysql - 对多个表的复杂 SQL 查询