时间范围预订系统是一种允许用户在特定时间段内预约资源或服务的系统。这类系统广泛应用于会议室预订、酒店房间预订、医生预约、课程安排、设备租赁等领域。
CREATE TABLE resources (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
max_duration INT, -- 最大预订时长(分钟)
min_advance INT, -- 最小提前预订时间(分钟)
max_advance INT -- 最大提前预订时间(分钟)
);
CREATE TABLE bookings (
id INT PRIMARY KEY,
resource_id INT REFERENCES resources(id),
user_id INT,
start_time TIMESTAMP,
end_time TIMESTAMP,
status VARCHAR(20), -- 'confirmed', 'cancelled', 'pending'
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
def is_available(resource_id, desired_start, desired_end):
# 检查资源是否存在
resource = get_resource_by_id(resource_id)
if not resource:
return False
# 检查预订时间是否在允许范围内
now = datetime.now()
min_start = now + timedelta(minutes=resource.min_advance)
max_start = now + timedelta(minutes=resource.max_advance)
if desired_start < min_start or desired_start > max_start:
return False
# 检查持续时间是否超过最大值
duration = (desired_end - desired_start).total_seconds() / 60
if duration > resource.max_duration:
return False
# 检查是否有时间冲突
conflicting_bookings = session.query(Booking).filter(
Booking.resource_id == resource_id,
Booking.status == 'confirmed',
or_(
and_(Booking.start_time < desired_end, Booking.end_time > desired_start),
and_(desired_start < Booking.end_time, desired_end > Booking.start_time)
)
).count()
return conflicting_bookings == 0
原因:
解决方案:
原因:
解决方案:
原因:
解决方案:
# 使用数据库事务和行锁
def make_booking(user_id, resource_id, start_time, end_time):
with session.begin():
# 加锁检查可用性
resource = session.query(Resource).with_for_update().get(resource_id)
if not is_available(resource_id, start_time, end_time):
raise Exception("Resource not available")
# 创建预订
booking = Booking(
user_id=user_id,
resource_id=resource_id,
start_time=start_time,
end_time=end_time,
status='confirmed'
)
session.add(booking)
实现一个健壮的时间范围预订系统需要考虑业务规则、技术实现和用户体验多方面因素。核心是确保时间冲突检测的准确性,同时处理好并发情况下的数据一致性问题。