Для системы бронирования есть стол инвентарь , и у каждого предмета есть количество (например, есть 20 стульев). Теперь пользователь может сделать бронирование на определенный период (например, 5 стульев на два часа "2010-11-23 15:00" - "2010-11-23 17:00"; может быть другое резервирование на несколько дней "2010-11-24 11:00" - "2010-11-26 14:00").
Какой лучший способ проверить, сколько предметов еще доступно за запрошенный период?
Пользователь должен ввести время, когда он хочет сделать заказ (от, до), и он должен увидеть, сколько предметов инвентаря еще доступно за этот период.
table "inventory"
-------------------
inventory_id (int)
quantity (int)
table "reservation"
-------------------
reservation_id (int)
inventory_id (int)
quantity (int)
from (datetime)
until (datetime)
Резервирование может перекрываться, но на определенный момент времени должны быть зарезервированы только инвентарь. Количество предметов.
Простой пример:
У нас 40 стульев.
Существуют следующие оговорки:
R1 2010-11-23 14:00 - 2010-11-23 15:30 -> 5 chairs reserved
R2 2010-11-23 15:00 - 2010-11-23 16:00 -> 10 chairs reserved
R3 2010-11-23 17:00 - 2010-11-23 17:30 -> 20 chairs reserved
Пользователь делает несколько запросов бронирования (запросов):
Q1 2010-11-23 15:00 - 2010-11-23 17:00 -> 25 chairs are available
Q2 2010-11-23 15:45 - 2010-11-23 17:00 -> 30 chairs are available
Q3 2010-11-23 16:30 - 2010-11-23 18:00 -> 30 chairs are available
Q4 2010-11-23 15:10 - 2010-11-23 15:20 -> 25 chairs are available
Q5 2010-11-23 13:30 - 2010-11-23 17:30 -> 20 chairs are available
Как бы я запросил максимально доступное количество за запрашиваемый период? Или нужен другой дизайн стола? Целевыми системами баз данных являются Oracle и SQL-Server.
Обновление
Я пытался «визуализировать» резервирование R1 и R2 и запросы Q1 - Q5 без изменения исходных примеров. Я добавил Q4 и Q5 в качестве дополнительных примеров. av показывает доступное количество.
R1 R2 R3 av
13:30 40 Q5
14:00 5 35 Q5
14:30 5 35 Q5
15:00 5 10 25 Q1 Q5
15:10 5 10 25 Q1 Q4 Q5
15:20 5 10 25 Q1 Q5
15:30 10 30 Q1 Q5
15:45 10 30 Q1 Q2 Q5
16:00 40 Q1 Q2 Q5
16:30 40 Q1 Q2 Q3 Q5
17:00 20 20 Q3 Q5
av 25 30 20 25 20