电影票务系统的核心业务涵盖影片信息管理、影院排片、座位预订、订单支付、用户账户等多个模块,在mysql中设计对应的数据库时,需要先梳理清楚各业务模块的数据依赖关系,再拆分出合理的实体与表结构,确保数据存储规范且查询高效。
需求分析与核心实体梳理
首先我们需要明确电影票务系统的基础业务需求,核心要支撑的功能包括:用户查看影片信息、选择影院和场次、挑选座位、提交订单并完成支付、查看订单记录。基于这些需求,可以梳理出以下核心实体:
- 用户:存储用户的基础账号信息
- 影片:存储影片的基本属性、上映时间、票价等
- 影院:存储影院的位置、厅室数量等信息
- 影厅:存储单个影厅的座位布局、容纳人数等
- 场次:关联影片、影厅,记录排片时间、剩余座位数
- 座位:关联影厅,记录座位的位置、状态
- 订单:关联用户、场次、座位,记录订单金额、支付状态等
表结构设计
1. 用户表 user
用户表存储用户的基础注册与账号信息,设计如下:
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int | 主键、自增 | 用户唯一ID |
| username | varchar(50) | 非空、唯一 | 用户账号名 |
| password | varchar(100) | 非空 | 加密后的密码 |
| phone | varchar(20) | 唯一 | 用户手机号 |
| create_time | datetime | 默认当前时间 | 注册时间 |
2. 影片表 movie
影片表存储影片的基础信息,设计如下:
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int | 主键、自增 | 影片唯一ID |
| movie_name | varchar(100) | 非空 | 影片名称 |
| duration | int | 非空 | 影片时长,单位分钟 |
| release_date | date | 非空 | 上映日期 |
| price | decimal(10,2) | 非空 | 基础票价 |
| status | tinyint | 默认1 | 状态,1上映中,0下映 |
3. 影院表 cinema
影院表存储影院的基础信息,设计如下:
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int | 主键、自增 | 影院唯一ID |
| cinema_name | varchar(100) | 非空 | 影院名称 |
| address | varchar(200) | 非空 | 影院地址 |
| phone | varchar(20) | 影院联系电话 |
4. 影厅表 hall
影厅表关联影院,存储单个影厅的信息,设计如下:
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int | 主键、自增 | 影厅唯一ID |
| cinema_id | int | 外键关联cinema.id | 所属影院ID |
| hall_name | varchar(50) | 非空 | 影厅名称,如1号厅 |
| seat_row | int | 非空 | 座位行数 |
| seat_col | int | 非空 | 座位列数 |
5. 场次表 schedule
场次表关联影片和影厅,记录排片信息,设计如下:
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int | 主键、自增 | 场次唯一ID |
| movie_id | int | 外键关联movie.id | 关联影片ID |
| hall_id | int | 外键关联hall.id | 关联影厅ID |
| start_time | datetime | 非空 | 场次开始时间 |
| end_time | datetime | 非空 | 场次结束时间 |
| remain_seat | int | 非空 | 剩余座位数 |
6. 座位表 seat
座位表关联影厅,记录每个座位的位置和状态,设计如下:
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int | 主键、自增 | 座位唯一ID |
| hall_id | int | 外键关联hall.id | 所属影厅ID |
| row_num | int | 非空 | 座位行号 |
| col_num | int | 非空 | 座位列号 |
| status | tinyint | 默认0 | 状态,0可用,1已售,2锁定 |
7. 订单表 orders
订单表关联用户、场次,记录订单的完整信息,设计如下:
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int | 主键、自增 | 订单唯一ID |
| order_no | varchar(50) | 非空、唯一 | 订单编号 |
| user_id | int | 外键关联user.id | 下单用户ID |
| schedule_id | int | 外键关联schedule.id | 关联场次ID |
| total_amount | decimal(10,2) | 非空 | 订单总金额 |
| pay_status | tinyint | 默认0 | 支付状态,0未付,1已付,2已取消 |
| create_time | datetime | 默认当前时间 | 下单时间 |
8. 订单座位关联表 order_seat
一个订单可能包含多个座位,通过关联表建立订单和座位的多对多关系,设计如下:
| 字段名 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | int | 主键、自增 | 关联记录ID |
| order_id | int | 外键关联orders.id | 订单ID |
| seat_id | int | 外键关联seat.id | 座位ID |
建表SQL示例
以下是完整的mysql建表SQL语句,包含表结构和基础约束:
-- 创建用户表 CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL COMMENT '用户账号名', `password` varchar(100) NOT NULL COMMENT '加密密码', `phone` varchar(20) DEFAULT NULL COMMENT '手机号', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), UNIQUE KEY `uk_phone` (`phone`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; -- 创建影片表 CREATE TABLE IF NOT EXISTS `movie` ( `id` int(11) NOT NULL AUTO_INCREMENT, `movie_name` varchar(100) NOT NULL COMMENT '影片名称', `duration` int(11) NOT NULL COMMENT '影片时长,单位分钟', `release_date` date NOT NULL COMMENT '上映日期', `price` decimal(10,2) NOT NULL COMMENT '基础票价', `status` tinyint(1) DEFAULT '1' COMMENT '状态,1上映中,0下映', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='影片表'; -- 创建影院表 CREATE TABLE IF NOT EXISTS `cinema` ( `id` int(11) NOT NULL AUTO_INCREMENT, `cinema_name` varchar(100) NOT NULL COMMENT '影院名称', `address` varchar(200) NOT NULL COMMENT '影院地址', `phone` varchar(20) DEFAULT NULL COMMENT '联系电话', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='影院表'; -- 创建影厅表 CREATE TABLE IF NOT EXISTS `hall` ( `id` int(11) NOT NULL AUTO_INCREMENT, `cinema_id` int(11) NOT NULL COMMENT '所属影院ID', `hall_name` varchar(50) NOT NULL COMMENT '影厅名称', `seat_row` int(11) NOT NULL COMMENT '座位行数', `seat_col` int(11) NOT NULL COMMENT '座位列数', PRIMARY KEY (`id`), KEY `idx_cinema_id` (`cinema_id`), CONSTRAINT `fk_hall_cinema` FOREIGN KEY (`cinema_id`) REFERENCES `cinema` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='影厅表'; -- 创建场次表 CREATE TABLE IF NOT EXISTS `schedule` ( `id` int(11) NOT NULL AUTO_INCREMENT, `movie_id` int(11) NOT NULL COMMENT '关联影片ID', `hall_id` int(11) NOT NULL COMMENT '关联影厅ID', `start_time` datetime NOT NULL COMMENT '场次开始时间', `end_time` datetime NOT NULL COMMENT '场次结束时间', `remain_seat` int(11) NOT NULL COMMENT '剩余座位数', PRIMARY KEY (`id`), KEY `idx_movie_id` (`movie_id`), KEY `idx_hall_id` (`hall_id`), KEY `idx_start_time` (`start_time`), CONSTRAINT `fk_schedule_movie` FOREIGN KEY (`movie_id`) REFERENCES `movie` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_schedule_hall` FOREIGN KEY (`hall_id`) REFERENCES `hall` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='场次表'; -- 创建座位表 CREATE TABLE IF NOT EXISTS `seat` ( `id` int(11) NOT NULL AUTO_INCREMENT, `hall_id` int(11) NOT NULL COMMENT '所属影厅ID', `row_num` int(11) NOT NULL COMMENT '座位行号', `col_num` int(11) NOT NULL COMMENT '座位列号', `status` tinyint(1) DEFAULT '0' COMMENT '状态,0可用,1已售,2锁定', PRIMARY KEY (`id`), KEY `idx_hall_id` (`hall_id`), UNIQUE KEY `uk_hall_row_col` (`hall_id`,`row_num`,`col_num`), CONSTRAINT `fk_seat_hall` FOREIGN KEY (`hall_id`) REFERENCES `hall` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='座位表'; -- 创建订单表 CREATE TABLE IF NOT EXISTS `orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_no` varchar(50) NOT NULL COMMENT '订单编号', `user_id` int(11) NOT NULL COMMENT '下单用户ID', `schedule_id` int(11) NOT NULL COMMENT '关联场次ID', `total_amount` decimal(10,2) NOT NULL COMMENT '订单总金额', `pay_status` tinyint(1) DEFAULT '0' COMMENT '支付状态,0未付,1已付,2已取消', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_order_no` (`order_no`), KEY `idx_user_id` (`user_id`), KEY `idx_schedule_id` (`schedule_id`), CONSTRAINT `fk_orders_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_orders_schedule` FOREIGN KEY (`schedule_id`) REFERENCES `schedule` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表'; -- 创建订单座位关联表 CREATE TABLE IF NOT EXISTS `order_seat` ( `id` int(11) NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL COMMENT '订单ID', `seat_id` int(11) NOT NULL COMMENT '座位ID', PRIMARY KEY (`id`), KEY `idx_order_id` (`order_id`), KEY `idx_seat_id` (`seat_id`), UNIQUE KEY `uk_order_seat` (`order_id`,`seat_id`), CONSTRAINT `fk_order_seat_order` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_order_seat_seat` FOREIGN KEY (`seat_id`) REFERENCES `seat` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单座位关联表';
索引与优化建议
为了提升电影票务系统的查询效率,除了建表时添加的常规索引外,还可以根据业务