Дизайн базы данных: работа с доступностью - PullRequest
0 голосов
/ 28 января 2020

В моем приложении Ruby on Rails компании по прокату велосипедов могут управлять всеми своими велосипедами (бронирование, оплата и т. Д. c.).

Контекст Я хотел бы предложить компаниям по прокату велосипедов (shops) возможность создать форму бронирования на своем собственном веб-сайте, чтобы они могли позволить клиентам бронировать bike.

  • В этой форме бронирования будет указано bike_categories, из которых bikes доступны на определенную дату arrival и departure.

Вопрос После прочтения некоторой документации в Интернете, я думаю, мне следует создать отдельную таблицу, чтобы справиться с доступностью по bike_category, которая затем показала бы count bikes доступно для выбранной даты arrival и departure.

=> пример: между 1-1-2020 и 1-2-2010 20 bikes из bike_category "горный велосипед" доступен

Но я не уверен как должна выглядеть структура таблицы, поскольку reservation находится на bike -уровне, который, следовательно, принадлежит bike_category?

Code

модели

class Shop < ApplicationRecord
  has_many :bike_categories, dependent: :destroy
  has_many :bikes, through: :bike_categories
  has_many :reservations, dependent: :destroy
end

class Reservation < ApplicationRecord
  belongs_to :shop
  belongs_to :bike
end

class Bike < ApplicationRecord
  belongs_to :bike_category
  has_many :reservations, dependent: :destroy
end

class BikeCategory < ApplicationRecord
  belongs_to :shop
  has_many :bikes, dependent: :destroy
end

1 Ответ

1 голос
/ 28 января 2020

Лично я бы не стал создавать для этого другую таблицу. Я бы запросил у пользователя даты, когда он намеревается взять в аренду велосипеды Когда у вас есть даты начала и окончания, я запустил запрос к таблице бронирования, чтобы определить, какие велосипеды недоступны в это время.

Например

reserved_bikes = Reservation.distinct.pluck(:bike_id).where(start_time: Time.now..user_end_time, end_time: Time.now..user_start_time)

Тогда я бы использовал их, чтобы узнать, сколько в каждой категории

Bike.where.not(id: reserved_bikes).group(:category).count

Вероятно, есть способ сделать это и с помощью объединений в одном запросе, если вы посмотрите на него.

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

...