Sql 因维护或类似原因而无法使用房间的ns。您可能还希望跟踪此类“不可用”情况,然后返回可用的房间。关于范围的优点。存储预订或可用性是否更有意义取决于对于所讨论的应用程序来说,让用户告诉您他们的公寓何时可用或何时不可用是否更好。选择一个可能对你的用户群来说工作量
Sql 因维护或类似原因而无法使用房间的ns。您可能还希望跟踪此类“不可用”情况,然后返回可用的房间。关于范围的优点。存储预订或可用性是否更有意义取决于对于所讨论的应用程序来说,让用户告诉您他们的公寓何时可用或何时不可用是否更好。选择一个可能对你的用户群来说工作量,sql,ruby-on-rails,database,postgresql,database-design,Sql,Ruby On Rails,Database,Postgresql,Database Design,因维护或类似原因而无法使用房间的ns。您可能还希望跟踪此类“不可用”情况,然后返回可用的房间。关于范围的优点。存储预订或可用性是否更有意义取决于对于所讨论的应用程序来说,让用户告诉您他们的公寓何时可用或何时不可用是否更好。选择一个可能对你的用户群来说工作量较小的。 class CreateApartments < ActiveRecord::Migration def change create_table :apartments do |t| t.string
因维护或类似原因而无法使用房间的ns。您可能还希望跟踪此类“不可用”情况,然后返回可用的房间。关于范围的优点。存储预订或可用性是否更有意义取决于对于所讨论的应用程序来说,让用户告诉您他们的公寓何时可用或何时不可用是否更好。选择一个可能对你的用户群来说工作量较小的。
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
)
CREATE TABLE `listings` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `listing_availabilities` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`listing_id` int(11) NOT NULL,
`start_time` int(11) NOT NULL,
`end_time` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `start_time` (`start_time`),
KEY `end_time` (`end_time`),
KEY `listing_id` (`listing_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
> SELECT * FROM `listing_availabilities` WHERE `listing_id` = 716384;
> 365 rows in set (0.01 sec)
> SELECT count(*) as exists FROM `listing_availabilities`
> WHERE `listing_id` = 1234
> AND 1481527584 BETWEEN `start_time` AND `end_time`
> LIMIT 1;
> 1 row in set (0.00 sec)
> SELECT *
> FROM listings AS l
> LEFT JOIN listing_availabilities a
> ON a.listing_id = l.id
> AND a.start_time = (SELECT start_time FROM listing_availabilities WHERE l.id = listing_id ORDER BY start_time ASC LIMIT 1)
> LIMIT 50;
> 50 rows in set (0.05 sec)
> SELECT *
> FROM listings AS l
> LEFT JOIN listing_availabilities a
> ON a.listing_id = l.id
> AND a.start_time =
> (SELECT start_time FROM listing_availabilities WHERE l.id = listing_id AND start_time < 1481536932 AND end_time > 1481536932 LIMIT 1)
> WHERE a.start_time IS NOT NULL
> LIMIT 50;
> 50 rows in set (0.05 sec)
> SELECT *
> FROM `listings` AS l
> LEFT JOIN `listing_availabilities` a
> ON a.listing_id = l.id
> AND a.start_time =
> (SELECT `start_time` FROM `listing_availabilities` WHERE l.id = listing_id AND `start_time` < 1481530494 AND `end_time` > 1481530494 LIMIT 1)
> WHERE a.start_time IS NOT NULL
> LIMIT 50;
> Empty set (3.00 sec)
> SELECT l.id, a.start_time, a.end_time
> FROM listings as l
> LEFT JOIN listing_availabilities a
> ON l.id = a.listing_id
> WHERE 1481530494
> BETWEEN a.start_time
> AND a.end_time limit 50;
> Empty set (0.01 sec)
> INSERT INTO `listing_availabilities`
> (listing_id, start_time, end_time)
> VALUES
> (8, 1481689555, 1481689556) ...
> Query OK, 500 rows affected (0.01 sec)
> Records: 500 Duplicates: 0 Warnings: 0
> DELETE FROM `listing_availabilities`
> WHERE `end_time` < 1481671237
> LIMIT 100000;
> Query OK, 100000 rows affected (10.43 sec)
> DELETE FROM `listing_availabilities`
> WHERE end_time < 1481671237
> LIMIT 500;
> Query OK, 500 rows affected (0.09 sec)