数据库设计案例之一——图书管理数据库的设计现在要求为某学校图书馆设计一个图书管理系统的数据库,背景如下:该学校是一所多学科、多层次大学,学校有高职生、本科生(含一本、二本、三本)、硕士研究生(含MBA)和博士研究生等多种层次的学生,图书馆为全校学生和教职工提供图书借阅服务。图书馆按照图书的性质(中文图书、外文图书、新书)将借阅分为不同的借阅种类:中文图书借阅、外文图书借阅和(新书)短期外借;不同的读者对象也有不同的借阅要求。对每种借阅类型和读者,其借阅册数、借期、是否允许续借、续借期限等不同。不同借阅种类和借阅对象的借阅要求规定如附1所示。例如:本专科学生可以借中文图书5本,借期30天,可以续借一次,续借15天。“新书”的概念是相对的,一本新书在上架(或入库)后的60天内只提供短期外借,此后即自动地成为中文图书或者外文图书。借出的图书不能在当天归还。每次借阅后读者最多可以续借一册图书一次。在本馆所借的文献资料,均应在规定的期限内按时归还。逾期不还者,将分别按以下规定处理:中文图书借阅:每册每天罚款0.2元。新书借阅和外文图书借阅:每册每天罚款0.5元。在超期图书归还并缴清罚款之前,读者不可借阅图书;超期图书也不能续借。对于超期的图书,图书管理系统将自动向读者电子邮箱中发一封电子邮件催还图书。每个读者都要有一个编号,并记录读者的姓名、性别、类型(学生、教师等)、单位、电子信箱等。图书馆采编部负责对入库的文献资料按规定进行编目、著录、加工、建库。对每本图书、杂志,要记录其基本信息,如名称、作者、ISBN号、出版地、出版社、出版时间、字数、单价、内容简介、所属分类号等,其中,图书分类按照中图法分类规则进行分类。中图法分类简表见后。学校有三个校区,相应地,馆藏分布于三个分馆中:A图书馆(侧重于经济管理、综合类)、B图书馆(侧重于理工、计算机类)和C图书馆(侧重于法学、外语、体育、艺术、音乐等方面)。图书馆中每种图书可能采购多册,分布在多个馆中。全校师生可以在任何一个分馆中借阅。每个分馆中的图书借完为止,如本部图书馆有某图书1本,这本图书借出后,在归还之前,本部图书馆中就查阅到该图书为借出状态,而且,馆藏已空,但是读者可以到其他馆中借阅。图书的归还遵循属地原则,即从哪个分馆借出的图书必须要在那个分馆中归还。图书馆管理员有权更改图书到期时间,比如将本来暑假到期的图书的到期时间改为9月10日。读者可以在网上查询自己的图书借阅情况,一般读者只可以查阅到自己的借阅情况和图书的信息,而管理员可以查看任何读者的信息、借阅情况,任何图书的信息和借阅情况。在网上查询系统中,每个用户都分配了用户名(全局唯一)和密码,其中,用户名就是读者号,密码初始值为读者的学号或者工号,可以修改。附1:图书借阅册数与期限表附2:中图法分类号示例:A马克思主义、列宁主义、毛泽东思想、邓小平理论A1马克思、恩格斯著作A2列宁著作A3斯大林著作A4毛泽东著作A49邓小平著作A5马克思、恩格斯、列宁、斯大林、毛泽东、邓小平著作汇编A7马克思、恩格斯、列宁、斯大林、毛泽东、邓小平生平和传记A8马克思主义、列宁主义、毛泽东思想邓小平理论的学习和研究B哲学、宗教B0哲学理论B1世界哲学B2中国哲学B3亚洲哲学B4非洲哲学B5欧洲哲学B6大洋洲哲学B7美洲哲学B80思维科学B81逻辑学(论理学)B82伦理学(道德学)B83美学B84心理学B9宗教请你设计一个数据库,并确定要满足的各种约束,使得其中:保存了所需的所有信息;支持图书管理的各种应用;尽可能地优化:减少冗余、提高查询速度。画实体-联系图。将实体-联系图转换为关系表。实体-联系图寻找实体集:读者图书分馆图书类别其他?寻找实体集之间的联系:读者和图书之间的多对多联系:借阅图书和分馆之间的多对一联系:馆藏图书和图书类别之间的多对一联系:分类确定实体的属性:读者:读者编号、姓名、性别、类型、单位、电子信箱,其他?图书:名称、作者、ISBN号、出版地、出版社、出版时间、字数、单价、内容简介、所属分类号、入库时间,其他?分馆:编号、名称、联系电话、馆址图书类别:分类号、分类名称确定联系的属性:借阅:借阅日期实体-联系图(续)检查是否包含了所有必需的信息?图书分为中文图书、外文图书、新书。对每种借阅类型和每种读者,借阅册数、期限、是否可续借、续借周期等不同。读者是否可继续借阅,是否可续借?不同借阅类型超期后的罚款额度?读者是否应缴纳罚款?缴纳多少罚款?一本具体的图书所在的分馆?用户的用户名和密码?某图书的馆藏情况?图书分为中文图书、外文图书、新书表示为图书的一个属性还是图书和图书种类的联系?图书种类:图书种类号、种类名称图书和图书种类之间存在多对一的联系!类似地,读者分为教师、研究人员/非教研人员(含离退休人员)/博士研究生/硕士研究生(含MBA)/本专科学生(含高职生)读者类型:类型号、类型名称读者和读者类型间存在多对一的联系对每种借阅类型和每种读者,借阅册数、期限、是否可续借、续借周期等不同用图书种类和读者类型之间的联系表示借阅类型:借阅册数、借期、允许续借否、续借时间读者是否可继续借阅?可以为读者实体添加一个属性:能否借阅,表示读者是否可以继续借阅;不同借阅类型超期后的罚款额度?给图书种类添加一个属性:罚款金额(每册每天)图书种类:图书种类号、种类名称、罚款金额读者是否应缴纳罚款?缴纳多少罚款?如果所有图书在期限内归还,则无需缴纳罚款;类似,罚款金额需要根据超期天数以及图书种类确定需要给借阅联系添加属性“归还日期”!一本具体的图书所在的分馆?几册相同的图书(即ISBN号相同)可能在不同的分馆中,因此,每册图书都应该是可以区分的,应该有一个唯一的图书编号!一册图书所在的分馆通过馆藏关系可知。用户的用户名和密码?用户和读者的关系?需要用户实体集。对于读者而言,可否直接加入一个属性“密码”来表示这部分信息?请思考。不同的用户有不同的权限。用户:用户名、登录密码、权限。用户和读者之间存在联系,这是什么样的联系?小结实体:读者:读者编号、姓名、性别、类型、单位、电子信箱、能否借阅图书:图书编号、名称、作者、ISBN号、出版地、出版社、出版时间、字数、单价、内容简介、所属分类号、入库时间分馆:编号、名称、联系电话、馆址图书类别:分类号、分类名称读者类型:类型号、类型名称图书种类:图书种类号、种类名称、罚款金额用户:用户名、登录密码、权限小结(续)实体间的联系:图书读者分馆图书类别读者类型图书种类用户属于1n属于1n分类n1属于1n借阅mn借阅类型mn属于1n检查是否支持各种应用如何支持图书馆管理员更改部分图书的到期时间?更改借阅期限?会影响到所有图书!比较灵活的方法是在借阅联系中增加属性:应还日期,每册图书的应还日期根据图书种类和读者类型以及借阅日期计算出来,要更改某些图书的到期时间,只需更改该属性即可!如何支持续借?读者不一定可以续借,是否可以续借不仅取决于图书种类,也取决于读者是否已经续借过该册书。需要在借阅联系中设置一个属性:能否续借?如何让新书在一定的期限后自动成为中文图书和外文图书?新书变成中文图书还是外文图书主要看新书的语言,如果是中文,则过期后变成中文图书,否则便成外文图书。需要在图书实体中增加一个属性:语言。如何支持图书借出状态的察看?为了方便查看图书是否已借出,可以在图书中增加属性:借出状态。检查是否支持各种应用(续)实体联系图转换为关系表实体转化为单独的一张表读者表:读者编号、姓名、性别、类型、单位、电子信箱、能否借阅。图书表:图书编号、名称、作者、ISBN号、出版地、出版社、出版时间、字数、单价、内容简介、所属分类号、入库时间、语言、借出状态。分馆表:编号、名称、联系电话、馆址。图书类别表:分类号、分类名称。读者类型表:类型号、类型名称。图书种类表:图书种类号、种类名称、罚款金额。用户表:用户名、登录密码、权限。多对多联系转换为一张单独的关系表借阅类型表:读者类型、图书种类、借阅册数、借期、允许续借否、续借时间。借阅表:读者号、图书编号、借阅日期、应还日期、归还日期、能否续借。一对多的联系通过在多表中添加属性来实现:读者表:读者编号、姓名、性别、类型、单位、电子信箱、能否借阅、读者类型。图书表:图书编号、名称、作者、ISBN号、出版地、出版社、出版时间、字数、单价、内容简介、所属分类号、入库时间、语言、借出状态、图书种类、图书类别、所在分馆实体联系图转换为关系表(续)用户表比较特殊:用户表:用户名、密码、权限。其中,用户名和读者号对应,但是也有一些用户名没有和读者号对应,这些用户名表示管理员。实体联系图转换为关系表(续)优化为了减少读者表中的冗余,将读者表分解为:读者表:读者编号、姓名、性别、类型、单位号、电子信箱、能否借阅。单位表:单位号、单位名称、联系电话。为了减少图书中的冗余,将图书表分解为:图书表:图书编号、名称、作者、ISBN号、出版社号、出版时间、字数、单价、内容简介、所属分类号、入库时间、语言、借出状态、图书种类、图书类别、所在分馆。出版社表:出版社号、出版社名称、出版地。分解前后该表分别属于第几范式?简化借阅类型表:借阅类型表:读者类型、图书种类、借阅册数、借期、续借时间。若续借时间为0,则表示不允许续借。优化确定完整性约束确定实体完整性约束借阅表:读者编号、图书编号、借阅日期、应还日期、归还日期、能否续借。主键是什么?其他(略)参照完整性约束略用户定义完整性约束数据类型约束。数据长度、精度约束。取值范围约束。电子信箱的格式应为“xxx@xxx.xxx”格式。图书表中出版时间要早于入库时间,语言取值范围为:{中文,外文}、借出状态、图书种类、图书类别、所在分馆。用户表权限的取值范围为{0,1},取值0表示普通读者,取值1表示管理员。借阅表中“借阅日期”大于图书表中“入库时间”,小于“应还日期”和“归还日期”,“能否续借”的取值首先要参照借阅类型表中“续借时间”,如果“续借时间”为0,则“能否续借”值为F,否者“能否续借”初始值为T。如果借阅表中“归还日期”大于“应还日期”,则对应的读者表中“能否借阅”值为F。确定完整性约束(续)借阅表中“归还日期”如果非空,则应大于“借阅日期”。其他:如默认值、空值等等。还有其他约束吗?确定完整性约束(续)进一步的思考在这种数据库模式下,能否检测得到某一读者所借图书数量是否超过范围?可以如何改进?这些关系表达到了第几范式?