下面我将为你提供一个完整、详细、可扩展的SQL数据库课程设计方案,你可以根据自己的兴趣和课程要求选择或修改其中的主题。
SQL数据库课程设计方案
项目名称
基于B/S架构的在线图书商城数据库设计

项目背景与意义
随着互联网的飞速发展,电子商务已成为人们日常生活的重要组成部分,在线图书商城作为一种典型的电子商务应用,其背后需要一个稳定、高效、安全的数据库系统来支撑海量的商品信息、用户数据、订单交易等。
本项目旨在设计并实现一个功能完善的在线图书商城数据库系统,通过该课程设计,可以综合运用《数据库原理》课程所学的理论知识,包括:
- 需求分析与数据建模:将现实世界需求转化为信息世界模型。
- 关系数据库理论:掌握实体、属性、联系的设计。
- 数据库规范化:设计无数据冗余、结构合理的数据库表。
- SQL语言:熟练使用DDL、DML、DQL、DCL进行数据定义、操纵、查询和控制。
- 数据库完整性:实现实体完整性、参照完整性和用户定义完整性。
- 数据库安全:通过用户和权限管理保障数据安全。
本设计将模拟一个真实的商业场景,为后续的Web开发或应用程序开发奠定坚实的数据基础。
需求分析
根据在线图书商城的业务流程,我们将其划分为以下几个核心功能模块:

-
用户模块:
- 用户可以注册成为会员。
- 用户可以登录系统。
- 用户可以修改个人信息(如密码、收货地址)。
- 用户可以查看自己的订单历史。
-
商品模块:
- 管理员可以添加、修改、删除图书信息(书名、作者、出版社、价格、库存、简介、封面图等)。
- 用户可以按分类浏览图书。
- 用户可以按书名、作者等关键词搜索图书。
- 用户可以查看图书的详细信息。
-
购物车模块:
- 用户可以将图书加入购物车。
- 用户可以在购物车中修改图书数量或删除商品。
- 用户可以查看购物车中的所有商品及总价。
-
订单模块:

