2

Для моего веб-приложения мне нужно обрабатывать запросы доступа. Запросы вводятся в течение понедельника по воскресеньям, указывая часы на каждый день. Расписание на этой неделе может повторяться до 52 раз. Пользователь может иметь несколько расписаний в течение недели (пн 8-9 и мон 10-11) Существуют следующие требования:Хороший способ справиться с временем и временем?

  1. Searchable/фильтруемых
  2. Detect перекрывающихся запросов

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

Кто-нибудь имеет лучшую идею модели базы данных или чистый способ справиться с перекрытиями в коде?

+1

«Записи» отдельных дней очень примитивны, а не нормализованы. Как насчет повторяющихся событий и 52 недель? Как насчет повторяющихся событий (никто не будет рад повторению вручную), а 52 недели? Что относительно заказов, которые пересекают границу дня (с 23:00 до 01:00)? которые пересекают границу недели? Сначала вам нужно сначала сделать какую-то работу. Не разумно ожидать от людей предоставления полной модели данных для этого. Да, у меня есть полный DM, работающий в Production, но нет, он коммерческий. – PerformanceDBA

+0

Мне не нужна полная модель данных. Я не администратор базы данных, и я хочу сделать шаг в правильном направлении. За исключением сериализации данных, у меня сейчас нет идеи о том, как именно нормализовать. Гранулярность должна быть только до минуты, но все вещи, о которых вы упомянули, являются очень хорошими вопросами. Спасибо, я буду думать об этом – ryan

+1

Хорошо. Я не использую метод Colin (BETWEEN и т. Д. Приведет к рабочему столу и будет медленным), но я могу заверить, что для кода SQL или производительности нет проблем, используя таблицу Normalized (zero duplication), в которой хранятся MeetingStartTime и MeetingDuration. То есть. «Пролеты» не сохраняются; всего одна строка на фактическое собрание; пустые или конфликтующие блоки могут быть легко идентифицированы. «Пролеты» и повторяющиеся события - это проекции. – PerformanceDBA

ответ

2

Если вы сохраняете каждый запрос доступа в таблице с полями с start_time и end_time, вы можете использовать функциональность BETWEEN базы данных, чтобы определить, будет ли конкретный доступ перекрываться с уже существующим в базе данных.

В качестве примера предположим, что кто-то завершил запрос на доступ в понедельник с 9:00 до 12:00.

Затем приходит кто-то еще и пытается сделать запрос доступа в понедельник с 11:00 до 15:00. Для того, чтобы определить, если это будет противоречить с чем-то еще, вы должны обращать внимание на следующие возможные условия:

  • start_time < понедельник 11:00 AM & & END_TIME> Понедельник 11:00 AM
  • start_time МЕЖДУ Понедельник 11: 00AM & Понедельник 15:00
  • start_time == Monday 11:00 AM || end_time == Понедельник 3:00 PM

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

+0

Когда они вводят запрос, они вводят время для каждого дня неделю. Ваше решение кажется больше нацеленным на один день доступа. Посмотрите, что я имею в виду о процедуре, потому что по одному запросу у вас есть до 7 дней? Не могли бы вы изменить свой подход? – ryan

+0

Таким же образом вы также можете создать SQL-запрос, который проверил все семь дней одновременно с использованием И-слов в предложении WHERE. Если вам нужно проверять каждый день индивидуально, то я не уверен - вы можете либо выполнить семь поиска в базе данных, либо найти способ вернуть набор результатов из базы данных с значениями YES/NO для каждого дня в вашем запросе. – Collin

Смежные вопросы