Лучший способ сохранить еженедельное событие в MySQL?

У меня есть таблица еженедельных событий, которые проходят в определенные дни недели (например, MTWTh, MWF и т. д.) и проводятся в определенное время (например, с 8:00 до 17:00). Как лучше всего хранить информацию о дне недели в MySQL, чтобы упростить получение данных и работу с ними? Моему приложению CakePHP потребуется получить все происходящие события NOW().

Для времени суток я бы просто использовал TIME. Для дней недели я рассматривал 7-битное битовое поле, varchar (сделка типа MTWThFr) для дней недели, но оба они кажутся неуклюжими решениями (varchar был более неуклюжим).

Какие-либо предложения?


person erjiang    schedule 14.05.2010    source источник


Ответы (6)


Вот простой способ:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  0   0   0   1   0   0   0   14-01-2010    14-01-2033

Как использовать:

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

Резюме:

Запускайте каждый четверг:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  0   0   0   1   0   0   0   14-01-2010    14-01-2033

Запуск каждые четверг и понедельник:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  1   0   0   1   0   0   0   14-01-2010    14-01-2033

Кроме того, вы получаете только одну строку для каждого расписания событий, что проще и чище для программной обработки.

Например, чтобы найти все события, которые должны быть выполнены в понедельник, выполните:

select * from Events where Mon = 1
person Wadih M.    schedule 14.05.2010

Можете ли вы добавить столбец DayOfWeek в свою таблицу и сделать его целым? Допустимые значения для этого будут от 1 до 7. Вы можете добавить ограничение на это, чтобы обеспечить соблюдение этого правила. Что касается времени, как насчет столбцов BeginTime и столбца EndTime? Они также будут int 0-24

Мероприятие в 17:00 в понедельник будет выглядеть в вашей таблице следующим образом.

Event_ID DayOfWeek BeginTime EndTime
1        2         1700      1800
person Billy Coover    schedule 14.05.2010
comment
Проблема, которую я вижу в этом, заключается в том, как вы обрабатываете событие, которое происходит в несколько дней недели? Другая запись в той же таблице может усложнить запрос. - person JYelton; 14.05.2010
comment
@jyelton это не усложнит запрос. Вы просто получите несколько строк. - person Billy Coover; 14.05.2010
comment
О, верно - вы можете просто запросить из таблицы любые строки, в которых n указано как DayOfWeek, чтобы определить, запланировано ли событие на этот день. Однако у вас есть проблема (или функция), связанная с необходимостью указывать время события в несколько дней. Проблема заключается в дублировании данных; или функция будет заключаться в том, что событие может происходить в разное время в эти дни. Все, что подходит вам лучше всего. - person JYelton; 14.05.2010
comment
Я полагаю, что если бы время никогда не менялось по дням, их можно было бы переместить в родительскую таблицу событий, что сделало бы это довольно хорошим решением «один ко многим». - person JYelton; 14.05.2010
comment
Я бы предпочел сделать это в двух таблицах. Таблица событий и таблица расписания. Затем вы получаете гибкость «многие к одному» и можете повторно использовать событие. - person Billy Coover; 14.05.2010

Почему бы не иметь несколько строк, каждая из которых имеет только один столбец, содержащий день недели. Этот столбец будет простым:

ENUM("Monday", "Tuesday", ...)

Затем в PHP вы можете использовать функции date и strtotime, чтобы получить название дня:

echo date('l');
echo date('l', strtotime('mon'));
// Outputs "Monday"

Намного удобнее хранить название дня.

person mexique1    schedule 14.05.2010
comment
Сохранение значения дня недели в формате int сэкономит место. - person Billy Coover; 14.05.2010
comment
Разве ENUM не хранятся как целые числа? На справочной странице MySQL сказано, что значения ENUM индексируются, начиная с 1. Возможно, поэтому рекомендуется добавлять значения в конец ENUM при его изменении, чтобы сохранить индексы. На самом деле я не знаю... - person mexique1; 15.05.2010

На случай, если кто-то снова пойдет по этому пути, я использую SMTWHFA довольно эффективно с простым поиском строки.

Таким образом, понедельник, среда, пятница будет MWF, а воскресенье, понедельник, четверг будет SMH. Требуется некоторое время, чтобы привыкнуть к H = четверг (вторая буква) и суббота = A, но это работает!

person BeNice    schedule 14.10.2014

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

SELECT eventName
FROM events
WHERE fridayBool = true
AND eventStartTime < NOW()
AND eventEndTime > NOW();

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

Не самый элегантный, но он должен работать.

Изменить...

Пример столбцов таблицы:

  • идентификатор события
  • название события
  • событиеStartTime
  • событиеEndTime
  • воскресеньеBool
  • понедельникБул
  • ...
  • субботаBool
person JYelton    schedule 14.05.2010
comment
Решение «один ко многим», предоставляемое Coov, дает вам дополнительную возможность изменять время для каждого события, если хотите. Но вам, возможно, придется соответствующим образом изменить свой пользовательский интерфейс, потому что событие может иметь возможность выбирать разное время каждый день. - person JYelton; 14.05.2010

Разбейте еженедельную информацию в отдельную таблицу целиком:

events: id, beginTime, endTime, name, description
eventsbyday: id, dayofweek, event_id

Это позволит вам запрашивать eventsbyday в соответствии с текущим днем ​​недели:

SELECT events.name, events.beginTime, events.endTime FROM eventsbyday JOIN events ON eventsbyday.event_id=events.id WHERE dayofweek=0

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

person jshalvi    schedule 14.05.2010