数据库设计:处理可用性

Database design: dealing with availability

在我的 Ruby Rails 应用程序中,自行车租赁公司可以管理他们所有的自行车(预订、付款等)。

上下文 我想为一家自行车租赁公司 (shops) 提供在他们自己的网站上实施预订表格的选项,这样他们就可以让客户预订 bike.

问题 在阅读了一些在线文档之后,我认为我应该创建一个单独的 table 来处理每个 bike_category 的可用性,然后它将显示 bikescount 可用于选择了 arrivaldeparture 日期。

=> 示例:1-1-20201-2-2010 20 bikes 之间 bike_category "mountainbike" 可用

但我不确定 table 的结构应该如何,因为 reservation 处于 bike 级别,因此属于 bike_category?

代码

型号

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

我个人不会为此创建另一个 table。我会询问用户他们打算租用自行车的日期。确定开始日期和结束日期后,我会 运行 查询预订 table 以查找在此期间哪些自行车不可用。

例如

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

如果您仔细研究的话,可能还有一种方法可以在一个查询中使用连接来执行上述操作。

通常,当数据已经能够被推断时,我会避免添加更多 table。主要原因是,如果您更新原始 table(在本例中为保留),那么您将不得不将这些更新级联到 "inferred data" table,这很容易维护.