首先设计酒店、房间、客户和预订四张核心表,通过主外键关联;其次创建索引提升查询效率并添加约束确保数据完整性;最后通过SQL查询实现房间可用性检查与预订功能。

在 MySQL 中开发酒店预订系统数据库,关键是设计清晰、规范的数据结构,确保能高效管理酒店、房间、客户和预订信息。以下是完整的数据库设计思路与实现方法。
1. 确定核心数据表
一个基础的酒店预订系统需要以下几个主要数据表:
- hotels:存储酒店基本信息
- rooms:存储房间类型和详情
- customers:存储客户资料
- bookings:存储预订记录
2. 设计各数据表结构
每个表应包含必要的字段,并设置合适的主键、外键和约束。
(1)酒店表 (hotels)
CREATE TABLE hotels ( hotel_id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, address TEXT, phone VARCHAR(20), email VARCHAR(100), star_rating TINYINT DEFAULT 5, created_at DATETIME DEFAULT CURRENT_TIMESTAMP );
(2)房间表 (rooms)
CREATE TABLE rooms (
room_id INT AUTO_INCREMENT PRIMARY KEY,
hotel_id INT,
room_type ENUM('Single', 'Double', 'Suite', 'Family') NOT NULL,
price DECIMAL(8,2) NOT NULL,
description TEXT,
max_occupancy TINYINT DEFAULT 2,
is_active BOOLEAN DEFAULT TRUE,
FOREIGN KEY (hotel_id) REFERENCES hotels(hotel_id) ON DELETE CASCADE
);
(3)客户表 (customers)
CREATE TABLE customers ( customer_id INT AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(50) NOT NULL, last_name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, phone VARCHAR(20), id_number VARCHAR(50), -- 如身份证或护照号 created_at DATETIME DEFAULT CURRENT_TIMESTAMP );
(4)预订表 (bookings)
CREATE TABLE bookings (
booking_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
room_id INT,
check_in DATE NOT NULL,
check_out DATE NOT NULL,
status ENUM('confirmed', 'cancelled', 'completed') DEFAULT 'confirmed',
total_price DECIMAL(10,2),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id),
FOREIGN KEY (room_id) REFERENCES rooms(room_id)
);
3. 添加关键索引和约束
为提升查询效率,应在常用查询字段上建立索引:
PHP商城系统是国内领先商城系统,网店系统,购物系统,网上商城系统,B2C商城系统产品.同时也是一个商业的PHP开发框架。PHP 商城系统由内容、文章、会员、留言、订单、 财务、广告、短消息、数据库管理、营销推广、内置支付管理、商品配送管理、无限级分类、全站搜索等多个功能模块插件组成。在当今瞬机万变的市场环境中,快速高效的IT解决方案是您业务成功的关键。我们PHP商城系统能为您量身打造完全符合需求
- 在 bookings.check_in 和 check_out 上建索引,便于查找空房
- 在 rooms.hotel_id 上已有外键索引,加快按酒店查房
- 在 customers.email 上建立唯一索引防止重复注册
添加检查约束(MySQL 8.0+ 支持)确保日期合理:
ALTER TABLE bookings ADD CONSTRAINT chk_dates CHECK (check_out > check_in);
4. 实现房间可用性查询
最关键的业务逻辑是判断某房间在指定日期是否可订。使用以下查询排除已被预订的时间段:
SELECT r.room_id, r.room_type, r.price
FROM rooms r
WHERE r.hotel_id = 1
AND r.is_active = TRUE
AND r.room_id NOT IN (
SELECT b.room_id
FROM bookings b
WHERE b.status = 'confirmed'
AND ((b.check_in < '2025-04-10' AND b.check_out > '2025-04-05'))
);
这段 SQL 查找酒店 ID 为 1 的所有在 2025-04-05 到 2025-04-10 期间可用的房间。
5. 插入示例数据测试
插入一条测试预订:
INSERT INTO bookings (customer_id, room_id, check_in, check_out, total_price, status) VALUES (1, 101, '2025-04-05', '2025-04-10', 500.00, 'confirmed');
确保外键关联的 customer_id 和 room_id 存在,否则会报错。
基本上就这些。设计时注意数据一致性,用事务处理预订操作,避免超订。后续可扩展发票、支付、评论等功能表。









