3.3 数据库结构与初始化¶
学习目标¶
- 了解数据库的表结构
- 掌握SQL建表语句
- 掌握SQL插入数据
一、数据库定义¶
SQL 脚本,创建票务和天气数据库表。定义数据结构,确保 MCP 服务器能查询存储的数据。
项目中的定位:数据基础,存储天气和票务信息。
核心功能:创建表、设置唯一键和注释。
数据库概述:
-
数据库名称:travel_rag
-
字符集:utf8mb4(支持中文等复杂字符)
-
校对规则:utf8mb4_unicode_ci(大小写不敏感,适合多语言)
-
作用:存储票务数据(火车票、机票、演唱会票),供 mcp_ticket_server.py 查询,支持 ticket_server.py 的票务查询功能。存储天气数据,供mcp_weather_server.py查询,支持weather_server.py天气查询功能。

二、建库¶
代码路径:SmartVoyage/sql
DROP DATABASE IF EXISTS travel_rag;
CREATE DATABASE travel_rag CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE travel_rag;
三、train_tickets(火车票表)¶
作用:存储火车票信息,记录出发地、目的地、时间、车次等。
CREATE TABLE train_tickets (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自增,唯一标识每条记录
departure_city VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 出发城市(如“北京”)
arrival_city VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 到达城市(如“上海”)
departure_time DATETIME NOT NULL, -- 出发时间(如“2025-08-12 07:00:00”)
arrival_time DATETIME NOT NULL, -- 到达时间(如“2025-08-12 11:30:00”)
train_number VARCHAR(20) NOT NULL, -- 火车车次(如“G1001”)
seat_type VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 座位类型(如“二等座”)
total_seats INT NOT NULL, -- 总座位数(如 1000)
remaining_seats INT NOT NULL, -- 剩余座位数(如 50)
price DECIMAL(10, 2) NOT NULL, -- 票价(如 553.50)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间,自动记录插入时间
UNIQUE KEY unique_train (departure_time, train_number) -- 唯一约束,确保同一时间和车次不重复
);
四、flight_tickets(机票表)¶
作用:存储机票信息,记录航班、舱位、时间等。
CREATE TABLE flight_tickets (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自增,唯一标识每条记录
departure_city VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 出发城市(如“北京”)
arrival_city VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 到达城市(如“上海”)
departure_time DATETIME NOT NULL, -- 出发时间(如“2025-08-12 08:00:00”)
arrival_time DATETIME NOT NULL, -- 到达时间(如“2025-08-12 10:30:00”)
flight_number VARCHAR(20) NOT NULL, -- 航班号(如“CA1234”)
cabin_type VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 舱位类型(如“经济舱”)
total_seats INT NOT NULL, -- 总座位数(如 200)
remaining_seats INT NOT NULL, -- 剩余座位数(如 10)
price DECIMAL(10, 2) NOT NULL, -- 票价(如 1200.00)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间,自动记录插入时间
UNIQUE KEY unique_flight (departure_time, flight_number) -- 唯一约束,确保同一时间和航班号不重复
);
五、concert_tickets(演唱会票表)¶
作用:存储演唱会票信息,记录艺人、场地、时间等。
CREATE TABLE concert_tickets (
id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自增,唯一标识每条记录
artist VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 艺人名称(如“周杰伦”)
city VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 举办城市(如“上海”)
venue VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 场馆(如“上海体育场”)
start_time DATETIME NOT NULL, -- 开始时间(如“2025-08-12 19:00:00”)
end_time DATETIME NOT NULL, -- 结束时间(如“2025-08-12 22:00:00”)
ticket_type VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, -- 票类型(如“VIP”)
total_seats INT NOT NULL, -- 总座位数(如 5000)
remaining_seats INT NOT NULL, -- 剩余座位数(如 100)
price DECIMAL(10, 2) NOT NULL, -- 票价(如 880.00)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间,自动记录插入时间
UNIQUE KEY unique_concert (start_time, artist, ticket_type) -- 唯一约束,确保同一时间、艺人和票类型不重复
);
六、weather_data(天气表)¶
作用:存储城市天气信息,城市名称、最高温度、最低温度等。 https://dev.qweather.com/docs/api/weather/weather-daily-forecast/
DROP TABLE IF EXISTS weather_data;
CREATE TABLE IF NOT EXISTS weather_data (
id INT AUTO_INCREMENT PRIMARY KEY,
city VARCHAR(50) NOT NULL COMMENT '城市名称',
fx_date DATE NOT NULL COMMENT '预报日期',
sunrise TIME COMMENT '日出时间',
sunset TIME COMMENT '日落时间',
moonrise TIME COMMENT '月升时间',
moonset TIME COMMENT '月落时间',
moon_phase VARCHAR(20) COMMENT '月相名称',
moon_phase_icon VARCHAR(10) COMMENT '月相图标代码',
temp_max INT COMMENT '最高温度',
temp_min INT COMMENT '最低温度',
icon_day VARCHAR(10) COMMENT '白天天气图标代码',
text_day VARCHAR(20) COMMENT '白天天气描述',
icon_night VARCHAR(10) COMMENT '夜间天气图标代码',
text_night VARCHAR(20) COMMENT '夜间天气描述',
wind360_day INT COMMENT '白天风向360角度',
wind_dir_day VARCHAR(20) COMMENT '白天风向',
wind_scale_day VARCHAR(10) COMMENT '白天风力等级',
wind_speed_day INT COMMENT '白天风速 (km/h)',
wind360_night INT COMMENT '夜间风向360角度',
wind_dir_night VARCHAR(20) COMMENT '夜间风向',
wind_scale_night VARCHAR(10) COMMENT '夜间风力等级',
wind_speed_night INT COMMENT '夜间风速 (km/h)',
precip DECIMAL(5,1) COMMENT '降水量 (mm)',
uv_index INT COMMENT '紫外线指数',
humidity INT COMMENT '相对湿度 (%)',
pressure INT COMMENT '大气压强 (hPa)',
vis INT COMMENT '能见度 (km)',
cloud INT COMMENT '云量 (%)',
update_time DATETIME COMMENT '数据更新时间',
UNIQUE KEY unique_city_date (city, fx_date)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='天气数据表';
七、数据插入¶
运行 SmartVoyage/sql/insert_data.sql 插入测试数据。
本节小结¶
本节主要描述了smartVoyage数据库的定义、创建和插入数据的全过程。