圖書管理系統數據庫設計

實驗八 圖書管理系統數據庫設計

一、實驗學時

2學時

二、實驗目的

(1)熟悉SQL Sever基本操作。
(2)利用T-SQL語句實現相關操作。
(3)通過完成從用戶需求分析、概念結構設計,邏輯結構設計等一系列的數據庫設計到上機編程、調試和應用等全過程,掌握數據庫設計的基本步驟。
(4)進一步理解和掌握數據庫原理的相關內容。

三、實驗內容

設計一個簡單的圖書管理系統包括圖書館內書籍的信息、學校在校學生的信息以及學生的借閱信息。此係統功能分爲面向學生和麪向管理員兩部分,其中面向學生部分可以進行預定、續借和查詢書籍等操作,面向管理員部分可以完成書籍和學生的增加、刪除和修改以及對學生借閱、歸還的確認。

1.需求分析
(1)學生
學生的操作流程如圖8-1所示。

圖8-1 學生的操作流程
(2)管理員
管理員可完成書籍和學生的增加、刪除和修改以及對學生借閱、續借、歸還的確認,其操作流程如圖8-2 所示。

圖8-2 管理員操作流程

2.概念模型設計
數據庫需要表述的信息有以下幾種:
(1)圖書信息
(2)學生信息
(3)管理員信息
(4)學生預定圖書信息
(5)學生借閱還圖書信息
說明:
1)書號是圖書的鍵碼,每本書有唯一的書號。一個學生可同時借閱多本書。一個管理員可處理多個同學的借閱等事宜。
2)一般情況下,學生、管理員和圖書之間的聯繫爲1:1:n,借書關係Lend作爲連接關係,其鍵碼爲n端實體集的鍵碼,即書號爲借書關係的鍵碼。這反映瞭如果還書時也把當初的借書記錄刪除,則書號就能唯一識別一個元組。
如果還書時不同時刪除借書記錄,則意味着同一本書前後可借給不同的學生,於是學生、管理員和圖書之間的聯繫變爲m:1:n,這時借書關係的鍵碼爲書號和學號的組合。
如果在不刪除借書記錄的情況下,同一學生再次借同一本書,這時,學生、管理員和圖書之間的聯繫變爲m:p:n,於是,借書關係的鍵碼爲書號、學號和管理員號的組合。但這裏有一個隱含的信息,即同一學生前後兩次借同一本書所遇到的管理員不同,而這種不同可能僅僅是“日期”不同。因此,借書日期成了必不可少的成分,也就是說,在這種情況下,屬性全集纔是借書關係的鍵碼。
總之,借書關係的鍵碼與圖書管理模式有關,讀者可按照自己的理解確定鍵碼,並編寫相應的事務處理流程。其他關係也有類似之處。
3)要知道圖書當前的狀態,是在圖書館存放,還是被借閱等,需要在Book的模式中增加對應項用以表示圖書當前的狀態。比如我們增加State,並且約定取值和狀態的對應關係如下:
0:在圖書館中並且沒有被預定
1:在圖書館中並且已被預定
2:被借出並且沒有被預定
3:被借出並且已被預定
用E-R模型表達該模型的設計,畫出E-R模型如下:

圖8-3 模型的E-R圖

3.邏輯設計
通過E-R模型到關係模型的設計,請寫出關係模式:(實體或屬性的英文可以自取)
1、Book(BookID,Title,Author,Publisher,Pyear,Language,State)
2、Student(ID,Name,Dept)
3、Assist(ID,Name)
4、BBook(BookID,StuID,BDate)
5、RBook(BookID,StuID,RDate)
6、Lend(StuID,AstID,BookID,LDate)
7、BookRtn(StuID,AstID,BookID,RDate)

4.物理設計
爲了提高在表中搜索元組的速度,在實際實現的時候應該基於鍵碼建立索引。下面是各表中建立索引的表項:
(1)在書表中按書號建立索引
T-SQL語句:
CREATE INDEX Book_Idx ON Book(BookID);
(2)在學生表中按學號建立索引
T-SQL語句:
CREATE INDEX Student_Idx ON Student(ID);

5.用T-SQL實現設計
(1)建立數據庫表(注意自定義約束)
1)建Book(圖書信息)表
T-SQL:
CREATE TABLE Book(
BookID varchar(20) PRIMARY KEY,
Title varchar(50) NOT NULL,
Author varchar(50),
Publisher varchar(50),
Pyear char(8),
Language char(2),
State char(1) DEFAULT ‘0’);

2)建Student(學生信息)表
T-SQL:
CREATE TABLE Student(
ID varchar(10) PRIMARY KEY,
Name varchar(18) NOT NULL,
Dept varchar(18) NOT NULL);

3)建Assist(管理員信息)表
T-SQL:
CREATE TABLE Assist(
ID varchar(8) PRIMARY KEY,
Name varchar(18) NOT NULL);

