В настоящее время я пытаюсь найти лучший способ сохранить часы работы в базе данных.
Например:
У предприятия А следующие часы работы
- Понедельник: 9.00 - 17.00
- Вторник: 9.00 - 17.00
- Среда: 9.00 - 17.00
- Четверг: 9.00 - 17.00
- Пятница: 9.00 - 17.00
- Суббота: 9.00 - 12.00
- Воскресенье: выходной
В настоящее время у меня есть модель данных, подобная следующей
CREATE TABLE "business_hours" (
"id" integer NOT NULL PRIMARY KEY,
"day" varchar(16) NOT NULL,
"open_time" time,
"close_time" time
)
где «день» ограничен выбором 7 дней недели в коде (через ORM). Чтобы проверить, закрыт ли бизнес в определенный день, он проверяет, равны ли значения open_time и close_time NULL. Он связан с бизнесом через промежуточную таблицу (отношение "многие ко многим").
Есть ли у кого-нибудь предложения по этой схеме базы данных? Что-то в этом мне не кажется правильным.
database
database-design
user128000
источник
источник
Ответы:
В общем, ничего плохого в этом не вижу. Кроме...
Я бы сохранил день недели как целое число, используя любую систему нумерации, которую использует ваш родной язык программирования (в своих библиотеках). Это уменьшит размер базы данных и удалит сравнения строк из вашего кода.
Я бы, вероятно, поместил внешний ключ в бизнес-таблицу прямо здесь, в этой таблице. Таким образом, вам не понадобится таблица ссылок.
Думаю, я бы сделал:
В моей бизнес-логике я бы установил ограничение, согласно которому каждое «предприятие» имеет не менее 7 «рабочих часов». ( По крайней мере, потому что Джон Скит прав, вам могут потребоваться праздничные часы.) Хотя вы можете ослабить это ограничение, просто отказавшись от «рабочих часов» в те дни, когда предприятие закрыто.
источник
Одна ситуация, не охватываемая этой схемой, - это несколько периодов открытия в день. Например, местный паб открыт с 12:00 до 14:30 и с 17:00 до 23:00.
Может быть, кассы театра открыты на утренник и вечерний спектакль.
На этом этапе вам нужно решить, можете ли вы иметь несколько записей для одного дня или вам нужно представить разные часы в одной строке.
А как насчет времени работы до полуночи. Допустим, бар открыт с 19:00 до 02:00. Вы не можете просто сравнить время открытия и закрытия со временем, которое вы хотите проверить.
источник
business_hours
:break_time
иbreak_duration
. Очень редко бывает два перерыва в один день.Это как бы зависит от того, для чего вам нужно их хранить и как могут выглядеть реальные данные.
Если вам нужно определить, открыт ли бизнес в определенный момент, может быть немного неудобно запрашивать схему, как она изложена. Но что еще важнее: вам когда-нибудь понадобится закрытие в середине дня?
Некоторые варианты включают;
источник
Я узнал, что если вы хотите, чтобы разметка данных Google распознавала ваши данные, вы должны следовать этим правилам:
https://schema.org/openingHours
http://schema.org/OpeningHoursSpecification Содержит «действительные даты», что очень полезно для некоторых предприятий.
https://schema.org/docs/search_results.html#q=hours
У вас должно быть все в порядке без первичного ключа, если только вы не разрешаете предприятиям использовать одни и те же часы с таблицей соединения - что интересно, в конечном итоге у вас будет конечное количество комбинаций; Я не уверен, сколько это будет: p
В одном из своих проектов я использовал столбцы:
Если вы хотите поддерживать спецификацию OpeningHoursSpecification, вам необходимо добавить validFrom и validThrough.
Временной диапазон имеет формат: чч: мм-чч: мм.
Вот функция, которая его анализирует, вы также можете изменить эту функцию для анализа только одного открытия / закрытия, если вы сохраните их как отдельные столбцы в БД.
Исходя из моего опыта, я бы порекомендовал вам разрешать несколько раз в течение дня, чтобы можно было определить, закрыты ли они в этот день явно или открыты 24 часа или 24/7. Я сказал, что если в БД пропущен день, то в этот день бизнес закрывается.
источник
Большинство результатов работает нормально для данного сценария, но он не будет столь же эффективным, если у вас есть периоды, длящиеся несколько дней, например. 8:00 ~ 2:00, тогда я рекомендую использовать многопериодный дизайн.
источник
Можно подумать об учете праздников, включив дополнительные поля для месяца года / дня месяца / недели месяца. Неделя месяца имеет некоторые незначительные нюансы, «последней» может быть, например, 4 или 5 неделя в зависимости от года.
источник