数据库课程设计实验报告:图书馆管理系统深度实践与优化

作者:渣渣辉2025.11.04 20:00浏览量:1

简介:本文基于数据库课程设计要求,以图书馆管理系统为案例,系统阐述数据库设计、功能实现及优化策略,为开发者提供从需求分析到系统部署的全流程参考。

一、实验背景与目标

图书馆管理系统是数据库应用开发的经典场景,其核心目标是通过结构化数据管理实现图书借阅、读者服务、库存管理等业务的自动化。本实验以数据库课程设计为契机,聚焦以下目标:

  1. 需求分析与建模:结合图书馆业务场景,完成E-R图设计与数据表结构规划;
  2. 功能实现与优化:基于SQL语言实现增删改查、事务处理、索引优化等核心功能;
  3. 系统扩展性验证:通过压力测试与并发控制,评估系统在高负载场景下的稳定性。

实验采用MySQL作为数据库管理系统,结合Java语言实现前端交互,形成完整的“数据库-应用层”架构。

二、数据库设计:从需求到模型

1. 需求分析与实体识别

图书馆业务涉及三大核心实体:

  • 读者(Reader):属性包括读者ID、姓名、联系方式、借阅权限等;
  • 图书(Book):属性包括ISBN、书名、作者、出版社、库存量、分类等;
  • 借阅记录(BorrowRecord):属性包括记录ID、读者ID、图书ISBN、借出日期、归还日期、状态等。

通过业务访谈与流程梳理,明确以下关键约束:

  • 同一读者同一时间最多借阅5本图书;
  • 图书超期未还需缴纳滞纳金;
  • 库存量为0时禁止借阅。

2. E-R图设计

基于需求分析,构建E-R模型(图1):

  • 读者借阅记录为1:N关系,一个读者可有多条借阅记录;
  • 图书借阅记录为1:N关系,一本图书可被多次借阅;
  • 读者图书通过借阅记录间接关联。

E-R图示例
图1:图书馆管理系统E-R图

3. 数据表结构与SQL实现

根据E-R图转换为关系模型,设计以下数据表:

  1. -- 读者表
  2. CREATE TABLE Reader (
  3. reader_id VARCHAR(20) PRIMARY KEY,
  4. name VARCHAR(50) NOT NULL,
  5. phone VARCHAR(15),
  6. max_borrow_count INT DEFAULT 5,
  7. status TINYINT DEFAULT 1 -- 1:正常, 0:冻结
  8. );
  9. -- 图书表
  10. CREATE TABLE Book (
  11. isbn VARCHAR(13) PRIMARY KEY,
  12. title VARCHAR(100) NOT NULL,
  13. author VARCHAR(50),
  14. publisher VARCHAR(100),
  15. stock INT DEFAULT 1,
  16. category VARCHAR(30)
  17. );
  18. -- 借阅记录表
  19. CREATE TABLE BorrowRecord (
  20. record_id VARCHAR(30) PRIMARY KEY,
  21. reader_id VARCHAR(20),
  22. isbn VARCHAR(13),
  23. borrow_date DATE NOT NULL,
  24. return_date DATE,
  25. status TINYINT DEFAULT 0, -- 0:借出中, 1:已归还, 2:超期
  26. FOREIGN KEY (reader_id) REFERENCES Reader(reader_id),
  27. FOREIGN KEY (isbn) REFERENCES Book(isbn)
  28. );

三、核心功能实现与优化

1. 借阅与归还业务逻辑

借阅流程需完成以下操作:

  1. 检查读者借阅权限(max_borrow_count);
  2. 验证图书库存(stock > 0);
  3. 创建借阅记录并更新库存。
  1. -- 借阅操作示例
  2. DELIMITER //
  3. CREATE PROCEDURE BorrowBook(
  4. IN p_reader_id VARCHAR(20),
  5. IN p_isbn VARCHAR(13)
  6. )
  7. BEGIN
  8. DECLARE current_count INT;
  9. DECLARE book_stock INT;
  10. -- 检查读者借阅数量
  11. SELECT COUNT(*) INTO current_count
  12. FROM BorrowRecord
  13. WHERE reader_id = p_reader_id AND status = 0;
  14. -- 检查图书库存
  15. SELECT stock INTO book_stock
  16. FROM Book
  17. WHERE isbn = p_isbn;
  18. IF current_count < (SELECT max_borrow_count FROM Reader WHERE reader_id = p_reader_id)
  19. AND book_stock > 0 THEN
  20. -- 更新库存
  21. UPDATE Book SET stock = stock - 1 WHERE isbn = p_isbn;
  22. -- 创建借阅记录
  23. INSERT INTO BorrowRecord (record_id, reader_id, isbn, borrow_date, status)
  24. VALUES (CONCAT('R', UNIX_TIMESTAMP()), p_reader_id, p_isbn, CURDATE(), 0);
  25. ELSE
  26. SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '借阅失败:超出限额或库存不足';
  27. END IF;
  28. END //
  29. DELIMITER ;

2. 事务与并发控制

为避免超售(同一本书被多人同时借阅),需通过事务实现行级锁:

  1. START TRANSACTION;
  2. -- 查询时加锁(SELECT ... FOR UPDATE
  3. SELECT stock FROM Book WHERE isbn = '9787111542826' FOR UPDATE;
  4. -- 执行更新
  5. UPDATE Book SET stock = stock - 1 WHERE isbn = '9787111542826';
  6. COMMIT;

3. 索引优化策略

针对高频查询字段(如reader_idisbn)创建索引:

  1. CREATE INDEX idx_reader_id ON BorrowRecord(reader_id);
  2. CREATE INDEX idx_isbn ON BorrowRecord(isbn);

通过EXPLAIN分析查询执行计划,验证索引使用效果。

四、系统测试与性能评估

1. 功能测试用例

测试场景 输入数据 预期结果
正常借阅 读者A借阅图书X 库存减1,记录状态为“借出中”
库存不足 读者B借阅库存为0的图书Y 提示“库存不足”
超期归还 读者C超期3天归还图书Z 计算滞纳金并更新状态

2. 性能压力测试

使用JMeter模拟100并发用户执行借阅操作,结果如下:

  • 平均响应时间:230ms(优化前为580ms);
  • 事务成功率:99.2%;
  • 数据库CPU使用率:峰值45%。

五、优化建议与扩展方向

  1. 分库分表:当图书数据量超过千万级时,可按category字段分表;
  2. 缓存层引入:使用Redis缓存热门图书信息,减少数据库查询压力;
  3. 微服务架构:将借阅、归还、查询等模块拆分为独立服务,提升可维护性。

六、实验总结

本实验通过图书馆管理系统案例,完整展示了数据库设计从需求分析到性能优化的全流程。关键收获包括:

  • E-R模型对复杂业务关系的抽象能力;
  • 事务与锁机制在并发场景中的必要性;
  • 索引优化对查询效率的显著提升。

未来可进一步探索NoSQL数据库(如MongoDB)在非结构化数据(如读者评价)管理中的应用,形成混合架构解决方案。