0

0

mysql搭建酒店预订系统数据库结构设计

P粉602998670

P粉602998670

发布时间:2026-01-20 09:24:09

|

998人浏览过

|

来源于php中文网

原创

酒店预订系统核心是数据关系真实反映业务流转:房间与房型须分离设计,价格动态化需独立pricing表,预订必须绑定具体房间并用应用层+唯一索引防日期重叠,用户与客人信息应解耦,日期统一用DATETIME精确到小时。

mysql搭建酒店预订系统数据库结构设计

酒店预订系统的核心不是功能堆砌,而是数据关系是否能真实反映业务流转——比如一个房间在某天被预订后,必须同时阻断其他订单对该房型+日期的重复占用,这靠外键约束不够,得靠唯一索引+应用层校验双保险。

客房与房型要分离设计,别把房型信息硬编码rooms

常见错误是把 room_type(如“豪华大床房”)、price_per_night 直接存在 rooms 表里,导致调价时要批量更新、新增房型要改表结构。正确做法是拆出 room_types 表,并用外键关联:

CREATE TABLE room_types (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  base_price DECIMAL(10,2) NOT NULL,
  capacity TINYINT DEFAULT 2,
  description TEXT
);

CREATE TABLE rooms ( id INT PRIMARY KEY AUTO_INCREMENT, room_number VARCHAR(10) NOT NULL UNIQUE, type_id INT NOT NULL, status ENUM('available', 'cleaning', 'maintenance', 'occupied') DEFAULT 'available', FOREIGN KEY (type_id) REFERENCES room_types(id) );

  • room_numberUNIQUE 约束,避免人工录入重复房号
  • 别在 rooms 表里存实时价格——价格随季节/活动浮动,应走独立的 room_pricing 表(含 start_date/end_date
  • statusENUM 而非字符串,减少存储和误输入风险

预订记录必须绑定具体房间,且日期范围不可重叠

很多设计只记 check_incheck_out,却没强制关联到某个 room_id,导致无法精确控制“同一房间同一天只能有一个有效订单”。关键在 bookings 表结构和唯一约束:

CREATE TABLE bookings (
  id INT PRIMARY KEY AUTO_INCREMENT,
  room_id INT NOT NULL,
  guest_name VARCHAR(100) NOT NULL,
  check_in DATE NOT NULL,
  check_out DATE NOT NULL,
  status ENUM('confirmed', 'cancelled', 'checked_in', 'checked_out') DEFAULT 'confirmed',
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (room_id) REFERENCES rooms(id),
  CHECK (check_out > check_in)
);

-- 阻止同一房间在时间上有交集的预订 CREATE UNIQUE INDEX idx_room_date_overlap ON bookings (room_id, check_in, check_out);

  • 仅靠这个索引还不够——MySQL 的 UNIQUE 索引不能自动检测区间重叠(比如 A:2024-05-01~05-03,B:2024-05-02~05-04),它只对三字段组合值唯一。真要防重叠,得在应用层查 SELECT 1 FROM bookings WHERE room_id = ? AND check_in ?
  • status 字段必须,否则无法区分“已取消但占着日期”的脏数据
  • 别省略 CHECK (check_out > check_in),防止插入逻辑错误日期

用户和订单解耦,避免用 users 表直接存客人证件信息

酒店常需为非注册用户(如电话预订)下单,若把身份证号、手机号全塞进 users 表,会导致大量空值或滥用主账号。更合理的是分层:

kgogoprime
kgogoprime

KGOGOMall 是一套采用 Php + MySql 开发的基于 WEB 应用的 B/S 架构的B2C网上商店系统。具有完善的商品管理、订单管理、销售统计、新闻管理、结算系统、税率系统、模板系统、搜索引擎优化,数据备份恢复,会员积分折扣功能,不同的会员有不同的折扣,支持多语言,模板和代码分离等,轻松创建属于自己的个性化用户界面。主要面向企业和大中型网商提供最佳保障,最大化满足客户目前及今后的独立

下载
  • users 表只管登录凭证(emailpassword_hashis_staff
  • guests 表存真实入住人信息(id_cardphonereal_name),可被多个订单复用
  • bookings 表加 guest_id 外键,指向 guests.id;同时保留 created_by_user_id(可为空),表示谁下的单

这样既支持散客快速下单,又保留会员积分、历史订单归因能力。

别忽略凌晨 0 点的时间精度问题

MySQL 的 DATE 类型会丢掉时间部分,导致 check_in = '2024-05-01' 实际含义模糊——是 5 月 1 日 00:00 还是 12:00?预订系统必须明确:

  • 所有日期字段统一用 DATETIME,并约定:check_in 指入住日 14:00 后(标准入住时间),check_out 指离店日 12:00 前(标准退房时间)
  • 查询“某日可用房间”时,条件写成:WHERE ? NOT BETWEEN check_in AND check_out,注意 BETWEEN 是闭区间,得配合业务规则调整边界
  • 应用层入库前,把用户选的“入住日期”自动转为当天 14:00 的 DATETIME,别依赖前端传时间

时间粒度错一层,库存就可能超卖。这个细节在压测时最容易暴露,但设计阶段就该定死。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

664

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

255

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

530

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 804人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号