Проверка на дублирование бронирования автомобиля - PullRequest
3 голосов
/ 27 ноября 2010

Я пишу простую программу бронирования для проката автомобилей (школьное задание). Я и мой друг пытаемся сделать систему немного более продвинутой, чем предписывает задание, но у нас есть некоторые проблемы, с которыми мы надеялись, что вы поможете нам.

Идея состоит в том, что вы можете зарезервировать определенный тип автомобиля, и когда вы получите автомобиль, он будет одного из этого типа (вы не бронируете конкретный автомобиль, как предписывает наше назначение, а только тип). Только один клиент может получить автомобиль на определенную дату. В момент бронирования мы должны убедиться, что мы не сдаем в аренду больше автомобилей каждого типа, чем имеем. Резервирования в основном хранятся с указанием даты начала, даты окончания и типа автомобиля.

Если мы пока игнорируем тип автомобиля (скажем, у нас только один тип), то резервирование может графически выглядеть примерно так:

1/12  2/12  3/12  4/12  5/12  6/12  7/12
|-------------------|
                    |-----------------|
                                |-----|
|-------|
                          |-----------|
|-------------|

Если в прокате только три автомобиля, можно будет взять напрокат автомобиль с 3/12 до 5/12, поскольку на все дни можно бронировать только 2 автомобиля. Но откуда мы это знаем? Нужно ли проверять каждую дату и подсчитывать () количество бронирований, охватывающих эту дату?

А что если бы кто-то зарезервировал машину 4/12, то 3/12 и 5/12 все равно имели бы только 2 бронирования, а 4/12 - 3.

Можно ли как-то сделать с запросом, как, или мы должны проходить каждую дату в программе, чтобы проверить, что количество бронирований не превышает количество автомобилей? (Это достаточно просто, только с полными датами, но рассмотрим сценарий, в котором вы могли бы арендовать автомобили на почасовой основе (не только на ежедневной основе, как здесь). Тогда можно было бы хотя бы один пройти через каждый наш, если у нас есть много бронирований и машин, а продолжительность длинна ...)

Надеюсь, у вас есть хорошие идеи, которые помогут нам в этом. Спасибо, что нашли время, чтобы прочитать вопрос:)

  • Миккель, Дания

Ответы [ 2 ]

1 голос
/ 04 марта 2014

Предположим, у вас есть такая ситуация бронирования в реальной жизни:

       1/12  2/12  3/12  4/12  5/12  6/12  7/12
Car1:  |-------------------|
Car2:                      |-----------------|
Car3:  |-------|     |-----------|     |-----|                              
Car4:  |-------------|

Таблица car

| id | type | registration |
| 1  | 1    | HH1111       |
| 2  | 1    | HH3333       |
| 3  | 2    | HH77         |
| 4  | 3    | DD999        |

Таблица reservation

| car_id | date_from  | date_to    |
| 1      | 2013-12-01 | 2013-12-04 |
| 2      | 2013-12-04 | 2013-12-07 |
| 3      | 2013-12-01 | 2013-12-02 |
| 3      | 2013-12-03 | 2013-12-05 |
| 3      | 2013-12-06 | 2013-12-07 |
| 4      | 2013-12-01 | 2013-12-03 |

Сейчас, Вы должны по действительно простой логике выбрать все доступные автомобили за период

от 2013-12-05 до 2013-12-06

"Выбрать ВСЕ автомобили, которые не имеют бронирования с датами, какие блокиэто для использования "с бриллиантом MySQL выберите:

select * from car  where not exists ( select * from reservation 
where car.id = reservation.car_id AND
date_from < '2013-12-06' AND
date_to > '2013-12-05' )  
1 голос
/ 28 ноября 2010

"Можно ли было бы как-то сделать запрос, или нам нужно пройти каждую дату в программе, чтобы убедиться, что количество бронирований не превышает количество автомобилей? (Это достаточно просто, только полные даты, "

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

Например, новое резервирование на 4 / 12-6 / 12 должно быть разбито на 4 / 12-5 / 12 (вторая строка) и 5 ​​/ 12-6 / 12 (третья строка). Эти отдельные интервалы могут быть длиннее одного дня, и вы можете выполнять проверки на уровне этих отдельных интервалов. (В этом конкретном примере они совпадают с отдельными днями, но бронь 7 / 12-19 / 12 вообще не должна быть разделена.

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

...