Как бы вы могли хранить повторяющиеся времена? - PullRequest
6 голосов
/ 10 января 2009

Мне нужно запомнить, происходит ли что-то один раз, ежедневно, в будние дни, еженедельно, в некоторые дни недели, в некоторые дни месяца, которые могут быть числовыми или символическими, например первый понедельник каждого месяца и т. Д. *

Любые рекомендации? Любой код, структура данных или схема, чтобы посмотреть?

Ответы [ 7 ]

8 голосов
/ 10 января 2009

Есть сложные решения и простые решения. Два самых простых решения:

  1. Разнесение повторяющихся событий до некоторого постоянного числа экземпляров или до некоторого фиксированного диапазона дат в будущем. Сохраняйте FK recurrence_id с каждым экземпляром, который указывает на описание повторения, и допускает массовое редактирование и отмену.

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

  2. Расчет во время отображения. Компьютеры работают быстро, в зависимости от вопросов, на которые вы хотите ответить о ваших данных, часто будет легко вычислить все случаи в диапазоне дат. Вы можете быть умным и попытаться быстро заключить в скобки свой диапазон дат перед выполнением вычисления повторения, или вы можете перебором его с начальной даты.

Кроме того, вам просто нужно решение для хранения правила повторения, которое работает со всем, что вы используете для вычисления повторений. (например, если вы используете библиотеку включения iCalendar, ваша схема будет varchar (255) со значениями RRULE в ней)

Если вам нужно развернуть свой собственный калькулятор повторений, и вы хотите, чтобы он был простым, ограничение ваших повторений ежедневными, еженедельными, ежемесячными или ежегодными, покрывает ваш первый 80% сценарий использования и легко вычисляется.

В этот момент ваша потенциальная схема повторения выглядит примерно так:

id
recurrence_start
recurrence_end
type (daily|weekly|monthly|yearly)
day_of_week (for weekly)
month
day_of_month

И, честно говоря, комплексные решения, вероятно, не стоят того:)

3 голосов
/ 05 февраля 2009

Мартин Фаулер написал действительно замечательную статью об этом. Вы можете найти много тех же идей, которые он обсуждает в runt , библиотеке Ruby для работы с временными выражениями.

1 голос
/ 09 ноября 2009

Схема, описанная здесь, фиксирует повторяющиеся даты

http://github.com/bakineggs/recurring_events_for

1 голос
/ 10 января 2009

Проблема в том, что существуют бесконечные возможности для указания такого интервала. Например - «Первый понедельник каждого второго месяца, если дата четная, но не 4, а месяц не февраль длинного года». Как далеко вы готовы пойти? В конце концов вам просто нужно будет заставить пользователей вводить логическое выражение, которое оценивается как ИСТИНА в дни, когда событие должно повториться. Не очень хорошо с точки зрения пользовательского интерфейса.

Вам следует принять решение о некоторых ограничениях для вашей системы. Как только вы это знаете, все остальное должно быть легким - или, по крайней мере, отвечать за SO. :)

1 голос
/ 10 января 2009

Это звучит как «повторяющееся событие», такое как в Outlook. Я бы использовал одну таблицу с именем RecurrenceType для хранения каждого периода времени (ежедневно, еженедельно и т. Д.). Другая таблица с именем Event woud ссылается по ключу на RecurrenceType. Будущие даты для большинства типов повторений могут быть рассчитаны с использованием стандартных функций Date.

1 голос
/ 10 января 2009

Попробуйте проект с открытым исходным кодом, который имеет функции планирования?

Некоторые интерфейсы планирования / определения

http://tools.ietf.org/html/rfc4791

и

http://en.wikipedia.org/wiki/ICalendar

0 голосов
/ 27 апреля 2012

Это упомянуто в связанном, полезном SO-потоке , но хорошей, активно поддерживаемой альтернативой Runt, если вы используете Ruby, является ice_cube . Вы не упомянули, каковы ваши требования к бэкэнд-хранилищу, но для схемы базы данных @ kellan и некоторые из вышеупомянутых потоков - это хорошее начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...