案例 数据库管理系统综合应用由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据库管理系统案例”。
实验十二
数据库管理系统综合应用
-------图书管理系统系统一、实验目的:
通过完成从用户需求分析、数据库设计到上机编程、调试和应用等全过程,进一步了解和掌握所讲解的内容。
二、实验简述:
一个简单的图书管理系统包括图书馆内书籍的信息、学校在校学生的信息以及学生的借阅信息。此系统功能分为面向学生和面向管理员两部分,其中学生可以进行借阅、续借、归还和查询书籍等操作,管理员可以完成书籍和学生的增加、删除和修改以及学生借阅、续借、归还的确认。
三、实验要求:
完成该系统的数据库设计;
用SQL实现数据库的设计,并在SQL Server上调试通过。
四、参考答案:
1、需求分析(1)学生
学生的操作流程如图B.1所示。
登录查询书籍预定书籍续借书籍注销图B.1 学生操作分类表
(2)管理员
管理员可完成书籍和学生的增加、删除和修改以及对学生借阅、续借、归还的确认,其操作流程如图B.2所示。
登录书籍信息维护学生信息维护借阅图书确认归还图书确认注销图B.2 管理员操作分类表
2、概念模型设计
数据库需要表述的信息有以下几种:(1)图书信息(2)学生信息(3)管理员信息
(4)学生预定图书信息
(5)学生借阅归还图书信息
可以用E/R模型表述该模型的设计,E/R图如图B.3所示。
姓名学号学生预定续借系别书号借阅作者出版社图书书名归还语种出版年管理员编号姓名图B.3 模型的E-R图
3、逻辑设计
通过E/R模型到关系模型的转化,可以得到如下关系模式:
(1)Book(BookID,Title,Author,Publisher,Pyear,Language)(2)Student(ID,Name,Dept)(3)Aistent(ID,Name)
(4)BBook(BookID,StdID,BDate)(5)RBook(BookID,StdID,RDate)
(6)Lend(StdID,AstID,BookID,LDate)(7)Return(StdID,AstID,BookID,RDate)
说明
(1)书号是图书的键码,每本书有惟一的书号,一个学生可同时借阅多本书。一个管理员可处理多个同学的借阅等事宜。
(2)一般情况下,学生、管理员和图书之间的联系为1:1:n,借书关系Lend作为连接关系,其键码为n端实体集的键码,即书号为借书关系的键码。这反映了如果还书时也把当初的借书记录删除,则书号就能惟一识别一个元组。
如果还书时不同时删除借书记录,则意味着同一本书前后可借给不同的学生,于是学生、管理员和图书之间的联系变为m:1:n,这时借书关系的键码为书号和学号的组合。
如果在不删除借书记录的情况下,同一学生再次借同一本书,这时,学生、管理员和图书之间的联系变为m:p:n,于是,借书关系的键码为书号、学号和管理员号的组合。但这里有一个隐含的信息,即同一学生前后两次借同一本书所遇到的管理员不同,而这种不同可能仅仅是“日期”不同。因此,借书日期成了必不可少的成分,也就是说,在这种情况下,属性全集才是借书关系的键码。
总之,借书关系的键码与图书管理模式有关,读者可按照自己的理解确定键码,并编写相应的事务处理流程。其他关系也有类似之处。
(3)要知道图书当前的状态,是在图书馆存放,还是被借阅等,需要在Book的模式中增加对应项用以表示图书当前的状态。比如我们增加State,并且约定取值和状态的对应关系如下:
1)在图书馆中并且没有被预定 2)在图书馆中并且已被除数预定 3)被借出并且没能被预定 4)被借出并且已被预定
4、物理设计
为了提高在表中搜索元组的速度,在实际实现的时候应该基于键码建立索引。下面是各表中建立索引的表项:
Book(BookID)
Student(ID)
5、用SQL实现设计(1)建立Book表 CREATE TABLE Book(BookID
varchar(20)PRIMARY KEY,Title
varchar(50)NOT NULL,Author
varchar(50),Publisher varchar(50),Pyear
char(4),Language char(1)DEFAULT ’c’,State
char(1)DEFAULT ’0’);
(2)建立Student表 CREATE TABLE Student 3(ID
varchar(6)PRIMARY KEY,Name
varchar(20)NOT NULL,Dept
varchar(20)NOT NULL);
(3)建立Aistent表 CREATE TABLE Aistent(ID
varchar(6)PRIMARY KEY,Name
varchar(20)NOT NULL,);
(4)建立BBook表 CREATE TABLE BBook(BID
varchar(20)NOT NULL,StdID
varchar(6)
NOT NULL,BDate
datetime
NOT NULL, CONSTRAINT FK_BBOOK_BID
FOREIGN KEY(BID)REFERENCES Book(BookID), CONSTRAINT FK_BBOOK_StdID
FOREIGN KEY(StdID)REFERENCES Student(ID));
(5)建立RBook表 CREATE TABLE RBook(BookID
varchar(20)NOT NULL,StdID
varchar(6)NOT NULL,RDate
datetime
NOT NULL, CONSTRAINT FK_RBOOK_BookID
FOREIGN KEY(BookID)REFERENCES Book(BookID), CONSTRAINT FK_RBOOK_StdID
FOREIGN KEY(StdID)REFERENCES Student(ID));
(6)建立Lend表 CREATE TABLE Lend(StdID
varchar(6)NOT NULL,AstID
varchar(6)NOT NULL,BookID
varchar(20)NOT NULL,LDate
datetime
NOT NULL, CONSTRAINT FK_LEND_StdID
FOREIGN KEY(StdID)REFERENCES Student(ID), CONSTRAINT FK_LEND_AstID
FOREIGN KEY(AstID)REFERENCES Aistent(ID), CONSTRAINT FK_LEND_BookID
FOREIGN KEY(BookID)REFERENCES Book(BookID));
(7)建立Return表 CREATE TABLE Return(StdID
varchar(6)NOT NULL,AstID
varchar(6)NOT NULL,BookID
varchar(20)NOT NULL,RDate
datetime
NOT NULL, CONSTRAINT FK_RETURN_StdID
FOREIGN KEY(StdID)REFERENCES Student(ID), CONSTRAINT FK_ RETURN _AstID
FOREIGN KEY(AstID)REFERENCES Aistent(ID), CONSTRAINT FK_ RETURN _BookID
FOREIGN KEY(BookID)REFERENCES Book(BookID));
(8)管理员操作 1)增加学生:
INSERT INTO Student(ID, Name, Dept)VALUES(#StdNo, #Name, #Dept);2)删除学生:
DELETE FROM Student WHERE(ID=#ID);3)修改学生信息:
UPDATE Student SET Name=#Name, Dept=#Dept WHERE(ID=#ID);4)增加书籍:
INSERT INTO Book(BookID, Title, Author, Publisher, Pyear, Language)VALUES(#BookID, #Title, #Author, #Publisher, #Pyear, #Language);5)删除书籍:
DELETE FROM Book WHERE(BookID=#BookID);6)修改书籍信息:
UPDATE Book SET Title=#Title, Author =#Author, Publisher =#Publisher,Pyear =#Pyear, Language =#Language WHERE(BookID=#BookID);7)学生借阅图书: BEGIN TRANSACTION INSERT INTO Lend(StdID, AstID, BookID, LDate)VALUES(#StdID, #AstID, #BookID, #LDate);5 UPDATE BOOK SET State=’2’ WHERE BookID=#BookID COMMIT;8)学生归还图书: BEGIN TRANSACTION INSERT INTO Return(StdID, AstID, BookID, RDate)VALUES(#StdID, #AstID, #BookID, #RDate);UPDATE BOOK SET State=’0’ WHERE BookID=#BookID COMMIT;(9)学生操作 1)预定图书:
CREATE PROC Book_Book
@BookID varchar(20),@StdID char(6), @BDate datetime AS DECLARE @TransName VARCHAR(20)SELECT @TransName=’Book_Book’ BEGIN TRANSACTION @TransName DECLARE @booked int, @book_state_before char(1), @book_state_after char(1)SELECT @booked=count(*)FROM BBook WHERE BID=@BookID IF @booked>0
ROLLBACK TRANSACTION @TransName ELSE BEGIN
SELECT @book_state_before=state FROM Book WHERE BookID=@BookID IF @book_state_before=’0’
SELECT @book_state_after=’1’ ELSE IF @book_state_before=’2’
SELECT @book_state_after=’3’
UPDATE Book SET state=@book_state_after WHERE BookID=@BookID INSERT INTO BBook(BID,StdID,BDate)VALUES(@BookID,@StdID,@BDate)
COMMIT TRANSACTION @TransName END GO 学生预定图书,假设图书已经被预定了,则不允许继续预定。否则的话应该根据图书是在馆内还是被借出去两种情况,修改图书当前的状态。最后在预定表中插入一条记录。修改记录和插入新记录应该发生或都不发生,所以将这个动作封闭成一个事务,保证这个操作的原子性。2)续借图书:
CREATE PROC Renew_Book
@BookID varchar(20),@StdID char(6), @RDate datetime AS DECLARE @TransName VARCHAR(20)SELECT @TransName=’Renew_Book’ BEGIN TRANSACTION @TransName DECLARE @booked int SELECT @booked=count(*)FROM BBook WHERE BID=@BookID 6 IF @booked=0 INSERT INTO RBook(BID,StdID,BDate)VALUES(@BookID,@StdID,@RDate)
COMMIT TRANSACTION @TransName END GO 学生续借图书,假设图书已经被预定了,则不允许续借。否则,在续借记录中插入一条记录就可以了。把这个动作封装成一个存储过程是为了使用方便明了。
由于这个数据库实际上更加偏重于模型化,而不是一个实际环境中的数据库,所以在实现应用模型的时候还需要对这个数据库的模型作一些修改。
6、实验总结
通过这次实验,进一步了解什么情况下使用事务。
(请读者结合自己的实际情况,认真总结自己的收获,体会以及有待改进之处。)