数据库设计:处理可用性
Database design: dealing with availability
在我的 Ruby Rails 应用程序中,自行车租赁公司可以管理他们所有的自行车(预订、付款等)。
上下文
我想为一家自行车租赁公司 (shops
) 提供在他们自己的网站上实施预订表格的选项,这样他们就可以让客户预订 bike
.
- 此预订表格随后会显示
bike_categories
,其中 bikes
可用于给定的 arrival
和 departure
日期。
问题
在阅读了一些在线文档之后,我认为我应该创建一个单独的 table 来处理每个 bike_category
的可用性,然后它将显示 bikes
的 count
可用于选择了 arrival
和 departure
日期。
=> 示例:1-1-2020
和 1-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,这很容易维护.
在我的 Ruby Rails 应用程序中,自行车租赁公司可以管理他们所有的自行车(预订、付款等)。
上下文
我想为一家自行车租赁公司 (shops
) 提供在他们自己的网站上实施预订表格的选项,这样他们就可以让客户预订 bike
.
- 此预订表格随后会显示
bike_categories
,其中bikes
可用于给定的arrival
和departure
日期。
问题
在阅读了一些在线文档之后,我认为我应该创建一个单独的 table 来处理每个 bike_category
的可用性,然后它将显示 bikes
的 count
可用于选择了 arrival
和 departure
日期。
=> 示例:1-1-2020
和 1-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,这很容易维护.