У меня есть интересная проблема при попытке представить сложные данные расписания в базе данных. Как инструкция, я должен смочь представить полноту какой iCalendar- ics
- формат может представить, но в базе данных. Я на самом деле не реализую ничего касающегося ics
, но это дает хороший объем типа правил, которые я должен смочь смоделировать для своего конкретного проекта.
Я должен позволить, позволяют представление единственного события или повторяющегося события на основе многократно в день, дни недели, недели месяца, месяца, года или некоторой комбинации тех. Например, третий четверг в ноябре ежегодно, или 25-го декабря ежегодно, или каждые две недели начиная 2 ноября и продолжаясь до 8 сентября в следующем году.
Я не забочусь об эффективности вставки, но запрашиваю эффективность, очень важно. Операция, которую я буду делать чаще всего, обеспечивает или единственную дату/время или диапазон даты/времени, и пытается определить, соответствует ли определенное расписание какой-либо части диапазона даты/времени. Другие операции могут быть медленнее. Например, данный 15 января 2010 в 10:00 в течение 15 января 2010 в 11:00, найдите все расписания, которые соответствуют, по крайней мере, части того времени. (т.е. расписание, которое касается 10:30 - 11:00 все еще, соответствует.)
Какие-либо предложения? Я смотрел на то, Как можно было бы представить запланированные события в RDBMS? но это не покрывает объем типа правил повторения, которые я хотел бы смоделировать.
В конце концов, этот пост оказался наиболее полезным:
Список «полей» iCal (для схемы базы данных, основанной на стандарте iCal)
Мы решили точно следовать модели iCal, поскольку ребята, написавшие этот стандарт, прекрасно разбирались в проблемной области.
Это может быть тривиальное решение, но каковы будут недостатки добавления столбца, определяющего повторяемость события (т.е. каждые x недель, ежегодно, еженедельно, и т. д.) и используя это в качестве критерия результата?
Я сделал что-то похожее на это, чтобы иметь две таблицы. Если событие не имело повторяющегося шаблона, просто сохраните дату, время начала и время окончания. Запрос проверяет, превышает ли время поиска время начала любой записи и меньше или равно времени окончания того же события.
Что касается повторяющихся событий, я не слишком знаком с тем, как iCalendar хранит повторения, но если вы храните каждое событие по дням недели (возможно, вам придется иметь несколько строк для одного события, если оно повторяется более одного дня в неделю), то выполните поиск по нему почти так же, как в приведенной выше таблице. Для более странных рецидивов, таких как третий вторник недели, у вас может быть дополнительная колонка, описывающая конкретное состояние. Я мог бы дать вам лучший ответ на этот вопрос, если бы вы могли рассказать мне больше о том, как ICS представляет собой такого рода повторение.
Я надеюсь, что это поможет. Сейчас у меня не так много времени. Вы можете связаться со мной позже, если вы хотите обсудить это. В настоящее время я нахожусь в Миссури, поэтому моя доступность на следующую неделю будет неустойчивой.