@brnovk

В каком формате/структуре лучше хранить/обрабатывать время работы заведений?

День добрый.
Возникла проблема - на сайте нужно получить у пользователя время работы заведения по дням недели. Заведения могут быть самыми разными, с различными режимами работы и 1 обеденным перерывом:
- (ПН) (ВТ) (СР) (ЧТ) : "09:00 - 19:00", (ПТ) (СБ) : "09:00 - 15:00", (ВС) : не работает
- (ПН) (ВТ) (СР) (ЧТ) (ПТ) (СБ) (ВС) : круглосуточно
- (ПН) (ВТ) (СР) (ЧТ) (ПТ) : "08:00 - 13:00", "14-00 - 20:00", (СБ) (ВС) : не работает

Поиск по этим данным в ближайшем будущем не ожидается, главное удобство хранения и вывод конечным пользователям.
Пока ничего кроме 2 вариантов придумать не удалось:
- 1 строка в таблице БД, которая хранит сформированный при создании в html-код либо JSON-структуру;
- 2 таблицы в БД: таблица дней недели, таблица каждого конкретного дня недели каждой конкретной организации.
Не один из вариантов мне не нравится полностью, в каждом есть недостатки.
Может есть более красивое решение?
  • Вопрос задан
  • 436 просмотров
Пригласить эксперта
Ответы на вопрос 3
petermzg
@petermzg
Самый лучший программист
1. Таблица для уникальных интервалов (timeid, from, to)
2. Таблица заведений (companyId, ...)
3. Таблица времени работы. (companyId, dayofweek, timeid)
dayofweek - можно даже сделать битовой маской, вся неделя в одном байте.

Нет записи - не работает
Две и более записей - "08:00 - 13:00", "14-00 - 20:00"
Для круглосуточно - интервал с NULL (timeid: 0, from: NULL, to: NULL)
Ответ написан
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Ну если особо поиск не нужен - то как вариант делится неделя на интервалы по 1 часу. За сутки 24 таких интервала, за неделю - 168.
1 - заведение работает в заданный интервал, 0 - не работает
Итого получаем 168 бит информации.
168/8 = 21 байт.
То есть для каждого заведения просто храним строку из 21 байта, которая уникальным образом отображает любые произвольные интервалы работы на каждый день в течение недели с точностью до часа.
Если нужна точность в полчаса - храним 42 байта.
Если нужна точность в 15 минут - храним 84 байта.
Большей точности в быту, как правило, - не требуется.
Ответ написан
freeExec
@freeExec
Участник OpenStreetMap
Почему-то все забывают, что в расписание может быть всё что угодно: начиная что перерывов может быть больше 1 и заканчивая расписанием вида - первый день месяца не работает, вторая неделя только до обеда, зимой мы работаем на час короче, а в августе начальник в отпуске поэтому весь месяц в выходные отдыхаем.
Готовые наработки по сохранению времени работы в OSM - https://wiki.openstreetmap.org/wiki/Key:opening_hours
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы