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

我正在建立活动日历.基本功能如下:

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

这似乎是存储数据的一种相当优雅的方式,但是我担心检索:获取给定日期的状态会相当复杂.

是否有更好的或标准的方法来执行此操作?

解决方法:

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

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

+------------+

| 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

;

未经测试,但这是我要做的

标签:calendar,mysql

来源: https://codeday.me/bug/20191208/2094424.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值