4)建BBook(學生預定圖書信息)表
T-SQL:
CREATE TABLE BBook(
BookID varchar(20) NOT NULL,
StuID varchar(10) NOT NULL,
BDate datetime NOT NULL,
CONSTRAINT PK_BBOOK
PRIMARY KEY(BookID,StuID),
CONSTRAINT FK_BBOOK_BID
FOREIGN KEY(BookID) REFERENCES Book(BookID),
CONSTRAINT FK_BBOOK_StdID
FOREIGN KEY(StuID) REFERENCES Student(ID));

5)建RBook(學生續借圖書信息)表
T-SQL:
CREATE TABLE RBook(
BookID varchar(20) NOT NULL,
StuID varchar(10) NOT NULL,
RDate datetime NOT NULL,
CONSTRAINT PK_RBOOK
PRIMARY KEY(BookID,StuID),
CONSTRAINT FK_RBOOK_BookID
FOREIGN KEY(BookID) REFERENCES Book(BookID),
CONSTRAINT FK_RBOOK_StdID
FOREIGN KEY(StuID) REFERENCES Student(ID));

6)建Lend(學生借閱信息)表
T-SQL:
CREATE TABLE Lend(
StuID varchar(10) NOT NULL,
AstID varchar(8) NOT NULL,
BookID varchar(20) NOT NULL,
LDate datetime NOT NULL,
CONSTRAINT PK_LEND
PRIMARY KEY(StuID,AstID,BookID),
CONSTRAINT FK_LEND_StuID
FOREIGN KEY(StuID) REFERENCES Student(ID),
CONSTRAINT FK_LEND_AstID
FOREIGN KEY(AstID) REFERENCES Assist(ID),
CONSTRAINT FK_LEND_BookID
FOREIGN KEY(BookID) REFERENCES Book(BookID));

7)建BookRtn(學生還書信息)表
T-SQL:
CREATE TABLE BookRtn(
StuID varchar(10) NOT NULL,
AstID varchar(8) NOT NULL,
BookID varchar(20) NOT NULL,
RDate datetime NOT NULL,
CONSTRAINT PK_BookRtn
PRIMARY KEY(StuID,AstID,BookID),
CONSTRAINT FK_BookRtn_StdID
FOREIGN KEY(StuID) REFERENCES Student(ID),
CONSTRAINT FK_BookRtn_AstID
FOREIGN KEY(AstID) REFERENCES Assist(ID),
CONSTRAINT FK_BookRtn_BookID
FOREIGN KEY(BookID) REFERENCES Book(BookID));

(2)管理員操作
1)在學生表中增加一位學生的基本信息:
T-SQL:
INSERT INTO Student(ID,Name,Dept) VALUES(#StuNo,#Name,#Dept);
2)在學生信息表中刪除一學生的信息。
T-SQL:
DELETE FROM Student WHERE(ID=#ID);
3)在學生信息表中修改一學生信息。
T-SQL:
UPDATE Student SET Name=#Name, Dept=#Dept WHERE ID=#ID;
4)在圖書表中增加一本圖書信息。
T-SQL:
INSERT INTO Book(BookID,Title,Author,Publisher,Pyear,Language)
VALUES(#BookID,#Title,#Author,#Publisher,#Pyear,#Language);

5)在圖書表中刪除一本圖書信息。
T-SQL:
DELETE FROM Book WHERE BookID=#BookID;
6)在圖書信息表中修改一本圖書信息。
T-SQL:
UPDATE Book SET Title=#Title, Author=#Author, Publisher=#Publisher,
Pyear=#Pyear, Language=#Language WHERE BookID=#BookID;

事務定義:
1)定義學生借閱圖書這一事務(即向學生借閱信息表中插入一條記錄,同時修改圖書信息表中相關書籍的狀態信息)。
T-SQL:
BEGIN TRANSACTION
INSERT INTO Lend(StuID,AstID,BookID,LDate)
VALUES(#StuID,#AstID,#BookID,#LDate);
UPDATE Book SET State=‘2’ WHERE BookID=#BookID
COMMIT;

2)定義學生歸還圖書這一事務(即向學生還書信息表中插入一條記錄,同時修改圖書信息表中相關書籍的狀態信息)。
T-SQL:
BEGIN TRANSACTION
INSERT INTO BookRtn(StuID,AstID,BookID,RDate)
VALUES(#StuID, #AstID, #BookID, #RDate);
UPDATE Book SET State=‘0’ WHERE BookID=#BookID;
COMMIT;

(3)學生操作
存儲過程定義:
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
IF @booked=0
INSERT INTO RBook(BID,StdID,BDate) VALUES(@BookID,@StdID,@RDate)
COMMIT TRANSACTION @TransName
END
GO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章