简介:本文基于数据库课程设计要求,以图书馆管理系统为案例,系统阐述数据库设计、功能实现及优化策略,为开发者提供从需求分析到系统部署的全流程参考。
图书馆管理系统是数据库应用开发的经典场景,其核心目标是通过结构化数据管理实现图书借阅、读者服务、库存管理等业务的自动化。本实验以数据库课程设计为契机,聚焦以下目标:
实验采用MySQL作为数据库管理系统,结合Java语言实现前端交互,形成完整的“数据库-应用层”架构。
图书馆业务涉及三大核心实体:
通过业务访谈与流程梳理,明确以下关键约束:
基于需求分析,构建E-R模型(图1):
图1:图书馆管理系统E-R图
根据E-R图转换为关系模型,设计以下数据表:
-- 读者表CREATE TABLE Reader (reader_id VARCHAR(20) PRIMARY KEY,name VARCHAR(50) NOT NULL,phone VARCHAR(15),max_borrow_count INT DEFAULT 5,status TINYINT DEFAULT 1 -- 1:正常, 0:冻结);-- 图书表CREATE TABLE Book (isbn VARCHAR(13) PRIMARY KEY,title VARCHAR(100) NOT NULL,author VARCHAR(50),publisher VARCHAR(100),stock INT DEFAULT 1,category VARCHAR(30));-- 借阅记录表CREATE TABLE BorrowRecord (record_id VARCHAR(30) PRIMARY KEY,reader_id VARCHAR(20),isbn VARCHAR(13),borrow_date DATE NOT NULL,return_date DATE,status TINYINT DEFAULT 0, -- 0:借出中, 1:已归还, 2:超期FOREIGN KEY (reader_id) REFERENCES Reader(reader_id),FOREIGN KEY (isbn) REFERENCES Book(isbn));
借阅流程需完成以下操作:
max_borrow_count);stock > 0);
-- 借阅操作示例DELIMITER //CREATE PROCEDURE BorrowBook(IN p_reader_id VARCHAR(20),IN p_isbn VARCHAR(13))BEGINDECLARE current_count INT;DECLARE book_stock INT;-- 检查读者借阅数量SELECT COUNT(*) INTO current_countFROM BorrowRecordWHERE reader_id = p_reader_id AND status = 0;-- 检查图书库存SELECT stock INTO book_stockFROM BookWHERE isbn = p_isbn;IF current_count < (SELECT max_borrow_count FROM Reader WHERE reader_id = p_reader_id)AND book_stock > 0 THEN-- 更新库存UPDATE Book SET stock = stock - 1 WHERE isbn = p_isbn;-- 创建借阅记录INSERT INTO BorrowRecord (record_id, reader_id, isbn, borrow_date, status)VALUES (CONCAT('R', UNIX_TIMESTAMP()), p_reader_id, p_isbn, CURDATE(), 0);ELSESIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '借阅失败:超出限额或库存不足';END IF;END //DELIMITER ;
为避免超售(同一本书被多人同时借阅),需通过事务实现行级锁:
START TRANSACTION;-- 查询时加锁(SELECT ... FOR UPDATE)SELECT stock FROM Book WHERE isbn = '9787111542826' FOR UPDATE;-- 执行更新UPDATE Book SET stock = stock - 1 WHERE isbn = '9787111542826';COMMIT;
针对高频查询字段(如reader_id、isbn)创建索引:
CREATE INDEX idx_reader_id ON BorrowRecord(reader_id);CREATE INDEX idx_isbn ON BorrowRecord(isbn);
通过EXPLAIN分析查询执行计划,验证索引使用效果。
| 测试场景 | 输入数据 | 预期结果 |
|---|---|---|
| 正常借阅 | 读者A借阅图书X | 库存减1,记录状态为“借出中” |
| 库存不足 | 读者B借阅库存为0的图书Y | 提示“库存不足” |
| 超期归还 | 读者C超期3天归还图书Z | 计算滞纳金并更新状态 |
使用JMeter模拟100并发用户执行借阅操作,结果如下:
category字段分表;本实验通过图书馆管理系统案例,完整展示了数据库设计从需求分析到性能优化的全流程。关键收获包括: