图书管理系统数据库设计

一、系统概述

图书管理系统旨在实现图书信息的数字化管理,涵盖图书编目、借阅管理、用户服务等功能模块。本数据库设计基于关系型模型,采用范式化设计保证数据一致性,支持高并发操作和复杂查询需求。

二、核心实体设计

1. 图书表(books)

– ISBN(主键,CHAR(13))

– 书名(title VARCHAR(200))

– 出版日期(publish_date DATE)

– 出版社ID(publisher_id INT)

– 分类ID(category_id INT)

– 总库存(total_copies INT)

– 可用库存(available_copies INT)

– 封面图片(cover_url VARCHAR(255))

2. 作者表(authors)

– 作者ID(主键,INT AUTO_INCREMENT)

– 姓名(name VARCHAR(100))

– 国籍(nationality VARCHAR(50))

– 简介(bio TEXT)

3. 用户表(users)

– 用户ID(主键,INT AUTO_INCREMENT)

– 姓名(name VARCHAR(100))

– 邮箱(email VARCHAR(100) UNIQUE)

– 手机(phone CHAR(11))

– 注册日期(reg_date DATE)

– 账户状态(status ENUM(‘正常’,’冻结’,’注销’))

– 密码哈希(password_hash CHAR(60))

4. 出版社表(publishers)

– 出版社ID(主键,INT AUTO_INCREMENT)

– 名称(name VARCHAR(150) UNIQUE)

– 地址(address VARCHAR(200))

– 联系电话(tel VARCHAR(20))

三、关系表设计

1. 图书作者关系表(book_authors)

– ISBN(外键)

– 作者ID(外键)

– 联合主键(ISBN, author_id)

2. 借阅记录表(borrow_records)

– 记录ID(主键,BIGINT)

– 用户ID(外键)

– ISBN(外键)

– 借阅日期(borrow_date DATE)

– 应还日期(due_date DATE)

– 实际归还日期(return_date DATE)

– 状态(status ENUM(‘借出’,’已还’,’逾期’))

3. 分类表(categories)

– 分类ID(主键,INT)

– 分类名称(name VARCHAR(50))

– 父分类ID(parent_id INT) 自引用外键

四、关键设计要素

1. 索引优化

– 图书表:建立书名前缀索引(title(20))、ISBN唯一索引

– 用户表:邮箱唯一索引、手机号索引

– 借阅记录表:组合索引(user_id, status)

2. 数据完整性

– 外键级联:删除出版社时自动置空图书表相关记录

– CHECK约束:available_copies ≤ total_copies

– 触发器:借阅时自动减少可用库存

3. 安全设计

– 密码存储:bcrypt加密算法

– 敏感字段加密:用户联系方式AES加密

– 访问控制:视图隔离不同角色数据权限

五、高级功能实现

1. 存储过程

“`sql

CREATE PROCEDURE BorrowBook(

IN user_id INT,

IN isbn CHAR(13),

OUT result INT)

BEGIN

START TRANSACTION;

UPDATE books SET available_copies = available_copies -1

WHERE ISBN = isbn AND available_copies >0;

INSERT INTO borrow_records(…)

VALUES(user_id, isbn, CURDATE(), …);

COMMIT;

END

“`

2. 物化视图

“`sql

CREATE VIEW Book_Detail_View AS

SELECT b., GROUP_CONCAT(a.name) AS authors,

p.name AS publisher, c.name AS category

FROM books b

JOIN book_authors ba ON b.ISBN = ba.ISBN

JOIN authors a ON ba.author_id = a.author_id

JOIN publishers p ON b.publisher_id = p.publisher_id

JOIN categories c ON b.category_id = c.category_id

GROUP BY b.ISBN;

“`

六、性能优化策略

1. 读写分离:主库处理借还事务,从库支持查询

2. 分区表:按出版年份对借阅记录进行范围分区

3. 缓存机制:使用Redis缓存热门图书信息和用户借阅状态

4. 异步处理:借阅历史记录采用消息队列异步写入

本设计满足图书馆日常业务需求,支持日均万级借阅操作,通过合理的索引和分区策略保证查询效率。预留扩展字段支持未来功能升级,如电子书资源管理、在线阅读统计等模块的扩展接入。