通过前面章节对数据库基础知识的学习,本章将通过一个图书管理系统的数据库设计实例来重点讲述如何设计数据库。在设计数据库的过程中应该遵循哪些设计原则及技巧。通过本章的数据库实例设计,要求对数据库的整体过程有个概念性的理解,并能通过所学知识,在具体的开发环境下设计一个较优化数据库并实现设计过程。
10.1 数据库设计原则及技巧
10.1.1数据库设计原则
随着计算机技术越来越广泛地应用于国民经济的各个领域,在计算机硬件不断微型化的同时,应用系统向着复杂化、大型化的方向发展。数据库是整个系统的核心,它的设计直接关系系统执行的效率和系统的稳定性。因此在软件系统开发中,数据库设计应遵循必要的数据库范式理论,以减少冗余、保证数据的完整性与正确性。只有在合适的数据库产品上设计出合理的数据库模型,才能降低整个系统的编程和维护难度,提高系统的实际运行效率。虽然对于小项目或中等规模的项目,开发人员可以很容易地利用范式理论设计出一套符合要求的数据库,但对于一个包含大型数据库的软件项目,就必须有一套完整的设计原则与技巧。
1. 设计原则
在设计数据库时,至关重要的工作就是要理解为之建模的业务职能和表示这些业务职能的数据库概念及功能,并能准确地设计数据库,进而建立优化的业务模型。因为数据库的设计在整个系统中是至关重要的一步,一旦数据库设计完成,在进行修改及优化就需花费大量的时间。因此,再设计数据库时,应考虑以下事项:
1) 规范命名。所有的库名、表名、域名必须遵循统一的命名规则,并进行必要说明,以方便设计、维护、查询。
2) 控制字段的引用。在设计时,可以选择适当的数据库设计管理工具,以方便开发人员的分布式设计和数据小组的集中审核管理。采用统一的命名规则,如果设计的字段已经存在,可直接引用;否则,应重新设计。
3) 库表重复控制。在设计过程中,如果发现大部分字段都已存在,开发人员应怀疑所设计的库表是否已存在。通过对字段所在库表及相应设计人员的查询,可以确认库表是否确实重复。
4) 并发控制。设计中应进行并发控制,即对于同一个库表,在同一时间只有一个人有控制权,其他人只能进行查询。
5) 必要的讨论。数据库设计完成后,数据小组应与相关人员进行讨论,通过讨论来熟悉数据库,从而对设计中存在的问题进行控制或从中获取数据库设计的必要信息。
6) 数据小组的审核。库表的定版、修改最终都要通过数据小组的审核,以保证符合必要的要求。
7) 头文件处理。每次数据修改后,数据小组要对相应的头文件进行修改(可由管理软件自动完成),并通知相关的开发人员,以便进行相应的程序修改。
2.设计技巧
1
分类拆分数据量大的表。对于经常使用的表(如某些参数表或代码对照表),由于其使用频率很高,要尽量减少表中的记录数量。例如,银行的户主账表原来设计成一张表,虽然可以方便程序的设计与维护,但经过分析发现,由于数据量太大,会影响数据的迅速定位。如果将户主账表分别设计为活期户主账、定期户主账及对公户主账等,则可以大大提高查询效率。
索引设计。对于大的数据库表,合理的索引能够提高整个数据库的操作效率。在索引设计中,索引字段应挑选重复值较少的字段;在对建有复合索引的字段进行检索时,应注意按照复合索引字段建立的顺序进行。例如,如果对一个5万多条记录的流水表以日期和流水号为序建立复合索引,由于在该表中日期的重复值接近整个表的记录数,用流水号进行查询所用的时间接近3秒;而如果以流水号为索引字段建立索引进行相同的查询,所用时间不到1秒。因此在大型数据库设计中,只有进行合理的索引字段选择,才能有效提高整个数据库的操作效率。
数据操作的优化。在大型数据库中,如何提高数据操作效率值得关注。例如,每在数据库流水表中增加一笔业务,就必须从流水控制表中取出流水号,并将其流水号的数值加一。正常情况下,单笔操作的反应速度尚属正常,但当用它进行批量业务处理时,速度会明显减慢。经过分析发现,每次对流水控制表中的流水号数值加一时都要锁定该表,而该表却是整个系统操作的核心,有可能在操作时被其他进程锁定,因而使整个事务操作速度变慢。对这一问题的解决的办法是,根据批量业务的总笔数批量申请流水号,并对流水控制表进行一次更新,即可提高批量业务处理的速度。
数据库参数的调整。数据库参数的调整是一个经验不断积累的过程,应由有经验的系统管理员完成。以informion数据库为例,记录锁的数目太少会造成锁表的失败;逻辑日志的文件数目太少会造成插入大表失败等,这些问题都应根据实际情况进行必要的调整。
必要的工具。在整个数据库的开发与设计过程中,可以先开发一些小的应用工具,如自动生成库表的头文件、插入数据的初始化、数据插入的函数封装、错误跟踪或自动显示等,以此提高数据库的设计与开发效率。
避免长事务。对单个大表的删除或插入操作会带来大事务,解决的办法是对参数进行调整,也可以在插入时对文件进行分割。对于一个由一系列小事务顺序操作共同构成的长事务(如银行交易系统的日终交易),可以由一系列操作完成整个事务,但其缺点是有可能因整个事务太大而使不能完成,或者,由于偶然的意外而使事务重做所需的时间太长。较好的解决方法是,把整个事务分解成几个较小的事务,再由应用程序控制整个系统的流程。这样,如果其中某个事务不成功,则只需重做该事务,因而既可节约时间,又可避免长事务。
适当超前。计算机技术发展日新月异,数据库的设计必须具有一定前瞻性,不但要满足当前的应用要求,还要考虑未来的业务发展,同时必须有利于扩展或增加应用系统的处理功能。
总之,相对于中小型数据库,大型数据库的设计与开发要复杂得多,因此在设计、开发过程中,除了要遵循数据库范式理论、增加系统的一致性和完整性外,还要在总体上根据具体情况进行分布式设计,紧紧把握集中控制、统一审核的基本原则,保证数据库设计结构紧凑、分布平衡、定位迅速。在数据库操作上,要采用一定的技巧提高整个应用系统的执行效率,并注意适当超前,以适应不断变化的应用及系统发展的要求。
2
10.2 图书管理系统数据库设计实例
设计一个系统的核心是前期的分析设计,如果前期的分析设计没有合理、正确、可预见且清晰的思路,整个系统就无法实现一个优化的高性能系统。那么数据库的设计是整个系统设计的关键。本章重点介绍图书管理系统的数据库设计,而对于数据库应用的什么开发环境设计的系统,本文不再介绍。从数据库的设计过程可知,数据库设计的首要任务就是需求分析,可见如果需求分析做不好,就不可能设计出一个合理、优化的数据库。
10.2.1数据库设计过程
数据库设计是设计一个数据库管理系统的核心技术,因此,在设计一个系统之前必须设计好数据库,目前数据设计的一般过程分为六个阶段如图10.1所示:需求分析阶段、概念结构设计阶段、逻辑结构设计阶段、物理结构设计阶段、实施阶段和运行与维护阶段。
1、需求分析阶段:需求分析阶段的主要任务是指通过充分调查现实世界要处理的对象, 详细了解计算机系统的工作情况, 明确用户的各种需求, 然后确定系统的各项功能。数据库系统不仅要按照当前的应用要求来设计, 而且必须充分考虑今后可能的扩充和改变。
2、概念结构设计阶:概念结构设计阶段的主要任务是将需求分析阶段所得到的用户需求抽象为概念模型, 而描述概念模型的具体工具主要是E-R模型。
3、逻辑结构设计阶段:逻辑结构设计阶段的主要任务是把概念结构设计阶段设计的基本E-R模型转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。具体来说, 就是首先将概念结构转换为一般的关系、网状、层次模型, 然后将转换如图10.1 数据库设计的一般过程运行与维护阶段 来的模型向特定DBMS支持下的数据模型转换, 最后对数据模型进行优化。
4、物理结构设计阶段:物理结构设计阶段的主要任务是为一个指定的逻辑数据模型选取一个符合应用要求的物理结构。具体来说, 就是首先确定数据库的物理结构, 即数据库的存取方法和存储结构;然后对数据库的物理结构进行评估, 评估的重点是存取时间的长短和存储空间的大小。
5、实施阶段:实施阶段的主要任务是用RDBMS 提供的数据定义语言和其他实用程序将逻辑结构设计和物理结构设计的结果详细描述出来,成为DBMS 可以接受的源代码;再经过系统调试产生目标模式, 最后完成数据的载入工作。
6、运行与维护:运行与维护阶段的主要任务包括数据库的转储和恢复, 数据库完整性和安全性控制, 数据库性能改造、分析和监督, 数据库的重构造和重组织。
实施阶段物理结构设计阶段逻辑结构设计阶段概念结构设计阶段需求分析阶段10.2.2需求分析阶段
10.2.2.1 概述
进行系统设计,首先要对系统的现状进行分析。根据系统的目标、需求和功能,制定
3
和选择一个较好的系统方案,从而达到一个合理的优化系统。而需求分析是在于要弄清用户对所开发的数据库应用系统的确切要求。所以,数据库设计的第一步是明确数据库的目的和如何使用,也就是说需要从数据库中得到哪些信息。明确目的之后,就可以确定您需要保存哪些主题的信息(表),以及每个主题需要保存哪些信息(表中字段)。
在构造系统时,首先从需求出发构造数据库表,然后再由数据库表结合需求划分系统功能模块。这样,就把一个大的系统分解成了几个小系统。经过对图书管理系统的分析,因图书数量、规模大,管理信息量大,建立图书管理系统是为了解决人工手动管理图书信息在实践的问题。这里把系统的层次划分为了四个部分:图书维护,人员信息管理,图书借阅管理,信息查询。能够实现以下功能:
1) 进行新书入库、现有图书信息修改以及删除; 2) 能够实现对读者基本信息的查询和编辑管理; 3) 能够进行超期罚款功能; 4) 能够进行借阅信息的查询功能; 10.2.2.2 需求阶段的目标及任务
需求分析的目标及任务就是为了提取有效的信息,概念模型的抽象化,转化为计算机系统能够识别的信息。则通过需求分析所得的信息如下:
证日期
管理员信息:管理员编号,姓名,性别,权限,登录口令,住址,电话
馆藏图书信息:图书编号,索书号,图书名称,作者,出版社,单价,摘要,关键字,副本数,分类,出版日期,状态
借阅信息:图书编号,读者编号,图书名,作者,借阅日期,归还日期,归还日期,应还日期,罚金
借阅历史信息:图书编号,读者编号,图书名,作者,借阅日期,还书日期 罚款信息:读者编号,图书编号,图书名,作者,借阅日期,应还日期,归还日期,罚款金额,处理状态,管理员编号
处理功能及要求
用户对图书管理系统的功能及要求如下:
1. 能够存储一定数量的图书信息,并方便有效的进行相应的书籍数据操作和管理,这主要包括:
a) 图书信息的录入、删除及修改。 b) 图书信息的多关键字检索查询。
c) 图书的出借、返还及超期罚款或丢失赔偿。
2. 能够对一定数量的读者、管理员进行相应的信息存储与管理,这其中包括:
a) 读者信息的登记、删除及修改。 b) 管理员信息的增加、删除及修改。 c) 读者资料的统计与查询。
3. 能够提供一定的安全机制,提供数据信息授权访问,防止随意删改、查询。 4. 对查询、统计的结果能够列表显示。
4
处理对象
读者信息:读者编号,姓名,性别,学号,学院,专业,年级,类型,类别编号,办
10.2.2.3安全性和完整性要求 1) 安全性要求
系统安全性要求体现在数据库安全性、信息安全性和系统平台的安全性等方面。安全性先通过视图机制,不同的用户只能访问系统授权的视图,这样可提供系统数据一定程度上的安全性,再通过分配权限、设置权限级别来区别对待不同操作者对数据库的操作来提高数据库的安全性;系统平台的安全性体现在操作系统的安全性、计算机系统的安全性和网络体系的安全性等方面。
2) 完整性要求
系统完整性要求系统中数据的正确性以及相容性。可通过建立主、外键,使用check约束,或者通过使用触发器和级联更新。
在系统进行设计时,一定根据第七章所学知识对数据的安全性及完整性进行设计。以保证数据库更为完善。
10.2.2.4 建立数据业务流程及数据字典
系统需求分析主要是通过对本校图书管理员的咨询、请教,了解我校图书馆的管理规则和运行机制,并通过上网搜索有关图书管理系统的知识,了解到了图书管理的现状,以及在管理中的一些问题,然后通过所了解的文字信息,理解数据业务流程及数据字典,为后期数据库设计提供概念基础。
图书管理系统业务流程图
本文的业务流程是从读者角度考虑的业务流程图:
图10.2 图书管理系统业务流程图 图书管理系统数据流程图
(一) 顶层数据流图:
图 10.3 顶层数据流 (二) 第2层数据流图:(读者借阅,读者还书,读者查询,管理员查询,管理员修改)
5
图10.4第2层数据流图
(三) 第3层数据流图:(读者借阅)
图10.5 读者借阅数据流图 (四) 第3层数据流图:(读者还书)
图10.6 读者还书数据流图 6
(五) 第3层数据流图:(查询图书信息,查询读者信息,查询借阅历史,查询罚款信息)
图10.7管理员、读者查询数据流图 (六) 第3层数据流图:(管理员添加、删除、修改图书信息)
图10.8 图书的维护数据流图
(七) 第3层数据流图:(管理员添加、删除、修改读者信息)
图10.9 更改读者信息的数据流图
(八) 第3层数据流图:(管理员添加、删除、修改管理员信息)
7
图10.10 更改管理员信息的数据流图
图书管理系统数据字典
表1.1 数据项列表
(a)数据项:系统涉及的数据项有44项
数据项编号 数据项名 数据项含义 与其它数据项的关系 存储结构 别名 DI-1 DI-2 DI-3 DI-4 DI-5 DI-6 DI-7 DI-8 DI-9 DI-10 DI-11 DI-12 DI-13 DI-14 DI-15 DI-16 DI-17 DI-18 DI-19 DI-20 DI-21 DI-22 DI-23 DI-24 BookID BookNo BookName BookWriter BookPublish BookPrice BookDate BookClass BookMain BookPrim BookCopy BookState BookRNo ReaID ReaName ReaSex ReaNo ReaLBID ReaType ReaDep ReaGrade ReaPre ReaDate OutDate 图书条码号 图书索书号 图书名 图书作者 图书出版社 图书单价 图书出版日期 图书分类 图书摘要 图书关键字 图书副本数 图书是否可借 所属馆室号 读者条码号 读者姓名 读者性别 读者学号 读者类别编号 读者类型(职务) 读者所在学院 读者所属年级 读者所读专业 读者办证时间 借阅日期 同RoomNo 同LBID char(9) char(10) char(20) char(8) char(20) char(7) Date char(20) char (200) char (30) char (5) char(10) char(5) char(9) char(10) char(2) char (9) char(5) char(20) char(20) char(5) char(20) Date Date 条码号 索书号 书名 作者 出版社 单价 出版日期 类别 摘要 关键字 副本数 状态 馆室号 条码号 姓名 性别 学号 类别编号 类型 学院 年级 专业 办证时间 借阅时间 8
数据项编号 数据项名 数据项含义 与其它数据项的关系 存储结构 别名 DI-25 DI-26 DI-27 DI-28 DI-29 DI-30 DI-31 DI-32 DI-33 DI-34 DI-35 DI-36 DI-37 DI-38 DI-39 DI-40 DI-41 DI-42 DI-43 DI-44 InDate YHDate Fine CLState LBID LBName LBnum LBbqx LBqx MID MName MSex Mpwd MAuth MTeleph MAddre RoomNo RoomMID RoomNum RoomAddre 归还日期 应还日期 罚款金额 是否交纳罚金 类别编号 读者类别名 允许最多借书数量 允许最长持有时间 借阅卡有效期 管理员编号 管理员姓名 管理员性别 管理员口令 管理员权限级别 管理员电话 管理员地址 馆室号 馆室管理员编号 馆室内图书数目 馆室地址 同ReaLBID 同RoomMID 同BookRNo 同MID Date Date char(3) char(8) char(5) char(20) char(5) char(4) char(3) char(10) char(10) char(2) char(8) char(4) char(15) char(30) char(5) char(10) char(5) char(20) 归还时间 应还时间 罚款金额 处理状态 类别编号 类别名 借阅数量 借阅期限 有效期限 编号 姓名 性别 口令 权限级别 电话 住址 馆室号 编号 数量 地址 (b)数据结构:
表1.2 数据结构列表
数据结 构编号 数据结构 含义 数据结构名 组成 BookID,BookNo,BookName,BookWriter, DS-1 Book 馆藏图书信息 BookPublish,BookPrice,BookDate,BookClass, BookMain,BookPrim,BookCopy,BookState, BookRNo ReaID, ReaName, ReaSex, ReaNo, ReaLBID, ReaType, ReaDep, ReaGrade, ReaPref, ReaDate, BookID,ReaID,BookName,BookWriter, Outdate,YHdate BookID,ReaID,BookName,BookWriter, Outdate,Indate BookID,ReaID,BookName,Outdate,Indate,Fine, DS-2 Reader 读者信息 DS-3 DS-4 DS-5 Borrow History Fine 借阅信息 借阅历史 罚款信息 9
数据结 构编号 数据结构名 数据结构 含义 组成 CLState,MID DS-6 DS-7 DS-8 ReaderType Maneger Room 读者类别 管理员信息 馆室信息 LBID, LBName, LBnum, LBbqx, LBqx MID,MName,MSex,Mpwd,MAuth,MTeleph,MAddre RoomNO, RoomMID, RoomNum, RoomAddre (c)处理逻辑描述
表1.3 处理逻辑列表
处理编号 PR-1 处理功能 处理过程 馆藏图书信息模块、读者信息模块、读者类别信息模块、借阅信息模块、借阅历史信息模块、罚款信判断读者查询涉及的功能模块 息模块、管理员模块、馆室信息模块: 先确定查询所涉及的功能模块;然后,根据要查询的内容,确定查询数据流向;最后显示查询结果。 PR-2 判断图书、读者修改要涉及的模块,同时把相应的修改数据传到相应的模块之中 馆藏图书信息模块、读者信息模块、读者类别信息模块、管理员信息模块、馆室信息模块: 先确定更新所涉及的功能模块;然后,把更新信息传送到相应的模块中;最后,进行相应的更新操作。 10.2.3概念分析阶段
概念设计阶段主要是将需求分析阶段得到的用户需求抽象为信息结构(概念模型)的过程,它是整个数据库设计的关键。本图书管理系统的主要任务及目标如下: (1) 选择中层数据流为切入点,通常选择实际系统中的子系统; (2) 设计分E-R图,即各子模块的E-R图;
(3) 生成初步E-R图,通过合并方法,做到各子系统实体、属性、联系统一; (4) 生成全局E-R图,通过消除冲突等方面。
在本图书管理系统中,从第3层数据流程图下手。分析各3层数据流图和数据字典,知道整个系统功能围绕“读者”、“管理员”和“图书”的处理。根据实体与属性间的两条准则:
① 作为“属性”,不能再具有需要描述的性质。 ② “属性”不能与其他实体具有联系。
数据流程图10.5 、图10.6、图10.7可综合成借阅子系统的分E-R图10.11,数据流程图10.8可抽象为分E-R图10.12,数据流程图10.9可抽象为分E-R图10.13,数据流程图10.10可抽象为分E-R图10.14。然后采用逐步集成的方式将各分E-R图合并,消除不必要的冗余和冲突后就生成了基本E-R图10.15。其各个E-R图如下:(1)根据不同的对象,从第3层数据流程图入手,分别画出各分E-R图:
10
(a)从数据流程图10.5 、图10.6、图10.7抽象出的分E-R图:
读者m借阅n图书n管理员m归还罚款mn
图10.11 分E-R图
(b)从数据流程图10.8可抽象为分E-R图:
管理员1维护n图书 图10.12 分E-R图
(c)从数据流程图10.9抽象出的分E-R图:
管理员1管理n读者 图10.13 分E-R图
(d)从数据流程图10.10抽象出的分E-R图:
n管理员1管理 图10.14 分E-R图
(2)合并各分E-R图,消除属性冲突、命名冲突、结构冲突等三类冲突,得到初步E-R
图,再消除不必要冗余,得到的基本E-R图如下所示:
读书类别1属于n读者m借阅n罚款m管理员1维护n馆室n1属于n图书n归还m读者n
图10.15 分E-R图
(3)各E-R图各实体的属性如下所示:
图书:Book(BookID, BookNo, BookName, BookWriter, BookPublish, BookPrice,
11
BookDate, BookClass, BookMain, BookPrim, BookCopy,
BookState,BookRN)
读者:Reader(ReaID, ReaName, ReaSex, ReaNo, ReaLBID, ReaType, ReaDep,
ReaGrade, ReaPref, ReaDate)
管理员:Maneger(MID, MName, MSex, Mpwd, MAuth, MTeleph, MAddre) 读者类别:ReaderTpye(LBID, LBName, LBnum, LBbqx, LBqx) 借阅信息:Borrow (BookID,ReaderID,BookName,BookWriter, Outdate,YHdate) 借阅历史:History(BookID,ReaderID,BookName, BookWriter, Outdate,Indate) 罚款信息:Fine(BookID,ReaderID,BookName, Outdate,Indate, Fine, CLState, MID) 馆室:Room(RoomNo,RoomMID,RoomNum,RoomAddre) 各E-R图中联系的属性如下所示:
10.2.4逻辑设计阶段
以上的概念设计阶段是独立于任何一种数据模型的,但是逻辑设计阶段就与选用的DBMS产品发生关系了,系统逻辑设计的任务就是将概念设计阶段设计好的基本E-R图转换为选用DBMS产品所支持的数据模型相符合的逻辑结构。具体内容包括数据组织(将E-R图转换成关系模型、模型优化、数据库模式定义、用户子模式设计)、数据处理(画出系统功能模块图)两大任务。
10.2.4.1数据组织
1. 将E-R图转换为关系模型
实体型转换为关系模式。实体的属性就是关系的属性,实体的码就是关系的码。对于实体间的联系则有以下不同的情况:
一个m:n联系转换为一个关系模式。与该联系相连的各实体的码以及联系本身的
属性均转换为关系的属性,而关系的码为各实体码的组合。
一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。三个或三个以上实体间的一个多元联系可以转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为各实体码的组合。具有相同码的关系模式可合并。
由于读者类别与读者、馆室与图书的联系方式是1:n(一对多),可以将其之间的联系与n端实体读者、图书合并,管理员与图书之间的维护联系也是1:n(一对多),同样也将其之间的联系与n端实体合并,而读者与图书之间的借阅和归还联系方式则是n:m(多对多),这样要把它们之间的联系转化为独立的关系模式,读者与管理员之间的罚款联系是m:n(多对多),将其联系也转化成独立的关系模式,具体的基本E-R图向关系模型的转化如下:
图书:Book(BookID, BookNo, BookName, BookWriter, BookPublish, BookPrice,
BookDate,BookClass,BookMain,BookPrim,BookCopy,BookState,BookRNo) 读者:Reader(ReaID,ReaName,ReaSex,ReaNo,ReaLBID,ReaType, ReaDep, ReaGrade,
12
ReaPref, ReaDate)
管理员: Maneger (MID,MName,MSex,Mpwd,MAuth,MTeleph,MAddre) 读者类别:ReaderTpye(LBID, LBName, LBnum, LBbqx, LBqx) 馆室: Room(RoomNo,RoomMID,RoomNum,RoomAddre)
借阅信息:Borrow(BookID,ReaderID,BookName,BookWriter, Outdate,YHdate) 借阅历史:History(BookID,ReaderID,BookName,BookWriter, Outdate,Indate,YHdate) 罚款信息:Fine (BookID,ReaderID,BookName,Outdate,Indate,Fine, CLState,MID) (注:标有直线下划线的为主属性,标有波浪线下划线的是外键属性,主属性与外键属性一起构成主码)
2. 模型优化
关系模式Book,Reader,Room,ReaderType ,Maneger不存在非主属性对主属性的部分函数依赖,也不存在传递函数依赖,已经达到了3NF,但是借阅关系模式、借阅历史关系模式、罚款关系模式(Borrow,History,Fine)中存在着一些数据冗余,现将三个关系模型进行合并,消除冗余,优化为:
借阅信息:Borrow ( BookID,ReaderID,BookName,BookWriter,Outdate,Indate,
YHdate,Fine,CLStaer,MID) 3. 数据库模式定义
根据分析,本数据库共创建如下6个表。
表10.1 馆藏图书信息表
列名
BookID BookNo BookName BookWriter BookPulish BookPrice BookDate BookClass BookMain BookPrim BookCopy BookState BookRNo
数据类型
Char Char Char Char Char Char Date Char Char Char Char Char Char
可否为空
not null not null not null not null not null
not null not null
说明
图书编号 图书的索书号 图书的书名 图书作者 图书出版社 图书的单价 出版日期 图书的分类 图书的摘要 图书的关键字 图书的副本数 图书是否可借 图书所在馆室号
表10.2 读者信息表
列名
ReaID ReaName ReaSex
数据类型
Char Char Char
可否为空
not null not null not null
说明
读者编号 读者姓名 读者性别
13
ReaNo ReaLBID ReaType ReaDep ReaPref ReaGrade ReaDate
Char Char Char Char Char Char Date
not null not null
not null
读者学号 读者类别编号 读者类型 读者所在学院 读者所属专业 读者的年级 办证日期
表10.3 管理员信息表
列名
MID MName MSex Mpsw MAuth MTeleph MAddre
数据类型
Char Char Char Char Char Char Char
可否为空
not null not null
not null not null
说明
管理员编号 管理员姓名 管理员性别 管理员密码 管理员权限 管理员电话 管理员地址
表10.4 馆室信息表
列名
RoomNo RoomMID RoomNum RoomAddre
数据类型
Char Char Char Char
可否为空
not null not null
馆室号
说明
馆室管理员编号 馆室拥有图书数目 馆室地址
表10.5 读者类别信息表
列名
LBID LBName LBnum LBbqx LBqx
数据类型
Char Char Char Char Char
可否为空
not null not null not null not null not null
说明
读者类别编号 读者类别名
允许借阅图书最大数 持有图书最长期限 借阅证期限
表10.6 借阅信息表
列名
ReaID BookID BookName BookWriter
数据类型
Char Char Char Char
14
可否为空
not null not null not null
说明
读者编号 图书编号 图书名 作者
Outdate Indate YHdate Fine CLState MID
Date Date Date Char Char Char
not null
not null
not null
借阅时间 归还时间 应还时间 罚款金额 处理状态 管理员编号
4. 用户子模式定义
表10.7 用户子模式定义
编号
V-1 V-2 V-3 V-4 V-5
用户子模式(View) BookView ReaderView HistoryView BorrowView FineView
作用(共性:提供数据保密和安全保护机制)
便于查询和修改图书的基本信息 方便读者基本信息的查询、更新 便于借阅历史信息的查询 用于当前借阅信息的查询 便于查询罚款信息
表10.8 读者基本信息视图
列名
ReaID ReaName ReaSex ReaType ReaDep ReaDate
数据类型
Char Char Char Char Char Date
可否为空
not null not null not null
l
说明
读者编号 读者姓名 读者性别 读者类型 读者所在学院 办证日期
表10.9 图书基本信息视图
列名
BookNo BookName BookWriter BookPulish BookState BookRNo
数据类型
Char Char Char Char Char Char
可否为空
not null not null not null not null not null not null
说明
图书的索书号 图书的书名 图书作者 图书出版社 图书是否可借 图书所在馆室号
表10.10 读者当前借阅信息视图
列名
BookID BookName Outdate YHdate
数据类型
Char Char Date Date
15
可否为空
not null not null not null not null
说明
图书编号 图书名 借阅时间 应还时间
表10.11 读者借阅历史信息视图
列名
BookID BookName Outdate Indate
数据类型
Char Char Date Date
可否为空
not null not null not null
说明
图书编号 图书名 借阅时间 归还时间
表10.12 读者罚款信息视图
列名
BookID BookName Outdate Indate Fine CLState
数据类型
Char Char Date Date Char Char
可否为空
not null not null not null
not null not null
说明
图书编号 图书名 借阅时间 归还时间 罚款金额 处理状态
10.2.4.2 数据处理
结合系统的需求,本系统的基本的系统功能模块如下图10.16。
图书管理系统图书维护子系统人员资源管理子系统借还服务子系统查询服务子系统添加新到图书删除过期图书修改馆藏图书添加新用户删除无效用户修改用户信息借阅服务归还服务罚款服务图书查询服务个人信息查询
图10.16 系统功能模块图
10.2.5物理设计阶段
数据库的物理设计就是为逻辑数据模型选取一个最合适应用要求的物理结构的过程,在这个阶段中要完成两大任务:
(1)确定数据库的物理结构,在关系数据库中主要是存取方法和存储结构; (2)对物理结构进行评价,评价的重点是时间和空间效率。 10.2.5.1数据存储方面
为数据库中各基本表建立的索引如下:
16
1) 由于基本表Reader,Book的主码ReaID,BookID经常在查询条件和连接操作的
连接条件中出现,且它们的值唯一,在两个属性上建立唯一性索引;
2) 由于基本表Reader的属性ReaDep,Book的属性BookPublish经常在查询条件中
出现在两个属性上建立聚簇索引;
3) 借阅信息基本表Borrow的一属性ReaID,BookID,经常在查询条件中出现,考虑
在其之上建立聚簇索引;
4) 罚款信息基本表Fine的一属性ReaID,BookID,经常在查询条件中出现,考虑在其
之上建立聚簇索引; 10.2.5.2系统功能模块
(一) 读者基本信息的查询和更新模块
将实现对读者基本信息的查询和更新(修改、添加、删除)操作,用于新生入学,毕业生离校,以及读者补办借阅证或更改信息的情况,具体的功能模块图如下:
管理查询或更新的命令查询查询?更新?更新查询读者信息表更新读者信息表N是否成功Y更新后的读者信息表查询的结果提示信息Y是否继续N结束
图10.17 读者信息的查询和更新模块
(二) 图书基本信息的查询和更新模块
将完成对图书基本信息的查询、更新(修改、添加、删除)操作,用于读者对图书信息的查询及管理员添加新书、删除淘汰的旧书,具体的功能模块图如下所示:
17
管理员发出更新图书的命令读者发出查询信息N权限是否有效Y查询图书信息表更新图书信息表N是否成功Y更新后的图书信息表查询的结果提示信息Y是否继续N结束
图10.18图书信息的查询和更新模块
10.2.6数据库实施阶段
10.2.6.1建立数据库、数据表、视图、索引 (一) 建立数据库
create database Book;
(二) 建立数据表
1) 读者类别信息表的建立: create table ReaderType(
LBID char(5) primary key, LBName char(20) not null, LBnum char(5) not null, LBbqx char(4) not null, LBqx char(3) not null,
)
2) 管理员基本信息表的建立: create table Maneger(
MID char(10) primary key, MName char(10) not null, MSex char(2),
Mpwd char(8) not null, MAuth char(40) not null, MTeleph char(15), MAddre char(30),
check(MSex ='男' or MSex ='女')
)
18
3) 图书馆室基本信息表的建立: create table Room(
RoomNo char(5) primary key, RoomMID char(10) not null, Roomnum char(5), RoomAddre char(20),
foreign key(RoomMID) references Maneger(MID),
)
4) 馆藏图书基本信息表的建立: create table Book(
BookID char(9) primary key, BookNo char(20) not null, BookName char(50) not null, BookWriter char(30) not null, BookPublish char(20) not null, BookPrice char(7), BookDate datetime, BookClass char(20), BookMain char(200), BookPrim char(30), BookCopy char(5),
BookState char(10) not null, BookRNo char(5) not null,
foreign key(BookRNo) references Room(RoomNo),
)
5) 读者基本信息表的建立: create table Reader(
ReaID char(9) primary key, ReaName char(10) not null, ReaSex char(2) not null, ReaNo char(9) not null, ReaLBID char(5) not null, ReaType char(20), ReaDep char(20), ReaGrade char(5), ReaPref char(20), ReaDate Datetime,
foreign key(ReaLBID) references ReaderType(LBID), check(ReaSex ='男' or ReaSex ='女')
)
19
6) 借阅基本信息表的建立: create table Borrow(
BookID char(9), ReaID char(9),
Outdate Datetime not null, YHdate Datetime not null, Indate Datetime, Fine char(5), CLState char(8),
MID char(10) not null, primary key(BookID,ReaID),
foreign key(MID) references Maneger(MID)
)
(三) 建立视图
(1)用于查询图书基本信息的视图定义如下:
create view Bookview (索书号, 书名, 作者, 出版社, 图书状态) as
select BookNo,BookName,BookWriter,BookPublish,BookState from Book
(2)用于读者基本信息查询的视图定义如下:
create view Readerview (读者姓名,类型,学院,专业,办证日期) as
select ReaName,ReaType,ReaDep,ReaPref,ReaDate from Reader
(3)用于显示当前借阅基本信息的视图定义如下:
create view Borrowview (读者编号,书名,作者,借阅日期,到期日期) as
select ReaID,BookName,BookWriter,Outdate,YHdate from Borrow,Book
where Borrow.BookID=Book.BookID and Borrow.Indate is null
(4)用于借阅历史信息查询的视图定义如下:
create view Historyview (读者编号,书名,借阅日期,归还日期) as
select ReaID,BookName,Outdate,Indate from Borrow,Book
where Borrow.BookID=Book.BookID and Borrow.Indate is not null
(5)用于查询罚款信息的视图定义如下:
create view Fineview (读者编号,书名,借阅日期,归还日期,罚款,处理状态) as
select ReaID,BookName,Outdate,Indate,Fine,CLState
20
from Borrow,Book
where Borrow.BookID=Book.BookID and Fine is not null (四) 6.1.4 建立索引
create clustered index BookPublish on Book(BookPublish); create clustered index ReaDep on Reader(ReaDep); (五) 6.1.5 建立触发器
1.当删除Reader表中某一读者基本信息时,触发Borrow表,删除相应的记录 create trigger Reader_delete on Reader for delete as
delete Borrow from deleted
where Borrow.ReaID=deleted.ReaID
2.当在中增加一条借阅记录时,使该图书的状态由“可借”变为“不可借” create trigger Borrow_insert1 on Borrow for insert as
declare @BookID char(9) select @BookID=BookID from inserted update Book
set BookState='不可借' where BookID=@BookID 10.2.6.2数据入库
系统包括图书基本信息管理、读者基本信息管理、管理员信息管理、借阅信息管理、查询信息管理等四大功能模块,共有6张基本表,采用事先在Excel中录入数据,然后使用SQL Server 2008数据导入/导出向导功能,直接将数据导入到相应的基本表中。
10.2.6.3创建各个功能的存储过程
系统共创建了10个存储过程,具体列表如下:
表3.1 创建的存储过程列表:
编号
存储过程名称
定义
作用
P-1 P-2 P-3 P-4 P-5
Book_Insert Reader_Insert Maneger_Insert Borrow_Insert Delete_Book
详见附录1-1 详见附录1-2 详见附录1-3 详见附录1-4 详见附录1-10
在Book中插入一元组 在Reader中插入一元组 在Maneger中插入一元组 在Borrow中插入一元组 从Book中删除一元组
21
P-6 P-7 P-8 P-9 P-10
Delete_Reader Query_Reader_R Query_Reader_M Query_Book_Writer Query_Book_Name_Publish
详见附录1-9 详见附录1-5 详见附录1-6 详见附录1-7 详见附录1-8
从Reader中删除一元组 读者在Reader中查询本人信息 管理员在Reader中查询全部读者 在Book,按作者查询
在Book中,按书名和出版社查询
(其它表的查询、修改、删除与以上各表的存储过程定义大致相同,这里不再具体列出)
10.2.7系统调试和测试
对该图书管理系统进行测试,验证每个功能是否符合要求,具体的测试如下: (1)通过视图查看各个基本表和视图中的数据(见附录2) (2)检测各个存储过程的功能:(见附录2) 【本章小结】
本章简单概括数据库设计的原则及技巧,通过图书管理系统设计实例重点介绍了数据库的设计过程。在设计过程中应该注意哪些问题,同时具体的实时过程在附录中。通过本章的学习,学生能够基本掌握数据库的具体设计过程及设计思路,为后期应用系统开发的数据库设计打下基础。
22
参考文献
[1] 萨师煊 王珊,数据库系统概论(第三版),北京:高教出版社,2000 [2] Delpehi数据库开发毕业设计指导及实例;机械工业出版社,2004
1
附 录
附录1 存储过程定义
1.Book_Insert的定义:
CREATE PROCEDURE Book_Insert
@BookID char(9) , @BookNo char(20), @BookName char(50), @BookWriter char(30), @BookPublish char(20), @BookPrice char(7), @BookDate datetime, @BookClass char(20), @BookMain char(200), @BookPrim char(30), @BookCopy char(5), @BookState char(10), @BookRNo char(5) as
insert into Book
values(@BookID ,@BookNo,@BookName,@BookWriter ,@BookPublish ,@BookPrice,
@BookDate,@BookClass ,@BookMain ,@BookPrim ,@BookCopy ,@BookState , @BookRNo);
2.Reader_Insert的定义:
CREATE PROCEDURE Reader_Insert
@ReaID char(9), @ReaName char(10), @ReaSex char(2), @ReaNo char(9), @ReaLBID char(5), @ReaType char(20), @ReaDep char(20), @ReaGrade char(5), @ReaPref char(20), @ReaDate Datetime as
insert into Reader
values( @ReaID , @ReaName, @ReaSex,@ReaNo ,@ReaLBID,@ReaType,@ReaDep ,
2
@ReaGrade ,@ReaPref ,@ReaDate);
3.Maneger_Insert的定义:
CREATE PROCEDURE Maneger_Insert
@MID char(10) , @MName char(10), @MSex char(2), @Mpwd char(8), @MAuth char(40), @MTeleph char(15), @MAddre char(30) as
insert into Maneger
alues(@MID , @MName ,@MSex ,@Mpwd ,@MAuth ,@MTeleph ,@MAddre);
4.Borrow_Insert的定义:
CREATE PROCEDURE Borrow_Insert
@BookID char(9), @ReaID char(9), @Outdate Datetime , @YHdate Datetime , @Indate Datetime, @Fine char(5), @CLState char(8), @MID char(10) as
insert into Borrow
values(@BookID ,@ReaID ,@Outdate ,@YHdate ,@Indate ,@Fine ,@CLState ,@MID );
5.Query_Reader_R的定义: create procedure Query_Reader_R
@ReaID char(9) as select *
from Readerview
where 编号 = ltrim(@ReaID);
6. Query_Reader_M的定义: create procedure Query_Reader_M
as select *
from Readerview
7. Query_Book_Writer的定义: create procedure Query_Book_Writer
3
@BookWriter char(50) as select * from Bookview
where 作者 like '%'+ltrim(@BookWriter)+'%';
8. Query_Book_Name_Publish的定义:
create procedure Query_Book_Name_Publish
@BookName char(50), @BookPublish char(20) as select *
from Bookview
where 书名=ltrim(@BookName) and 出版社=ltrim(@BookPublish);
9. Delete_Reader的定义: create procedure Delete_Reader
@ReaNo char(9) as delete from Reader
where ReaNo = ltrim(@ReaNo);
10. Delete_Book的定义:
create procedure Delete_Book
@BookID char(9) as delete from Book
where BookID= ltrim(@BookID);
4
附录2 数据查看和存储过程功能的验证
1. 基本表的数据查看(基于视图查询): 1) 查看Reader(读者信息表)表中的数据
2) 查看Bookview(图书信息)表中的数据:
3) 查看Borrow(借阅信息)表中的数据:
5
4)查看Maneger(管理员信息表)表中的数据
5)查看Room(馆室信息表)表中的数据:
6
6)查看Borrowview(当前借阅信息)视图中的数据:
7)查看Historyview(借阅历史信息)视图的数据:
8)查看Fineview(罚款信息)视图的基本数据:
2. 存储过程功能的验证:
1) 存储过程Query_Reader_R功能的验证:(按ReaID匹配查询读者信息)
7
2) 存储过程Query_Book_Writer 功能的验证:(按BookWriter模糊查询图书信息)
3) 存储过程Query_Book_Nmae_Publish功能的验证:(按书名和出版社查询图书信息)
4)存储过程Query_Reader_M功能的验证:(以管理员身份查询读者信息) 5)存储过程Reader_Insert 功能的验证:(插入一条读者信息记录)
8
6)存储过程Borrow_Insert功能的验证:(插入一条借阅信息记录)
7)存储过程Delete_Reader功能的验证:(按ReaNo删除相应的读者记录)
(注:由于篇幅限制,这里仅给出了其中几个存储过程功能的验证)
3. 触发器功能的验证:(在Borrow表中插入一条记录,触发Book表将图书由“可借”状态改为“不可借”
状态)
9
附录3 所有的SQL运行语句
create database Book;
create table ReaderType(
LBID char(5) primary key, LBName char(20) not null, LBnum char(5) not null, LBbqx char(4) not null, LBqx char(3) not null, )
create table Maneger(
MID char(10) primary key, MName char(10) not null, MSex char(2),
Mpwd char(8) not null, MAuth char(40) not null, MTeleph char(15), MAddre char(30),
check(MSex ='男' or MSex ='女') )
create table Room(
RoomNo char(5) primary key, RoomMID char(10) not null, Roomnum char(5), RoomAddre char(20),
foreign key(RoomMID) references Maneger(MID), )
create table Book(
BookID char(9) primary key, BookNo char(20) not null, BookName char(50)not null, BookWriter char(30)not null, BookPublish char(20)not null, BookPrice char(7), BookDate datetime, BookClass char(20), BookMain char(200), BookPrim char(30), BookCopy char(5), BookState char(10)not null,
1
BookRNo char(5)not null,
foreign key(BookRNo) references Room(RoomNo),
)
create table Reader(
ReaID char(9) primary key, ReaName char(10) not null, ReaSex char(2) not null, ReaNo char(9) not null, ReaLBID char(5) not null, ReaType char(20), ReaDep char(20), ReaGrade char(5), ReaPref char(20), ReaDate Datetime,
foreign key(ReaLBID) references ReaderType(LBID), check(ReaSex ='男' or ReaSex ='女')
)
create table Borrow(
BookID char(9), ReaID char(9),
Outdate Datetime not null, YHdate Datetime not null, Indate Datetime, Fine char(5), CLState char(8), MID char(10) not null, primary key(BookID,ReaID),
foreign key(MID) references Maneger(MID)
)
create clustered index BookPublish on Book(BookPublish); create clustered index ReaDep on Reader(ReaDep);
create view Bookview (索书号, 书名, 作者, 出版社, 图书状态) as
select BookNo,BookName,BookWriter,BookPublish,BookState from Book
create view Readerview (编号,读者姓名,类型,学院,专业,办证日期) as
select ReaID,ReaName,ReaType,ReaDep,ReaPref,ReaDate from Reader
2
create view Borrowview (读者编号,书名,作者,借阅日期,到期日期) as
select ReaID,BookName,BookWriter,Outdate,YHdate from Borrow,Book
where Borrow.BookID=Book.BookID and Borrow.Indate is null
create view Historyview (读者编号,书名,借阅日期,归还日期) as
select ReaID,BookName,Outdate,Indate from Borrow,Book
where Borrow.BookID=Book.BookID and Borrow.Indate is not null
create view Fineview (读者编号,书名,借阅日期,归还日期,罚款,处理状态) as
select ReaID,BookName,Outdate,Indate,Fine,CLState from Borrow,Book
where Borrow.BookID=Book.BookID and Fine is not null
create trigger Reader_delete on Reader for delete as
delete Borrow from deleted
where Borrow.ReaID=deleted.ReaID create trigger Borrow_insert1 on Borrow for insert as
declare @BookID char(9) select @BookID=BookID from inserted update Book
set BookState='不可借' where BookID=@BookID
3
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务