【问题标题】:Database design: dealing with availability数据库设计:处理可用性
【发布时间】:2020-05-14 01:46:26
【问题描述】:

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

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

  • 然后此预订表格将显示bike_categories,其中bikes 可用于给定的arrivaldeparture 日期。

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

=> 示例:1-1-20201-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

【问题讨论】:

    标签: ruby-on-rails database api-design


    【解决方案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 不需要资源是独立的表。查看此答案以获取另一种解释。 stackoverflow.com/a/31984477/37083如果共享可用的自行车很重要,最好共享链接以重新运行查询,而不是创建资源,因为在您查看时它可能已过期
    • 哇谢谢@gdxn96!感谢您的回答,我学到了一些新东西。继续努力!
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2015-07-29
    相关资源
    最近更新 更多