Что лучший способ состоит в том, чтобы представить “Повторяющиеся события” в базе данных?

Мое предпочтение должно иметь классы, которые используют время, на самом деле полагаются на интерфейс, такой как

interface IClock
{
    DateTime Now { get; } 
}

С конкретной реализацией

class SystemClock: IClock
{
     DateTime Now { get { return DateTime.Now; } }
}

Тогда, если Вы хотите, можно обеспечить любой другой вид часов, которые Вы хотите для тестирования, такой как

class StaticClock: IClock
{
     DateTime Now { get { return new DateTime(2008, 09, 3, 9, 6, 13); } }
}

могут быть немного служебные в обеспечении часов к классу, который полагается на него, но это могло быть обработано любым количеством решений для внедрения зависимости (использующий Инверсию контейнера Управления, простую инжекцию конструктора/метода set, или даже Статический Шаблон Шлюза ).

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

кроме того, с помощью DateTime.Now и включая его в вычислениях только не чувствует себя хорошо - это отнимает у Вас способность протестировать конкретные времена, например, при обнаружении ошибки, которая только происходит около полуночной границы, или по вторникам. Используя текущее время не позволит Вам тестировать те сценарии. Или по крайней мере не каждый раз, когда Вы хотите.

43
задан Varma 16 October 2009 в 18:52
поделиться

5 ответов

Таблицы sysjobs , sysjobsschedule и sysschedules в SQL Server неплохо справляются с этой задачей. Я бы не стал изобретать велосипед, я бы просто скопировал их дизайн.

Вот некоторые из важных полей из sysschedules

freq_type

Как часто задание выполняется по этому расписанию.

1 = Только один раз

4 = Ежедневно

8 = Еженедельно

16 = Ежемесячно

32 = Ежемесячно относительно freq_interval

64 = Запускается при запуске службы агента SQL Server

128 = Выполняется, когда компьютер простаивает

freq_interval

Дни выполнения задания. Зависит от значения freq_type. Значение по умолчанию - 0, что означает, что freq_interval не используется. Значение freq_type Влияние на freq_interval

1 (один раз) freq_interval не используется (0)

4 (ежедневно) Каждые freq_interval дней

8 (еженедельно) freq_interval - одно или несколько из следующих значений: 1 = воскресенье 2 = Понедельник 4 = вторник 8 = среда 16 = четверг 32 = пятница 64 = суббота

16 (ежемесячно) В freq_interval день месяца

32 (ежемесячно, относительный) freq_interval принимает одно из следующих значений: 1 = воскресенье 2 = Понедельник 3 = вторник 4 = среда 5 = четверг 6 = пятница 7 = суббота 8 = день 9 = будний день 10 = выходной день

64 (запускается при запуске службы агента SQL Server) freq_interval не используется (0)

128 (запускается, когда компьютер бездействует) freq_interval не используется (0)

freq_subday_type

Единицы измерения для freq_subday_interval. Может быть одним из следующих значений: Значение Описание (единица измерения)

1 В указанное время

2 секунды

4 минуты

8 часов

freq_subday_interval

Количество периодов freq_subday_type между каждым выполнением задания.

freq_relative_interval

Когда freq_interval встречается в каждом месяце, если freq_interval равен 32 (относительный месяц). Может принимать одно из следующих значений:

0 = freq_relative_interval не используется

1 = первый

2 = второй

4 = третий

8 = четвертый

16 = последний

freq_recurrence_factor

Количество недель или месяцев между запланированным выполнением задания. freq_recurrence_factor используется, только если freq_type равно 8, 16 или 32. Если этот столбец содержит 0, freq_recurrence_factor не используется.

38
ответ дан 26 November 2019 в 23:00
поделиться

Я тоже думал об этом, хотя еще не реализовал это, но это мои мысли о простом решении.

При настройке повторяющегося события попросите пользователя указать " дата окончания »и создайте отдельные события для каждого из них (на основе повторяющихся параметров). Поскольку это повторяющееся событие, установите уникальный «повторяющийся идентификатор» для каждого из них. Затем этот идентификатор будет использоваться для отметки события как повторяющегося, и если вы измените будущее событие, вы можете предложить пользователю применить его к остальным будущим событиям, удалив и воссоздав повторяющиеся события с новым «повторяющимся идентификатором», который также будет отличать это повторяющееся событие от ранее измененных.

Надеюсь, что это имеет смысл, и хотел бы получить любые комментарии.

0
ответ дан 26 November 2019 в 23:00
поделиться

Что ж, чтобы сохранить само правило повторения, вы можете использовать урезанную версию RFC 5545 (и я действительно рекомендую вам сильно урезать ее). Помимо всего прочего, это упростит экспорт в другие приложения, если вы захотите.

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

Если вы не хотите писать довольно сложный SQL, который может быть трудно протестировать (а вы » мне понадобится много модульных тестов для всех видов крайних случаев) Я бы посоветовал вам сделать саму базу данных относительно «тупой» и написать большую часть бизнес-логики на таком языке, как Java или C # - на любом из которые, конечно же, могут быть встроены в хранимые процедуры в зависимости от вашей базы данных.

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

У меня есть некоторый опыт ведения календаря (большую часть прошлого года я провел, работая над битом календаря Google Sync через ActiveSync), и я должен предупредить вас, что все становится сложнее действительно быстро. Все, что вы считаете «выходящим за рамки», - это благословение. В частности, вам нужно работать в нескольких часовых поясах?

О, и, наконец, будьте очень, очень осторожны, когда выполняете арифметические операции с календарными операциями. Если вы собираетесь использовать Java, , пожалуйста, используйте Joda Time , а не встроенные классы Calendar / Date . Они вам очень помогут.

24
ответ дан 26 November 2019 в 23:00
поделиться

I would record recurring events as two separate things in the database. First of all, in an events table, record each and every occurence of the event. Secondly, have recurrences table in which you record the details that you ask for to set up the recurring event. Start date, periodicity, number of occurences, etc.

Then you might think of tying it all together by putting the PK of recurrences into each of the event records as an FK. But a better design would be to normalise the event table into two tables, one which is just the barebones of an event, and one which has the details, which could now be referring to multiple events. That way every event record, recurring or not, has an FK to the PK of the eventdetails table. Then in eventdetails, record the PK of recurrences somewhere along with agenda, invitees, etc. The recurrence record does not drive anything. For instance, if you want a list of all recurring events, you look through eventdetails for all events with a non-null FK to recurrences.

You'll need to be careful to synchronise all of these things, so that you insert or delete events when the recurrence data changes.

0
ответ дан 26 November 2019 в 23:00
поделиться

"Aside from anything else"

does this include "the very requirements" ?

"that will make it easy to export into other applications should you wish to."

Do the stated requirements include "it must be easy to export the calendars to other applications" ? My impression was that the problem consisted solely of building the FIRST application.

that said, my own response :

You need to limit yourself/your user on the types of "recurrency" your sytem will be able to support. And "All of the above" or "No Limitations" will not be a valid answer if you/your user want(s) to end up with a usable application.

-4
ответ дан 26 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: