数据库设计:处理可用性
Posted
技术标签:
【中文标题】数据库设计:处理可用性【英文标题】:Database design: dealing with availability 【发布时间】:2020-05-14 01:46:26 【问题描述】:在我的 Ruby on Rails 应用中,自行车租赁公司可以管理他们所有的自行车(预订、付款等)。
上下文
我想为自行车租赁公司 (shops
) 提供在他们自己的网站上实施预订表格的选项,这样他们就可以让客户预订bike
。
bike_categories
,其中bikes
可用于给定的arrival
和departure
日期。
问题
在线阅读一些文档后,我认为我应该创建一个单独的表来处理每个bike_category
的可用性,然后显示bikes
的count
可用于选定的arrival
和departure
日期。
=> 示例:1-1-2020
和 1-2-2010
20
bikes
之间的 bike_category
“山地自行车”可用
但我不确定表的结构应该如何,因为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
【问题讨论】:
【参考方案1】:我个人不会为此创建另一个表。我会询问用户他们打算租用自行车的日期。一旦你有了开始和结束日期,我会在预订表上运行一个查询,以查找在此期间哪些自行车不可用。
例如
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
如果您研究一下,可能还有一种方法可以在一个查询中使用连接来完成上述操作。
通常,当数据已经能够推断出来时,我会避免添加更多表。主要原因是,如果您更新原始表(在这种情况下为预订),则必须将这些更新级联到“推断数据”表,这很难维护。
【讨论】:
感谢您的输入,但为了创建 RESTful API,我需要创建此表,以便我可以共享某个bike_type
可用的 bikes
的数量。对吗?
复杂业务逻辑的自定义搜索端点在 REST 中被接受。例如,start_date、end_date 和 category 可以作为 http 参数传递给 available_bikes
“资源”,而无需在数据库中创建相应的表。 Rest 不需要资源是独立的表。查看此答案以获取另一种解释。 ***.com/a/31984477/37083如果共享可用的自行车很重要,最好共享链接以重新运行查询,而不是创建资源,因为在您查看时它可能已过期
哇谢谢@gdxn96!感谢您的回答,我学到了一些新东西。继续努力!以上是关于数据库设计:处理可用性的主要内容,如果未能解决你的问题,请参考以下文章