我尝试在数据库中表示复杂的计划数据时遇到了一个有趣的问题。作为指导,我需要能够表示iCalendar - ics
- 格式可以表示的全部内容,但是在数据库中。我实际上并没有实现与ics
相关的任何内容,但它提供了我需要能够为我的特定项目建模的规则类型的良好范围。
我需要允许基于每天多次,一周中的几天,一个月,一个月,一年或一些这些的组合来表示单个事件或重复事件。例如,每年11月的第三个星期四,或每年的12月25日,或从11月2日开始的每两周一直持续到次年的9月8日。
我不关心插入效率,但查询效率至关重要。我最常做的操作是提供单个日期/时间或日期/时间范围,并尝试确定定义的时间表是否与日期/时间范围的任何部分相匹配。其他操作可能会更慢。例如,在2010年1月15日上午10:00到2010年1月15日上午11:00,查找至少部分时间匹配的所有计划。 (即10:30 - 11:00的时间表仍然匹配。)
有什么建议吗?我查看了How would one represent scheduled events in an RDBMS?,但它没有涵盖我想建模的重复规则类型的范围。
答案 0 :(得分:4)
最后,这篇文章最有帮助:
iCal "Field" list (for database schema based on iCal standard)
我们决定完全遵循iCal模型,因为编写该标准的人对问题域有很好的感觉。
答案 1 :(得分:1)
我做类似的事情是有两张桌子。如果事件没有重复出现的模式,则只需存储日期,开始时间和结束时间。您的查询会检查您搜索的时间是否大于任何条目的开始时间且小于或等于同一事件的结束时间。
对于重复发生的事件,我不太熟悉iCalendar存储重复的方式,但是如果你按星期几存储每个事件(如果一个事件在一天以上重复,则可能必须有多个行一周),然后搜索它几乎与上表相同。对于像本周第三个星期二那样的陌生人复发,你可以有一个额外的列来描述具体情况。如果你能告诉我更多关于ics如何代表那种复发的话,我或许可以给你一个更好的答案。
我希望有所帮助。我现在没有太多时间。如果您想讨论这个问题,可以稍后与我联系。我现在在密苏里州,所以我下周的可用性将变得不稳定。
答案 2 :(得分:-1)
这可能是一个简单的解决方案,但添加一个定义事件重现的列(即每个 x 周,每年,每周等)的缺点是什么,并将其用作结果标准?