I have an interesting problem trying to represent complex schedule data in a database. As a guideline, I need to be able to represent the entirety of what the iCalendar — ics — format can represent, but in a database. I’m not actually implementing anything relating to ics, but it gives a good scope of the type of rules I need to be able to model for my particular project.
I need to allow allow representation of a single event or a recurring event based on multiple times per day, days of the week, week of a month, month, year, or some combination of those. For example, the third Thursday in November annually, or the 25th of December annually, or every two weeks starting November 2 and continuing until September 8 the following year.
I don’t care about insertion efficiency but query efficiency is critical. The operation I will be doing most often is providing either a single date/time or a date/time range, and trying to determine if the defined schedule matches any part of the date/time range. Other operations can be slower. For example, given January 15, 2010 at 10:00 AM through January 15, 2010 at 11:00 AM, find all schedules that match at least part of that time. (i.e. a schedule that covers 10:30 – 11:00 still matches.)
Any suggestions? I looked at How would one represent scheduled events in an RDBMS? but it doesn’t cover the scope of the type of recurrence rules I’d like to model.
In the end, this post was most helpful:
iCal "Field" list (for database schema based on iCal standard)
We decided to follow the iCal model pretty exactly since the guys who wrote that standard had a great feel for the problem domain.