没想到在课程设计选题清单里一眼看到“酒店管理系统”,而且技术栈还限定在 MySQL + VB.NET。这个组合看起来朴素,但实际做完你会发现,它几乎覆盖了数据库课设的所有核心考点:表结构设计、范式规范化、增删改查、事务处理、权限控制、报表查询。不管你是第一次做课设,还是想把这个项目扩展成毕业设计,这篇文章都会给你一套可以直接照抄的思路和代码。
先说结论:这个项目用 VB.NET 做界面、MySQL 存数据,技术上没有特别前沿的东西,但正因为如此,它特别适合用来把数据库的基础功打扎实。我当年做的时候踩了不少坑,比如中文乱码、连接串写错导致连不上数据库、房间状态并发更新出 bug 等等。这篇文章把我当时的设计思路、建表 SQL、核心代码、还有排查问题的过程全部整理出来,希望能帮你少走弯路。
1. 项目整体设计与技术选型思路
1.1 为什么选 MySQL + VB.NET 这套组合
很多人在选题时会纠结,到底是选 Java + SQL Server,还是 PHP + MySQL,或者干脆用 Python + SQLite。但如果你是做数据库课设,而且老师强调要考察“关系型数据库设计能力”,那么 MySQL + VB.NET 的组合其实是性价比很高的选择。
- MySQL 免费、轻量、教程多:课设环境不需要企业级授权,MySQL Community Server 完全够用。出问题时,中文资料一搜一大把,这对赶工期的课设来说非常关键。
- MySQL 的 SQL 语法贴近标准:从建库建表到增删改查,再到视图、存储过程、触发器,MySQL 的语法都是考试和面试的常见范围。做完这个课设,你对 SQL 的掌握程度会比只写网页后端调用 ORM 的同学扎实很多。
- VB.NET 上手门槛低、拖控件快:虽然 VB.NET 现在不算热门语言,但 Visual Studio 的 WinForms 设计器对新手极其友好,拖几个 Button、DataGridView,双击就能写事件。你不需要花大量时间在前端样式上,可以把精力集中在 SQL 语句和数据库设计上。
- 连接 MySQL 有官方驱动:MySQL Connector/NET 可以直接从官网下载,安装后在 VB.NET 里
Imports MySql.Data.MySqlClient就能用,API 风格和 SqlClient 几乎一样,查资料也很方便。
当然,如果你后续想升级成 Java 版,这套数据库设计基本不需要大改,因为业务逻辑都在 SQL 层,换个语言只是换个数据库访问层而已。
1.2 功能模块划分:让课设看起来“完整但不臃肿”
酒店管理系统的业务范围可大可小,如果你照搬商业 PMS(Property Management System),那工作量会失控。我做课设时给自己定了一个原则:功能覆盖数据库课程的核心考点,但模块数量控制在 6 个以内。最后确定的模块如下。
- 登录与权限模块:区分管理员和前台操作员,用户在
user表中通过role字段区分权限。 - 客房管理模块:房间类型、房间状态(空闲/入住/打扫/维修)的增删改查。
- 客户管理模块:登记入住客户的基本信息,身份证号做唯一约束。
- 入住登记模块:办理入住时创建订单,同时将房间状态改为“入住”。
- 退房结账模块:计算房费(按天计费 + 其他消费),结账后释放房间。
- 统计报表模块:按日/月统计入住率、营收,用 DataGridView 展示查询结果。
这 6 个模块刚好覆盖了数据库的增删改查、多表连接查询、聚合函数、事务处理、唯一约束等核心考点。而且每个模块之间都有明确的外键关联,呈现在 ER 图上非常清晰,答辩时也好讲。
1.3 三层架构的取舍:别照搬项目的三层,但要有分层意识
课设最简单的写法是把所有代码都塞在 Form 的 Click 事件里,这样做确实能跑,但代码会越来越乱。比如多个窗口都要查房间状态,你就得复制粘贴查询代码。
我当时的做法是做一个轻量级的分层:
- UI 层:
.vb窗体文件,只负责获取用户输入、调用逻辑层方法、显示返回数据。 - BLL 层(业务逻辑层):定义
RoomManager、OrderManager、CustomerManager等类,负责校验数据、组合多个数据库操作。比如“办理入住”这个动作,在 BLL 层要先查房间状态,再插入订单,再更新房间,这些步骤如果有一个失败,要回滚。 - DAL 层(数据访问层):定义
DBHelper类,封装MySqlConnection和MySqlCommand的创建、执行、关闭操作。其他类的 SQL 语句通过调用DBHelper来执行,避免每个窗口都写一遍连接字符串。
这样的分层不会增加太多代码量,但答辩时你可以说“我采用了三层架构思想”,并且后续改功能时会轻松很多。要注意的是,课设阶段没必要上 EF(Entity Framework)或 ORM 框架,你手动写 SQL 反而能体现你对数据库的理解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据库设计与建表 SQL 实操
2.1 ER 图设计:从需求到关系模式的转化
在设计表结构之前,先理清酒店管理系统的核心实体和关系。我梳理出了这些实体:
- 用户(User):登录系统的工作人员
- 房间类型(RoomType):标准间、大床房、套房等
- 房间(Room):具体某个房间,如 808 号房
- 客户(Customer):入住客人
- 订单(Order):一次入住记录
- 订单消费项(OrderConsume):房间内产生的额外消费,如mini吧、洗衣服务
实体之间的关系是:一个房间类型对应多个房间(1:N),一个房间可有多条订单历史(1:N),一个客户可有多条订单历史(1:N),一个订单可关联多条消费记录(1:N)。
在课设报告中,这个 ER 图要画清楚。如果老师要求交逻辑结构设计,那么你要给出每个表的关系模式,主键下划线标明,外键用箭头表示。比如订单表应该是这样:
Order(order_id, room_id, customer_id, check_in_date, check_out_date, status, total_amount)
其中 room_id 和 customer_id 是外键。
2.2 建库建表 SQL(含设计原因和个人心得)
我用的是 MySQL 8.0.22 版本,字符集统一设置成 utf8mb4,排序规则用 utf8mb4_general_ci,这是避免中文乱码最关键的一步。
sql复制CREATE DATABASE hotel_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE hotel_db;
-- 用户表
CREATE TABLE `user` (
`user_id` INT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) NOT NULL UNIQUE,
`password` VARCHAR(100) NOT NULL,
`real_name` VARCHAR(50) NOT NULL,
`role` ENUM('admin', 'operator') DEFAULT 'operator',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
用户表的 password 字段不要限制得太小,如果以后你往里面存 MD5 或 SHA-256 的哈希值,32 位或 64 位字符串才放得下。课设阶段为了演示方便可以直接存明文,但答辩时老师问起来,你要能说清楚“实际生产环境会做哈希加密”。
sql复制-- 房间类型表
CREATE TABLE room_type (
type_id INT PRIMARY KEY AUTO_INCREMENT,
type_name VARCHAR(50) NOT NULL,
price DECIMAL(10,2) NOT NULL,
bed_number INT DEFAULT 1,
area INT DEFAULT 20,
remark VARCHAR(200)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 房间表
CREATE TABLE room (
room_id INT PRIMARY KEY AUTO_INCREMENT,
room_no VARCHAR(10) NOT NULL UNIQUE,
type_id INT NOT NULL,
status ENUM('空闲', '入住', '打扫', '维修') DEFAULT '空闲',
floor INT DEFAULT 1,
FOREIGN KEY (type_id) REFERENCES room_type(type_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意 room_no 设置
