Лучший способ сохранить время события в (My) базе данных SQL - PullRequest
5 голосов
/ 19 сентября 2008

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

Пожалуйста, предложите несколько проверенных и проверенных схем баз данных.

Ответы [ 5 ]

5 голосов
/ 19 сентября 2008

Таблица: События

  • StartTime (dateTime)
  • EndTime (dateTime) null для бесконечного времени
  • RepeatUnit (int) null = noRepeat, 1 = час, 2 = день, 3 = неделя, 4 = dayOfMonth, 5 = месяц, 6 = год
  • NthDayOfMonth (int)
  • RepeatMultiple (int) Например, установите RepeatUnit на 3, а это на 2 для каждых двух недель
  • Id - при необходимости StartTime может подойти для уникальной идентификации события.
  • Имя (строка) - имя, присвоенное событию, если требуется

Это может помочь. Это потребовало бы приличного количества кода, чтобы интерпретировать, когда повторы. Части полей времени, которые имеют более низкое разрешение, чем повторяющиеся единицы, следует игнорировать. Выполнение 3-й субботы месяца также будет непростым ... Информация NthDayOfMonth потребуется только для выполнения такого рода функций.

Схема базы данных, необходимая для этого, проста по сравнению с кодом, необходимым для определения места повторения.

4 голосов
/ 19 сентября 2008

Я работал над приложением-планировщиком, которое слабо следует стандарту iCalendar (для записи событий). Вы можете прочитать RFC 2445 или эту схему, опубликованную Apple Inc. icalendar schema , чтобы узнать, имеют ли они отношение к проблеме.

Моя схема базы данных (повторяющееся / целый день событие не рассматривалось в то время)

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); 

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

надеюсь, это поможет

1 голос
/ 19 сентября 2008

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

Преимущество этого подхода в том, что запрос событий прост. Они все в таблице событий. Без хранения повторяющихся событий в таблице событий у вас была бы сложная 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)
)
0 голосов
/ 19 сентября 2008

Используйте функцию datetime и mysql, встроенную в функцию NOW (). Создайте запись при запуске процесса, обновите столбец, который отслеживает время окончания, когда процесс завершается.

0 голосов
/ 19 сентября 2008

Точно так же cron делает это? Запись времени начала и окончания таким образом.

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