pub*_*tic 12 algorithm calendar
我必须创建类似于Google日历的内容,因此我创建了一个包含用户所有事件的事件表.
困难的部分是处理重新发生的事件,事件表中的行有一个event_type字段,告诉你它是什么类型的事件,因为事件可以只针对一个日期,或者每x天重新发生一次事件.
主要的设计挑战是处理重新发生的事件.
当用户使用月份视图查看日历时,如何显示给定月份的所有事件?查询会很棘手,所以我认为创建另一个表并为每个事件创建一个行会更容易,包括重新发生的事件.
你们有什么感想?
我正在解决这个问题,并且我已经将iCalendar(rfc 2445)完全隔开,直到阅读此线程,所以我不知道这将或不会与该线程集成得有多好。无论如何,到目前为止我想出的设计看起来像这样:
到目前为止,我发现此设计存在两个问题:
最后,我认为可以使用直接 SQL 来计算给定时间跨度的事件,但我还没有计算出确切的细节,而且我认为查询通常最终会变得太麻烦而不值得。但是,为了便于论证,您可以使用以下表达式来计算事件给定月份和年份之间的月份差异:
(:month + (:year * 12)) - (MONTH(occursOn) + (YEAR(occursOn) * 12))
Run Code Online (Sandbox Code Playgroud)
在上一个示例的基础上,您可以使用 MOD 来确定月份差异是否是正确的倍数:
MOD(:month + (:year * 12)) - (MONTH(occursOn) + (YEAR(occursOn) * 12), repeatIncrement) = 0
Run Code Online (Sandbox Code Playgroud)
无论如何,这并不完美(它不会忽略过期的事件,不会考虑事件的开始/结束时间等),因此它只是作为一个激励示例。一般来说,虽然我认为大多数查询最终都会变得过于复杂。您可能最好查询给定范围内发生的事件,或者在该范围之前不会过期的事件,并用代码而不是 SQL 计算实例本身。如果您确实希望数据库进行处理,那么存储过程可能会让您的生活变得更加轻松。
试图存储每个事件的每个实例似乎真的有问题,而且,不可能.如果某人创建了"每个星期四,永远"发生的事件,您显然无法存储所有未来事件.
您可以尝试按需生成未来事件,并仅在必要时填充未来事件以显示它们或发送有关它们的通知.但是,如果您打算构建"按需"生成代码,为什么不一直使用它?而不是从事件表中拉出,然后必须使用按需事件生成来填充尚未添加到表中的任何新事件,而是仅使用按需事件生成.最终结果是一样的.使用此方案,您只需存储开始和结束日期以及事件频率.
我没有看到任何方法可以避免生成按需事件,因此我无法在事件表中看到该实用程序.如果你想要它来缓存,那么我认为你采取了错误的方法.首先,它是一个糟糕的缓存,因为无论如何你无法避免按需事件生成.其次,无论如何你应该在更高的层次上缓存.如果要缓存,则缓存生成的页面,而不是事件.
至于使您的轮询更有效率,如果您每15分钟轮询一次,并且您的数据库和/或服务器无法处理负载,那么您已经注定失败.如果用户无法处理更多,更频繁的轮询而不会出汗,那么您的数据库将无法处理用户.
我想说从标准开始。如果您使用它作为您的模型,那么您将能够执行 google calendar、outlook、mac ical(程序)的所有操作,并且几乎可以立即与它们集成。
从那时起,是时候加强你的 ajax 和 javascript 了,因为如果没有大量的 ajax 和 javascript,你就不可能拥有带有拖放功能的华丽 Web UI 和多个日历。