@todaystudio

Как реализовать структуру БД и сам бэкенд для сервиса бронирования отелей с динамическими ценами?

Задача такая: нужно реализовать сервис для бронирования отелей. В принципе ничего сложно. С основными моделями и схемами все понятно. Но для меня возникает очень непонятная ситуация.
Дело в том, что у отеля разные цены не только на разные номера (напр.: стандарт, полу-люкс, люкс и тд), а еще цены зависят от даты проживания в них. То есть на каждое число может быть разная цена. И, допустим, номер в отеле стоит в сентябре 1000₽, а в октябре 1500₽. И при поиске отеля с 30 сентября по 2 октября (итого 2 ночи) сумма должна считаться так: 1000 + 1500 = 2500.
Так как оптимальнее организовать хранение всех этих данных в БД и как лучше обрабатывать это все на бэке?

Буду благодарен за каждый комментарий. Может кто-либо сталкивался с таким или у кого-нибудь есть мысли на этот счет.
Заранее спасибо!
  • Вопрос задан
  • 408 просмотров
Пригласить эксперта
Ответы на вопрос 2
Melkij
@Melkij
PostgreSQL DBA
Это-то динамическая? Хотите посмотреть на динамические цены - посмотрите на ценообразование некоторых авиакопаний, где цена на один и тот же рейс может ощутимо прыгать несколько раз в течении одного часа.

Не, это вполне статичные цены у вас. А если вам дают формат "отель, категория номера, дата, цена" без дальнейшего деления - то и вовсе простой случай. Вот прямо так и импортируете в табличку id отеля, категория номера, дата, цена. Первые три поля - композитный первичный ключ.
Запрос стоимости на отрезок времени:
select hotel_id, category, sum(price) as total_price from hotel_prices where date between ? and ? and not on_stop_sale group by 1,2 having count(*) = количество_дней_в_диапазоне order by total_price

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

Ну пяток-десяток категорий номеров, немного лести про сотню отелей, на год вперёд... Вот только попробуйте заикнуться что эта кроха вырастет ну на тааак много строк что будет невероятно медленно работать.
Ответ написан
Комментировать
Twstd
@Twstd
Разрабатываю приложения и микросервисы на Nodejs
В Модели цену сделать геттером, который будет считать её динамически исходя из контекста

Например в случае использования MongoDB и Mongoose

const otelSchema = new Schema({
  price: Number // обычная цена
}, {
  virtuals: {
    priceToday: {
      get() {
       // делаем что то с ценой this.price в зависимости от даты...
        return // возвращаем новую цену
      }
    }
  }
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы