Я пытаюсь решить, как лучше всего хранить время событий в базе данных MySQL. Они должны быть как можно более гибкими и иметь возможность представлять «отдельные события» (начинаются в определенное время, не обязательно указывать время окончания), «на весь день» и «многодневные» события, повторяющиеся события, повторяющиеся события на весь день. , возможно, мероприятия типа «3-я суббота месяца» и т. д.
Пожалуйста, предложите несколько проверенных и проверенных схем баз данных.






Так же, как это делает cron? Таким образом записывается как время начала, так и время окончания.
Нет, больше похоже на iCal. Я просто еще не нашел удобочитаемого описания того, как именно работает iCal или как лучше всего выразить это в SQL.
Таблица: События
Это может помочь. Для интерпретации повторов потребуется приличный объем кода. Части полей времени с более низким разрешением, чем единица повтора, должны быть проигнорированы. Выполнить 3-ю субботу месяца тоже будет непросто ... информация NthDayOfMonth потребуется только для выполнения такого рода функций.
Схема базы данных, необходимая для этого, проста по сравнению с кодом, необходимым для определения места повторения.
Как бы вы устроили с этим мероприятие на весь день? Я бы определенно хотел разделить дату и время, так как «24-12-2008 00:00:00» неоднозначно ...
StartTime = '24 -12-2008 00:00:00 'EndTime = '24 -12-2008 23:59:59', если дневное событие рассматривается вашим приложением как особый случай, то код, который обращается к база данных должна знать, что начало 00:00:00 и конец 23:59:59 означают что-то особенное, проверьте их и установите флаг allDay
Или добавьте столбец allDay (int), как упоминалось в другом ответе.
Вам нужны две таблицы. Один для хранения повторяющихся событий (таблица Repeatevent) и один для хранения событий (таблица event). Простые записи хранятся только в таблице событий. Повторяющиеся записи хранятся в таблице повторяющихся событий, и все отдельные записи для повторяющегося события также сохраняются в таблице событий. Это означает, что каждый раз, когда вы вводите повторяющуюся запись, вы должны вводить все единичные результирующие записи. Вы можете сделать это с помощью триггеров или как часть бизнес-логики.
Преимущество этого подхода в том, что запрашивать события просто. Все они есть в таблице событий. Без хранения повторяющихся событий в таблице событий у вас был бы сложный SQL или бизнес-логика, которая замедлила бы вашу систему.
create table repeatevent (
id int not null auto_increment,
type int, // 0: daily, 1:weekly, 2: monthly, ....
starttime datetime not null, // starttime of the first event of the repetition
endtime datetime, // endtime of the first event of the repetition
allday int, // 0: no, 1: yes
until datetime, // endtime of the last event of the repetition
description varchar(30)
)
create table event (
id int not null auto_increment,
repeatevent null references repeatevent, // filled if created as part of a repeating event
starttime datetime not null,
endtime datetime,
allday int,
description varchar(30)
)
Я работал над приложением-планировщиком, которое примерно соответствует стандарту iCalendar (для записи событий). Вы можете прочитать RFC 2445 или эту схему, опубликованную Apple Inc. схема icalendar, чтобы узнать, имеют ли они отношение к проблеме.
Схема моей базы данных (повторяющееся / целодневное мероприятие в то время не рассматривалось)
event (event_id, # primary key
dtstart,
dtend,
summary,
categories,
class,
priority,
summary,
transp,
created,
calendar_id, # foreign key
status,
organizer_id, # foreign key
comment,
last_modified,
location,
uid);
внешний ключ calendar_id в предыдущей таблице относится к этому
calendar(calendar_id, # primary key
name);
в то время как organizer_id ссылается на это (с отсутствием других свойств, таких как общее имя и т. д.)
organizer(organizer_id, # primary key
name);
Другая документация, которую вы можете найти более читаемой, находится в здесь.
надеюсь это поможет
Ссылка на схему icalendar, похоже, изменилась. Не могли бы вы его обновить?
Я думаю, ты еще можешь поискать rfc2445 :)
@svish только что нашел обновленную ссылку на (теперь устаревшую) схему iCalendar, но не уверен, что она вам все еще нужна
@ Jeffrey94 Нет, но, пожалуйста, обновите свой ответ на случай, если это сделает кто-то еще (или я сделаю это позже;)
Используйте функцию datetime и mysql, встроенную в функцию NOW (). Создайте запись при запуске процесса, обновите столбец, в котором отслеживается время окончания, когда процесс завершится.
Что вы раньше выбирали в качестве лучшего решения этой проблемы? Я также ищу схему базы данных для этой цели.