- 用户可以对购物车中的商品进行结算,生成订单。
- 订单需要记录订单号、下单用户、下单时间、收货地址、总金额、订单状态(如:待付款、已发货、已完成、已取消)等。
- 一个订单可以包含多种不同的图书。
-
分类模块:
管理员可以对图书进行分类管理(如:文学、计算机、经管、童书等)。
数据库概念设计 (E-R图)
根据需求分析,我们识别出主要的实体及其属性和关系。
实体与属性:
-
用户:
user_id(用户ID, 主键)username(用户名)password(密码)email(电子邮箱)phone(手机号)address(收货地址)register_date(注册日期)
-
图书:
book_id(图书ID, 主键)title(书名)author(作者)publisher(出版社)publish_date(出版日期)price(价格)stock(库存数量)description(图书简介)cover_image(封面图片URL)category_id(所属分类ID, 外键)
-
分类:
category_id(分类ID, 主键)category_name(分类名称)
-
订单:
order_id(订单ID, 主键)user_id(下单用户ID, 外键)order_date(下单时间)total_amount(订单总金额)status(订单状态)shipping_address(收货地址)
-
购物车:
cart_id(购物车ID, 主键)user_id(所属用户ID, 外键)book_id(图书ID, 外键)quantity(商品数量)
-
订单详情:
detail_id(详情ID, 主键)order_id(所属订单ID, 外键)book_id(图书ID, 外键)quantity(购买数量)price_at_purchase(购买时的单价)
实体间关系:
- 用户 与 订单:一对多 (1:N)。
- 一个用户可以下多个订单。
- 一个订单只属于一个用户。
- 订单 与 订单详情:一对多 (1:N)。
- 一个订单可以包含多种图书(多个订单详情)。
- 一个订单详情只属于一个订单。
- 图书 与 订单详情:一对多 (1:N)。
- 一本图书可以被多个订单购买(出现在多个订单详情中)。
- 一个订单详情只包含一种图书。
- 用户 与 购物车:一对多 (1:N)。
- 一个用户可以有多个购物车项。
- 一个购物车项只属于一个用户。
- 图书 与 购物车:一对多 (1:N)。
- 一本图书可以被多个用户加入购物车(多个购物车项)。
- 一个购物车项只包含一种图书。
- 图书 与 分类:多对一 (N:1)。
- 一本图书只属于一个分类。
- 一个分类下可以有多本图书。
E-R图 (文字描述)
由于无法直接绘制图形,这里用文字描述E-R图的核心结构:
- 实体:用户, 图书, 分类, 订单, 购物车, 订单详情。
- 关系:
- 用户
1-- 订单 - 订单
1-- 订单详情 - 图书
1-- 订单详情 - 用户
1-- 购物车 - 图书
1-- 购物车 - 图书 --
1分类
- 用户
数据库逻辑设计 (关系模式)
将E-R图转换为关系数据库模式(表结构),并应用规范化理论。
用户表 (t_user)
| 字段名 | 数据类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| user_id | INT | PRIMARY KEY, AUTO_INCREMENT | 用户ID,唯一标识 |
| username| VARCHAR(50) | UNIQUE, NOT NULL | 用户名,唯一 |
| password| VARCHAR(255) | NOT NULL | 密码(加密存储) |
| email | VARCHAR(100)| UNIQUE, NOT NULL | 电子邮箱,唯一 |
| phone | VARCHAR(20) | | 手机号 |
| address| TEXT | | 收货地址 |
| register_date| DATETIME | DEFAULT CURRENT_TIMESTAMP | 注册时间 |
分类表 (t_category)
| 字段名 | 数据类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| category_id| INT | PRIMARY KEY, AUTO_INCREMENT | 分类ID |
| category_name| VARCHAR(50)| UNIQUE, NOT NULL | 分类名称,唯一 |
图书表 (t_book)
| 字段名 | 数据类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| book_id | INT | PRIMARY KEY, AUTO_INCREMENT | 图书ID | | VARCHAR(255)| NOT NULL | 书名 |
| author | VARCHAR(100)| NOT NULL | 作者 |
| publisher| VARCHAR(100)| | 出版社 |
| publish_date| DATE | | 出版日期 |
| price | DECIMAL(10,2)| NOT NULL | 价格 |
| stock | INT | DEFAULT 0 | 库存数量 |
| description| TEXT | | 图书简介 |
| cover_image| VARCHAR(255)| | 封面图片路径 |
| category_id| INT | FOREIGN KEY (t_category(category_id)) | 所属分类ID |
购物车表 (t_cart)
| 字段名 | 数据类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| cart_id | INT | PRIMARY KEY, AUTO_INCREMENT | 购物车项ID |
| user_id | INT | FOREIGN KEY (t_user(user_id)), NOT NULL | 所属用户ID |
| book_id | INT | FOREIGN KEY (t_book(book_id)), NOT NULL | 图书ID |
| quantity | INT | DEFAULT 1, NOT NULL | 商品数量 |
订单表 (t_order)
| 字段名 | 数据类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| order_id | VARCHAR(32)| PRIMARY KEY | 订单号(使用UUID或时间戳生成) |
| user_id | INT | FOREIGN KEY (t_user(user_id)), NOT NULL | 下单用户ID |
| order_date| DATETIME | DEFAULT CURRENT_TIMESTAMP | 下单时间 |
| total_amount| DECIMAL(10,2)| NOT NULL | 订单总金额 |
| status | VARCHAR(20)| DEFAULT '待付款' | 订单状态 |
| shipping_address| VARCHAR(255)| NOT NULL | 收货地址 |
订单详情表 (t_order_detail)
| 字段名 | 数据类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| detail_id| INT | PRIMARY KEY, AUTO_INCREMENT | 详情ID |
| order_id | VARCHAR(32)| FOREIGN KEY (t_order(order_id)), NOT NULL | 所属订单ID |
| book_id | INT | FOREIGN KEY (t_book(book_id)), NOT NULL | 图书ID |
| quantity | INT | NOT NULL | 购买数量 |
| price_at_purchase| DECIMAL(10,2)| NOT NULL | 购买时的单价(快照) |
数据库物理设计与实现 (SQL脚本)
这里提供创建上述表结构的SQL脚本(以MySQL为例)。
-- 创建数据库
CREATE DATABASE IF NOT EXISTS online_bookstore_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE online_bookstore_db;
-- 创建分类表
CREATE TABLE t_category (
category_id INT AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(50) NOT NULL UNIQUE
);
-- 创建用户表
CREATE TABLE t_user (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
phone VARCHAR(20),
address TEXT,
register_date DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 创建图书表
CREATE TABLE t_book (
book_id INT AUTO_INCREMENT PRIMARY KEY,VARCHAR(255) NOT NULL,
author VARCHAR(100) NOT NULL,
publisher VARCHAR(100),
publish_date DATE,
price DECIMAL(10, 2) NOT NULL,
stock INT DEFAULT 0,
description TEXT,
cover_image VARCHAR(255),
category_id INT,
FOREIGN KEY (category_id) REFERENCES t_category(category_id)
);
-- 创建购物车表
CREATE TABLE t_cart (
cart_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
book_id INT NOT NULL,
quantity INT DEFAULT 1 NOT NULL,
FOREIGN KEY (user_id) REFERENCES t_user(user_id),
FOREIGN KEY (book_id) REFERENCES t_book(book_id),
UNIQUE KEY (user_id, book_id) -- 一个用户对同一本书只能有一个购物车项
);
-- 创建订单表
CREATE TABLE t_order (
order_id VARCHAR(32) PRIMARY KEY, -- 使用UUID或业务规则生成
user_id INT NOT NULL,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(10, 2) NOT NULL,
status VARCHAR(20) DEFAULT '待付款',
shipping_address VARCHAR(255) NOT NULL,
FOREIGN KEY (user_id) REFERENCES t_user(user_id)
);
-- 创建订单详情表
CREATE TABLE t_order_detail (
detail_id INT AUTO_INCREMENT PRIMARY KEY,
order_id VARCHAR(32) NOT NULL,
book_id INT NOT NULL,
quantity INT NOT NULL,
price_at_purchase DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES t_order(order_id),
FOREIGN KEY (book_id) REFERENCES t_book(book_id)
);
-- 添加一些示例数据 (可选)
INSERT INTO t_category (category_name) VALUES ('文学'), ('计算机'), ('经济管理'), ('童书');
INSERT INTO t_user (username, password, email, address) VALUES ('zhangsan', 'hashed_password_1', 'zhangsan@example.com', '北京市海淀区');
INSERT INTO t_book (title, author, publisher, price, category_id) VALUES ('数据库系统概念', 'Abraham Silberschatz', '机械工业出版社', 128.00, 2);
核心SQL功能实现示例
查询功能
-
查询某用户的所有订单及其包含的图书信息
SELECT o.order_id, o.order_date, o.total_amount, o.status, b.title, b.author, od.quantity, od.price_at_purchase FROM t_order o JOIN t_order_detail od ON o.order_id = od.order_id JOIN t_book b ON od.book_id = b.book_id WHERE o.user_id = 1; -- 假设用户ID为1 -
搜索书名包含“数据库”的图书
SELECT book_id, title, author, price FROM t_book WHERE title LIKE '%数据库%';
更新功能
-
用户下单后,更新图书库存
-- 假设订单ID为 'ORD12345',需要减少图书ID为 1 的图书库存5本 UPDATE t_book SET stock = stock - 5 WHERE book_id = 1;
-
将商品从购物车移入订单(模拟下单)
-- 步骤1: 创建订单 INSERT INTO t_order (order_id, user_id, total_amount, shipping_address) VALUES ('ORD12345', 1, 640.00, '北京市海淀区'); -- 640.00 是总价 -- 步骤2: 将购物车商品插入订单详情表,并清空相关购物车 -- 这是一个事务操作,需要保证原子性 START TRANSACTION; -- 插入订单详情 INSERT INTO t_order_detail (order_id, book_id, quantity, price_at_purchase) SELECT 'ORD12345', book_id, quantity, price FROM t_cart WHERE user_id = 1; -- 清空用户购物车 DELETE FROM t_cart WHERE user_id = 1; -- 提交事务 COMMIT;
数据库安全性与完整性
-
完整性:
- 实体完整性:通过设置主键(
PRIMARY KEY)保证。 - 参照完整性:通过设置外键(
FOREIGN KEY)保证,确保关联数据的有效性。 - 用户定义完整性:
NOT NULL约束确保关键字段不为空。UNIQUE约束确保用户名、邮箱等唯一。DEFAULT约束为字段提供默认值。CHECK约束(如:CHECK (price > 0))确保数据在合理范围内。
- 实体完整性:通过设置主键(
-
安全性:
-
用户与权限管理:
-- 创建一个只能查询数据的普通用户 'read_user' CREATE USER 'read_user'@'localhost' IDENTIFIED BY 'password123'; -- 授予该用户对所有表的SELECT权限 GRANT SELECT ON online_bookstore_db.* TO 'read_user'@'localhost'; -- 创建一个可以读写但不能删除的管理员用户 'admin_user' CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'admin123'; GRANT SELECT, INSERT, UPDATE ON online_bookstore_db.* TO 'admin_user'@'localhost';
-
密码安全:在应用层对用户密码进行哈希(如使用BCrypt)后再存入数据库,而不是明文存储。
-
总结与展望
本课程设计完成了一个在线图书商城数据库系统的全面设计,从需求分析出发,设计了E-R图,并将其转化为规范化的关系模式,通过SQL脚本实现了数据库的物理创建,并提供了核心业务功能的SQL示例,考虑了数据库的完整性和安全性,使其具备实际应用的基础。
展望与扩展:
- 性能优化:为常用查询字段(如
book.title,user.username)添加索引,以提高查询效率。 - 存储过程与触发器:使用存储过程封装复杂业务逻辑(如下单流程);使用触发器实现自动化操作如下单后自动扣减库存。
- 视图:创建视图简化复杂查询,如“热销图书视图”。
- 分表分库:当数据量巨大时,考虑对订单表、日志表等进行水平或垂直拆分。
- 全文检索:集成Elasticsearch等搜索引擎,提供更强大的图书搜索功能。