2012-04-25 5 views
1

Я создаю систему календаря, используя FullCalendar в качестве переднего конца. Бэкэнд будет MySQL/PHP.iCal backend - повторяющиеся даты

Он будет хранить список общедоступных назначений для пользователей, которые создаются и вставляются приложением. Эти встречи будут единственным событием, которое начнется и завершится в тот же день. Кроме того, пользователи смогут отмечать их несоблюдение в календаре из-за личных обязательств. Эта последняя функциональность требует использования повторяющихся событий. Вместо того, чтобы повторно изобретать колесо, я смотрел на использование структуры, основанной на iCal. Этот пост был очень полезен ical-field-list-for-database-schema-based-on-ical-standard при определении структуры базы данных.

Я создал форму заявки, которая позволяет пользователю вводить необходимые данные для хранения частной одиночной/повторяющейся встречи. После отправки формы данные отправляются через Ajax на сервер. Я нашел отличный PHP-скрипт, который генерирует массив повторяющихся дат на основе параметров, введенных пользователем, либо в их родном формате, либо с использованием RRULE.

Я не уверен, что лучше всего хранить/извлекать эти повторяющиеся даты. Приложение должно иметь возможность отображать представление календаря для пользователя, включая государственные и частные даты. Приложение также должно будет иметь возможность возвращать, например, всех пользователей, которые могут быть свободными в течение определенного периода времени/даты.

Достаточно ли хранить все события в формате iCal и иметь возможность получать события по запросу? Проблема, которую я предвижу, заключается в том, что повторяющиеся события нелегко искать, поскольку их параметры должны быть расширены «на лету»? Я рассматривал возможность создания второй таблицы каждого отдельного события (сгенерированного) со ссылкой на исходный RRULE, который его создал. Я хотел бы ограничить количество повторяющихся дат, которые могут вводить пользователи, чтобы пользователи не входили в мероприятие каждый день в течение следующих 100 лет! Я думаю, что этот подход также позволил бы мне редактировать отдельные события, которые были первоначально созданы повторяющимся правилом.

Это хороший подход, или есть лучший способ?

ответ

1

Посмотрите when building a calendar app, should i store dates or recurrence rules in my database?.

Вы должны сохранить rrule, exrule, rdate и exdate, связанные с информацией о достоверности (чтобы отслеживать изменения с течением времени: например, если ваши пользователи могут захотеть оглянуться назад в прошлом, когда они имели определенное событие, и если rrule изменился между появлением и точкой времени, когда он/она оглядывается назад), Для событий, которые имеют конечное число вхождений, делают предварительное вычисление начала и конца для временного окна для более простых запросов и имеют окно перехода для в котором у вас есть все события в таблице. Когда пользователи ищут вхождения из временного окна (должно быть редко, чтобы люди смотрели более одного года назад или более одного года в будущем), вы вычисляете релевантные события, специфичные для окна времени, которое пользователи запрашивают и генерируют на лету ,

+0

Я искал этот сайт, но не нашел эту страницу, содержащую много полезной информации - спасибо. Я думаю, что подход с двумя таблицами правильный, один для rrule, который, в свою очередь, генерирует таблицу событий. Мне придется подумать о бесконечных (или длительных) событиях и просто ограничить их или периодически расширять (возможно, на задании cron). Календарь не только доступен пользователю, который его создал, но должен быть запрошен, чтобы найти «свободные слоты» в системе, поэтому мне нужно будет полностью развернуть rrule (ы) для всех пользователей, охватывающих соответствующие временные рамки (с). – Dave

1

Как насчет таблицы по следующим направлениям:

CREATE TABLE RecurringAppointments (
    startdate DATE NOT NULL, 
    enddate DATE, 
    freq  INT NOT NULL, -- contains #days between each occurrence 
    -- etc. 
) 

Затем, чтобы извлечь все такие назначения, которые происходят на данном thedate:

SELECT * FROM RecurringAppointments 
WHERE 
     thedate BETWEEN startdate AND enddate 
    AND DATEDIFF(thedate, startdate) % freq = 0; 
+0

Спасибо за ответ, я посмотрю на ваш пример. Меня больше интересует концепция наличия дополнительной таблицы и является ли это правильным подходом. Существует ряд примеров iCal, но не так много о лучшем способе управления событиями. – Dave

+0

Я думаю, что iCal - хороший формат для обмена данными календаря между системами, но, возможно, не подходит для структурирования календарных данных в системе? Внесите ли вы вышеупомянутый метод в виде отдельной таблицы или добавьте такие поля в более общую таблицу «Назначения», полностью зависит от вас. – eggyal

+0

ваш ответ был оценен, но на самом деле не ответил на вопрос, касающийся использования формата iCal и RRULES для системы календаря, и потребуется ли вторая таблица (или была необходима), и будут ли мои мысли и подход на самом деле была хорошей идеей. FYI Я решил использовать формат iCal и RRULES для создания списка будущих дат. Затем они сохраняются в отдельной таблице. Сложность возникает, когда пользователь хочет обновить некоторые/все даты в последовательности. – Dave

Смежные вопросы