多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

SQL Server数据库课程设计:图书管理系统表结构与核心业务实现

SQL Server数据库课程设计:图书管理系统表结构与核心业务实现 简介一份完整的SQL数据库图书管理系统课程设计报告面向数据库原理、SQL应用技术课程设计或图书馆管理信息化项目的学生与开发者。内容针对传统人工管理图书混乱、效率低等问题基于关系型数据库完成读者信息、图书信息、操作员信息三大模块覆盖借书、还书、罚款等业务操作。文档系统梳理了数据库设计方案从存储设计指导思想、E-R图实体关系、数据字典到书籍类别、读者、书籍、借阅、还书、罚款等关系模式并给出SQL实现与查询操作包含建表结构、录入、修改、删除、统计等典型代码可直接参考或扩展用于课程设计与小型管理系统开发。压缩包内共1个doc文件大小709KB属于单文件完整报告便于下载后直接阅读和按章节复现。目前已有2317人学习适合需要快速理解图书管理系统数据库设计全流程、撰写课程设计报告或准备SQL实验的读者。1. 数据库课程设计怎么交差一份能直接跑的图书管理系统完整代码每年这时候都有人为数据库课程设计发愁图书管理系统这个题目被选了无数遍但真正能拿得出手的完整代码并不好找。这份资源恰恰是一个完整的 SQL Server 图书管理系统课程设计包从设计文档到建库建表代码再到业务数据全都有不是那种只有零星片段的半成品。文档里把读者管理、图书分类、借书还书、超期罚款这些核心业务全串起来了查询、统计、修改、删除的 SQL 都写得清清楚楚。适合两类人一类是正在做课程设计需要参考完整流程的学生另一类是想快速搭一个图书管理小系统验证 SQL Server 技术的开发者。2. 先看懂表结构再动手六张表的职责划分与主外键约束2.1 从 E-R 图到关系模式这套设计把业务拆成了几个核心实体拿到这份文档别急着跑代码先把它的设计思路捋一遍。这个系统里一共有六个关系模式书籍类别、读者、书籍、借阅、还书、罚款。对应到 E-R 图上就是六个实体它们之间的关系很明确——书籍类别是一方书籍是多方的从属关系读者和书籍之间通过借阅记录建立多对多联系罚款记录依赖借阅和读者信息。这种拆法在课程设计里是标准做法也符合关系数据库范式的基本要求。书籍类别被单独抽成一张表而不是直接在书里存一个字符串类别名这个设计是这套代码里最值得学的地方。我在实际项目里见过太多把类别直接写死在书籍表里的做法后面想改类别名称就得全表 UPDATE一旦数据量大就很痛苦。单独建一张 book_style 表改个类别名称只需要改一行书籍表完全不用动。再来看数据字典部分文档里每张表的字段、数据类型、是否可空、主外键约束都列出来了这就是数据字典的标准格式。六张表的主键设计是这样的book_style 用 bookstylenosystem_readers 用 readeridsystem_books 用 bookidborrow_record 用 bookidreturn_record 用 bookidreader_fee 用 bookid。这里有个细节要注意后面我专门讲坑。2.2 建库建表脚本拆解从 CREATE DATABASE 到外键约束这份代码用的是 SQL Server 的 T-SQL 语法建库脚本放在最前面-- 创建数据库主数据文件和日志文件分开指定 USE master GO CREATE DATABASE tangzhangsentsg ON ( NAME librarysystem, FILENAME c:\, SIZE 10, MAXSIZE 50, FILEGROWTH 5 ) LOG ON( NAME library, FILENAME c:\, SIZE 5MB, MAXSIZE 25MB, FILEGROWTH 5MB ) GO这段脚本的逻辑是先切到 master 库再创建名为 tangzhangsentsg 的数据库。主数据文件初始大小 10MB最大能长到 50MB按 5MB 的步长自动增长日志文件初始 5MB最大 25MB。注意 FILENAME 这里写的是 c:这是个不完整路径实际运行时多半会报错需要改成实际存在的完整路径比如 C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\tangzhangsentsg.mdf。建表脚本同样值得逐行看-- 书籍类别表主键是类别编号 CREATE TABLE book_style( bookstyleno varchar(30) primary key, bookstyle varchar(30) ) GO -- 书籍表类别编号作为外键引用 book_style CREATE TABLE system_books( bookid varchar(20) primary key, bookname varchar(30) Not null, bookstyleno varchar(30) Not null, bookauthor varchar(30), bookpub varchar(30), bookpubdate datetime, bookindate datetime, isborrowed varchar(2), foreign key (bookstyleno) references book_style (bookstyleno) )注意 system_books 表里的 isborrowed 字段这是一个状态标记用 1 表示未借出0 表示已借出。这个字段在数据处理那节会频繁用到。外键约束保证了书籍的类别编号一定能在 book_style 表里找到对应记录这就是引用完整性。如果往 system_books 里插入一个不存在的类别编号SQL Server 会直接拒绝。reader_fee 罚款表的结构需要注意一下它包含了 readerid、readername、bookid、bookname 还有 bookfee、borrowdate相当于把读者信息和借书信息冗余了一份在罚款单里。这种冗余设计在课程设计里很常见好处是罚款查询时不用去 JOIN 多张表简单直接。代价是如果读者姓名或书籍名称在源表里被修改罚款表里的数据就不同步了。2.3 初始数据怎么看预处理数据映射出了完整业务形态代码里附带的 INSERT 语句覆盖了所有六张表。书籍类别有 7 条记录从修真小说到言情小说书籍表有 8 条记录每本都指定了类别和出版社读者表 8 个读者区分了学生、教师、管理三类。最值得看的是借书记录的插入方式-- 插入借阅记录的同时把对应书籍标记为已借出 INSERT INTO borrow_record(bookid, readerid, borrowdate) VALUES(901, Q, 2013-01-18 12:20) UPDATE system_books SET isborrowed 0 WHERE bookid 901这段的逻辑是先往借阅记录表插一条记录再把书籍表里对应书的 isborrowed 从默认值改成 0表示这本书被借走了。这里有一个隐含的操作顺序——先借书后改状态。如果先改状态再插记录一旦插入失败书的借出状态就错了。正确的事务写法应该把这两步包在一个事务里后面讲坑的时候我会展开。入库的书籍初始状态 isborrowed 都设成了 1表示可借这个约定贯穿整个系统的所有业务操作。3. 核心业务 SQL 怎么实现借书、还书、超期罚款的数据流转3.1 借书流程一条 INSERT 加一条 UPDATE 的事务性操作借书这个操作在数据层只有两步往 borrow_record 表插入一条借阅记录然后把 system_books 表里对应书籍的 isborrowed 改成 0。看起来简单但这里面的门道不少。-- 借书操作插入借阅记录 更新书籍状态 BEGIN TRANSACTION INSERT INTO borrow_record(bookid, readerid, borrowdate) VALUES(906, Q, GETDATE()) UPDATE system_books SET isborrowed 0 WHERE bookid 906 AND isborrowed 1 COMMIT TRANSACTION用 AND isborrowed 1 做条件是一个好习惯意思是只有这本书当前是可借状态才执行借出操作避免重复借出同一本书。如果 UPDATE 影响的行数为 0说明这本书已经被借走了整个事务就应该回滚。借书日期用 GETDATE() 取系统当前时间这个比手动写死时间更符合真实业务。SQL Server 里这个函数返回当前 datetime后面的还书和罚款计算都依赖这个时间戳。3.2 还书流程原代码没覆盖到的部分要自己补上有意思的是原文档里数据初始化阶段只做了借书操作还书这部分代码没给全。系统功能需求里明确写了要支持还书信息的输入和查询所以还书操作需要自己推导。正确的还书流程应该是先查出这本书的借阅信息删除或更新借阅记录再把书籍状态恢复成可借最后检查是否超期超期就生成罚款记录。-- 还书操作恢复书籍状态 记录归还时间 UPDATE system_books SET isborrowed 1 WHERE bookid 903 -- 更新还书记录表 UPDATE return_record SET returndate GETDATE() WHERE bookid 903 AND returndate IS NULL这套逻辑的核心是还书时先恢复书的状态再记录归还时间。return_record 表的结构设计上有一个问题——它只有 bookid、readerid、returndate 三个字段其中 bookid 还是主键。这意味着同一本书的第二次还书记录根本插不进去。这个坑我在后面详细展开。3.3 超期罚款基于借阅日期和还书日期的时间差计算罚款表的设计比较简单字段包含 readerid、readername、bookid、bookname、bookfee、borrowdate。这里能看出一些设计缺陷罚款表没有单独的记录编号字段直接复用 bookid 作为主键一本书只能有一条罚款记录本文还有配套的精品资源点击获取
返回列表