Хороший способ справиться с датой и временем? - PullRequest
2 голосов
/ 24 октября 2010

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

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

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

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

1 Ответ

2 голосов
/ 24 октября 2010

Если вы сохраняете каждый запрос доступа в таблице с полями 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:00 AM & Понедельником 3:00 PM
  • start_time == Понедельник 11:00 AM ||end_time == Понедельник, 3:00 PM

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

...