Лучший способ хранить время событий в (My) базе данных SQL

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

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

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

ksno 27.09.2016 14:44
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
5
1
7 248
5

Ответы 5

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

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

deceze 19.09.2008 12:17

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

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

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

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

Как бы вы устроили с этим мероприятие на весь день? Я бы определенно хотел разделить дату и время, так как «24-12-2008 00:00:00» неоднозначно ...

deceze 19.09.2008 12:29

StartTime = '24 -12-2008 00:00:00 'EndTime = '24 -12-2008 23:59:59', если дневное событие рассматривается вашим приложением как особый случай, то код, который обращается к база данных должна знать, что начало 00:00:00 и конец 23:59:59 означают что-то особенное, проверьте их и установите флаг allDay

Scott Langham 19.09.2008 17:31

Или добавьте столбец allDay (int), как упоминалось в другом ответе.

Scott Langham 19.09.2008 17:34

Вам нужны две таблицы. Один для хранения повторяющихся событий (таблица 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, похоже, изменилась. Не могли бы вы его обновить?

Svish 18.01.2012 14:33

Я думаю, ты еще можешь поискать rfc2445 :)

Jeffrey04 28.02.2012 09:04

@svish только что нашел обновленную ссылку на (теперь устаревшую) схему iCalendar, но не уверен, что она вам все еще нужна

Jeffrey04 17.11.2015 06:38

@ Jeffrey94 Нет, но, пожалуйста, обновите свой ответ на случай, если это сделает кто-то еще (или я сделаю это позже;)

Svish 20.11.2015 00:51

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

Другие вопросы по теме