上下文:

最好的例子是 AirBnB。假设我有 5 套公寓。每间公寓都有一个日历,代表它的可用性。当度假者前往我的城市并使用给定的开始日期和结束日期搜索公寓时,如果该时间段在我的任何公寓的日历上显示为可用,我希望这些公寓显示在搜索结果中游客。

一点点:

显然上面有很多。这个问题的范围是我应该如何为包含可用性的公寓列表设置数据库。在构建数据库之前,我花了一些时间在 Excel 中手动协调,以便在脑海中更清晰地了解一切应该是什么样子。在 Excel 中,我发现可以用作表格的列标题的是:

  • 公寓名称
  • owner_id
  • 公寓_描述
  • 日历

  • 现在的日历是我遇到的问题。从字面上看,在我的 Excel 中,列只是持续到永恒的日期。每当度假者提交请求时,我都会找到每个日期单元格为空(例如,可用)的所有公寓。然后我将这些公寓送给度假者。当他/她进行预订时,我会返回 Excel 并在所选的特定公寓的每个日期单元格中标记不可用。

    我想获得更多意见......这是我应该在 PostGreSQL 中想象我的数据库的正确方式吗?如果是这样......我可以进行如下所示的迁移吗?
    class CreateApartments < ActiveRecord::Migration
      def change
        create_table :apartments do |t|
          t.string  :apt_name
          t.integer :apt_owner
          t.text    :apt_description
    
          Date.today..Date.new(2034, 12, 31)).each do |date|
              t.date :date
          end
    
          t.timestamps
        end
      end
    end
    

    最佳答案

    您不应该存储可用性,而是相反(公寓是在特定日期预订的)。如果没有任何更深入的分析,我会做一些简单的事情:

    owner
      owner_id
      owner_name
    
    apartment
      apartment_id
      apartment_name
      apartment_description
      owner_id
    
    customer
      customer_id
      customer_name
    
    booking
      booking_id
      customer_id
      apartment_id
      booking_start
      booking_end
    

    如果可以预订不相交的日子:
    booking
      booking_id
      customer_id
      apartment_id
    
    booking_calendar
      booking_id
      booking_date
    

    在任何情况下,您都可以很容易地返回可用公寓的列表。
    select
     *
    from
     apartments a
     where not exists
      (select
         1
       from
         bookings b
       where
          a.apartment_id = b.apartment_id
          and (
            <<required_start>> between booking_start and booking_end
            or
            <<required_end>> between booking_start and booking_end
            )
    

    关于sql - 如何创建一个数据库来显示一组公寓的可用性日历?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24066719/

    10-11 06:07