数据库设计:处理可用性

Posted

技术标签:

【中文标题】数据库设计:处理可用性【英文标题】: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

【问题讨论】:

【参考方案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!感谢您的回答,我学到了一些新东西。继续努力!

以上是关于数据库设计:处理可用性的主要内容,如果未能解决你的问题,请参考以下文章

MySQL性能管理及架构设计:数据库结构优化高可用架构设计数据库索引优化...

Redis源码阅读高可用设计——复制

架构设计的一些原则

20 数据存储服务器集群的伸缩性设计

20 数据存储服务器集群的伸缩性设计

20 数据存储服务器集群的伸缩性设计