简介学校图书借阅管理系统数据库系统设计课程设计报告面向计算机相关专业学生及数据库课程设计学习者围绕图书馆借阅业务给出从需求分析、数据字典、数据流图到E-R图、概要设计与功能实现的完整方案可用于课程设计参考、项目模仿与答辩准备。压缩包共1个doc文件约4.16MB内容以课程设计报告文档为主集中呈现欢迎界面、读者与管理员登录、图书信息录入修改、读者注册管理、图书查询借阅归还、数据备份恢复及系统管理等模块的设计说明与代码片段。已有11186人学习下载说明其在该类课程设计中具有较高参考热度。读者可从中获取系统结构图、主要功能说明、E-R图、主程序与各窗体代码等具体内容便于理解图书借阅管理系统的数据库设计思路并对照整理自己的课程设计文档与实现流程。1. 学校图书借阅管理系统数据库设计先拆“书目”和“馆藏册”再画表学校图书借阅管理系统的数据库系统设计真正难的不是把书、读者、借阅三张表画出来而是让“同一册书不能同时借给两个人”“还书后册状态立刻回正”“逾期统计不靠人工改状态”这三件事在数据库层成立。一个模拟项目里借书接口返回成功书架上的册状态却还是可借最后靠对账 SQL 才把问题找出来。这个方向适合做课程设计、毕设和中小型馆内系统的人表不多但约束、事务、索引一个都不能省。2. 从借阅业务到 ER 模型读者、书目、馆藏册、借阅记录怎么抽做学校图书借阅管理系统最容易上来就画三张表书、读者、借阅。表能跑关系却经常画反。书是“书目”还是“手上这一本”借阅记录挂到书目上还是挂到某一册上这两个问题不先定后面库存、条码、破损赔偿都会打架。我一般先把业务话术翻成实体再画关系不急着写建表 SQL。业务对象实体关键字段为什么单独存在读者reader读者 ID、借书证号、状态借书证会挂失、冻结读者不是一条姓名记录书目book_title书目 ID、ISBN、书名、作者同一 ISBN 可能有多册实体书馆藏册book_copy册 ID、条码、所属书目、馆藏位置、册状态借还操作针对条码不针对书名借阅记录loan借阅 ID、册 ID、读者 ID、借出时间、到期时间、归还时间读者和馆藏册的多对多桥预约记录reservation预约 ID、书目 ID、读者 ID、预约时间、失效时间、状态预约通常针对书目不针对某一册2.1 需求访谈只问四类问题谁借、借什么、借多久、异常谁处理第一类问题是“谁借”。读者分不分教师、学生、校外人员借书证丢了能不能挂失冻结状态是禁止借书还是只禁止预约这些答案最后会落到reader.status、reader.card_no和读者类型字段上。不要只问“读者表要哪些字段”要问“读者状态变化时哪些操作必须被拦住”。比如冻结读者还能不能还书通常能还不能借这就是业务规则不是界面规则。第二类问题是“借什么”。读者看到的是书名管理员操作的是条码。预约时选书名借书时扫条码这两个动作在数据库里不是同一张表。很多课程设计把“书名、条码、库存数量”塞进一张 book 表刚开始能跑一旦同一本书到馆五册就无法知道哪一册被借走、哪一册破损、哪一册在预约架上。问清楚“按书目借还是按册借”ER 图基本就不会画偏。第三类问题是“借多久”。借期是 30 天还是 60 天能不能续借续借几次预约到书后保留几天到期日是在借出时算好写入due_at还是每次查询时动态算我一般把到期时间落到借阅记录里因为罚款、催还、报表都要一个稳定的时间点。续借时更新due_at和renew_count不要只在前端显示“已续借”。第四类问题是“异常谁处理”。逾期、丢失、破损、赔偿、批量导入脏数据这些才是数据库设计的分水岭。逾期是每天批量改状态还是查询时按due_at NOW()算丢失后册状态改成“遗失”借阅记录还保不保留赔偿金额用DECIMAL还是整数分这些问题问完字段类型和状态机基本就定了。注意需求访谈不要只记录“要有一个借阅表”要记录“哪些动作必须在一个事务里完成”。借书时锁册、写借阅、改册状态这三步拆开库存就会对不上。2.2 把“书”拆成书目与馆藏册ISBN 与条码各管什么ISBN 是书目级标识条码是册级标识。一个 ISBN 对应一种书一种书可以有多册每一册有自己的条码、馆藏位置、状态和借阅历史。把这两层拆开借阅记录挂到book_copy.copy_id上才能回答“张三借走的是哪一册”“这一册现在是不是在维修”“这本书还有几册可借”。常见做法是book_title存 ISBN、书名、作者、分类、出版社book_copy存条码、title_id、馆藏位置、册状态。查询“某本书可借数量”时按title_id关联book_copy统计status 可借的册数。查询“某读者借了什么”时从loan关联book_copy再关联book_title这样既能看到册条码也能看到书名。如果只建一张 book 表把stock库存数量放在里面借书时stock stock - 1还书时stock stock 1看起来简单实际会遇到三个问题第一无法定位具体哪一册被借走第二同一册书重复借出时只能靠应用层查重第三丢失或破损时库存数量无法表达“这一册不可借”。所以库存数量适合做查询结果不适合做唯一事实来源。2.3 用最小关系草图验证一对多、多对多和借阅记录的位置最小关系可以这么画reader一对多loanbook_copy一对多loanbook_title一对多book_copyreservation连接reader和book_title。借阅记录是读者和馆藏册之间的多对多桥不是读者和书目之间的直接多对多。把这个关系画对后面的外键和唯一索引才有地方落。验证模型是否够用可以拿三个问题去套第一给定一个条码能不能查到它当前是否在借、借给谁、什么时候到期第二给定一个读者能不能查到他全部历史借阅包括已还和未还第三给定一个书目能不能算出可借册数、在借册数、预约人数三个问题都能用一张主表加两次 JOIN 回答模型基本够用如果第三个问题需要扫全表或读冗余字段说明书目和馆藏册还没拆干净。字段清单我一般先写三列字段名、业务含义、是否允许为空。比如loan.returned_at允许为空因为未还书时没有归还时间book_copy.barcode不允许为空而且要有唯一约束loan.due_at不允许为空因为借出时就必须确定到期时间。先写这三列再决定类型比直接打开建表工具更稳。3. 借阅库表结构落地主键、外键、唯一约束和借阅状态机ER 图能跑通不代表建表能跑通。数据库系统设计的硬活在这里主键用什么类型时间字段用DATETIME还是TIMESTAMP金额能不能用FLOAT借阅状态到底存几个值。表结构一旦上线后面改类型的成本比改 SQL 高得多所以这一层要把约束尽量前置。3.1 五张核心表的字段类型BIGINT、DATETIME、DECIMAL 怎么选数据推荐类型常见误用说明主键 IDBIGINT UNSIGNEDINT自增借阅流水会长期增长BIGINT省得以后迁移条码、借书证号VARCHAR(32)INT条码可能有字母、前导零不要当数字借出、到期、归还时间DATETIMETIMESTAMPDATETIME不随时区转换适合固定业务时间罚款金额DECIMAL(8,2)FLOAT、DOUBLE金额要精确到分浮点数会出现 0.30000000004状态TINYINTVARCHAR(10)状态值短、查询快含义写在注释和状态表里书名、作者VARCHAR(200)TEXT常规检索字段用变长字符串别一上来就大文本book_copy的status我一般用四个值1 可借2 在借3 维修4 遗失。loan的status用另外一组1 在借2 已还3 逾期未还4 丢失。两套状态不要混用因为“册状态”描述实物能不能借“借阅状态”描述这笔借阅处在哪个流程。混成一个字段后面报表口径一定乱。3.2 建表 SQL先落约束再补索引顺序反了会返工建表顺序按依赖走先reader、book_title再book_copy最后loan、reservation。外键列要有索引InnoDB 会自动给外键建索引但复合查询索引要自己补。下面这段 SQL 的关键不是字段多而是把“同一册书不能有两条未还记录”交给数据库兜底。本文还有配套的精品资源点击获取