分析學校的圖書借閱系統,嘗試模擬該借閱系統的數據庫結構自行設計一個數據庫。數據庫所支持的功能和存儲的信息需至少包含如下幾個方面。
讀者信息,可參考下圖,只需設計其中主要屬性信息即可。需要注意,每個讀者可能有着不同的借閱權限,比如:本科生能借閱50本,教師能借閱100本,而且借閱時限也不同,所以,為了便於管理,將讀者分為不同等級,每個等級有着不同的借閱權限。因此需要設計借閱等級信息的結構,其中應包含最大借閱量,最長借閱時限等信息。
圖書信息,可參考下圖,只需設計其中主要屬性信息即可。與圖書內容相關的學科主題詞信息(主題詞經常要臨時增加,所以要單獨保存)。為了方便圖書館采購,還需要存儲出版社聯系信息(地址、通信方式等)。(注意,一部書只能由一個出版社出版)
注意,同一部書一般提供了多本供借閱,多本書有着不同的條碼號,如下圖所示,同一個書籍信息下提供了多本圖書,而且存放在不同位置。因此,需要考慮每部圖書信息和具體的每本圖書信息之間的關系。
讀者可以針對圖書進行評論,如下圖所示,包括評論內容,評論時間,評論者,評分等信息。注意評論針對的是一部圖書,而並非某一本書(因為有多本)。
----------要求-----------
分析設計以上基本問題的概念模型(E-R圖)。
根據概念模型設計相應的關系模式。
設定一些約束:例如,讀者姓名不能為空,讀者等級默認為0,圖書條碼為7位數字構成。
向每個數據表中輸入若干測試數據。
創建如下視圖:
視圖1:顯示所有當前仍未歸還的圖書條碼、借閱者姓名、編號、借閱時間和應還時間;
視圖2:顯示某圖書條碼和歷史總借閱量;
視圖3:顯示與某主題詞相關的所有圖書條碼和歷史總借閱量;
視圖4:顯示某讀者的編號(如20181001)和其當前所有未歸還圖書的條碼、圖書名稱和應還日期;
視圖5:顯示某讀者的編號和其對應的歷史借閱信息,包括圖書條碼、圖書名稱、實際借閱日期和實際歸還日期;
視圖6:顯示某讀者編號和其發表的書評內容,包括評論的圖書名稱、評論時間和評論內容;
視圖7:顯示某出版社名稱及其出版的所有圖書名稱。
ER圖:
代碼:
create database db use db create table 借閱等級信息( 借閱等級 int primary key, 最長借閱時間 int, 最大借閱數量 int, ) insert into 借閱等級信息 values (0, 30, 10), (1, 60, 20), (2, 90, 30), (3, 120, 40) create table 讀者信息( 姓名 char(15) not null, 證件號 char(12) primary key, 借閱等級 int default 0, 累計借書 int default 0, foreign key(借閱等級) references 借閱等級信息(借閱等級) ) insert into 讀者信息(姓名, 證件號, 借閱等級) values ('張三', '541607120165', 1), ('李四', '541707010185', 3), ('王五', '541707120165', 1), ('趙六', '541505980268', 2), ('孫七', '541407010169', 0), ('周八', '541307010489', 1) create table 出版社信息( 出版社 varchar(20) primary key, 地址 varchar(25), 聯系電話 char(7) ) insert into 出版社信息 values ('清華大學出版社', '北京', '4979421'), ('晟威出版社', '天津', '5564130'), ('南海出版公司', '海南', '4984910'), ('上海文藝出版社', '上海', '6640239') create table 圖書信息( 索書號 char(15) primary key, 作者 char(15), 書名 char(15), 出版社 varchar(20), 出版時間 date, foreign key(出版社)references 出版社信息(出版社) ) insert into 圖書信息 values ('b12987', '嚴蔚敏', '數據結構', '清華大學出版社', '2012-02-06'), ('b97894', '東野圭吾', '幻夜', '南海出版公司', '2004-08-02'), ('b16546', '吳玉華', '物理實驗教程', '清華大學出版社', '2013-05-15'), ('b89490', '張雪峰', '考研指點', '晟威出版社', '2016-12-12'), ('b56400', '郟宗培', '紙上尋仙記', '上海文藝出版社', '2011-02-05') create table 單本圖書信息( 條碼號 char(7) primary key check(len(條碼號) = 7), 索書號 char(15), 館藏地 varchar(40), 書刊狀態 varchar(6) check(書刊狀態 in ('可借', '借出', '非可借')), 歷史借閱量 int default 0, foreign key(索書號)references 圖書信息(索書號) ) insert into 單本圖書信息(條碼號, 索書號, 館藏地, 書刊狀態) values ('t987628', 'b97894', '三樓A8', '借出'), ('t594805', 'b97894', '二樓C7', '可借'), ('t984910', 'b89490', '五樓A2', '借出'), ('t940566', 'b12987', '負一樓D3', '借出') create table 借閱信息( 借閱號 char(6) primary key, 借閱時間 date, 歸還時間 date, 圖書條碼號 char(7), 借閱人證件號 char(12), foreign key(圖書條碼號) references 單本圖書信息(條碼號), foreign key(借閱人證件號) references 讀者信息(證件號) ) create table 評論信息( 評論號 char(8) primary key, 評分 numeric(2, 1), 內容 varchar(200), 評論時間 date, 評論者id char(12), 索書號 char(15), foreign key(索書號)references 圖書信息(索書號), foreign key(評論者id)references 讀者信息(證件號) ) insert into 評論信息 values ('p12391', 8.9, '很有趣', '2015-06-24', '541707010185', 'b97894'), ('p98523', 7.8, '受益頗多', '2016-05-22', '541307010489', 'b89490'), ('p94606', 6.8, '完全看不懂orz', '2017-05-02', '541607120165', 'b12987') create table 主題詞信息( ID char(8) primary key, 類別 char(15), 索書號 char(15), foreign key(索書號)references 圖書信息(索書號) ) insert into 主題詞信息 values ('z64400', '計算機', 'b12987'), ('z95410', '物理', 'b16546'), ('z98500', '考研', 'b89490'), ('z64165', '推理\懸疑', 'b97894'), ('z69850', '仙俠', 'b56400') --觸發器1:讀者借書后引發的一系列操作 use db go create trigger trigger1 on 借閱信息 after insert as begin update 讀者信息 --更改讀者累計借書量 set 累計借書 = 累計借書 + 1 from 讀者信息, inserted where 讀者信息.證件號 = inserted.借閱人證件號 update 單本圖書信息 --更改圖書狀態 set 單本圖書信息.書刊狀態 = '借出' from inserted, 單本圖書信息 where inserted.圖書條碼號 = 單本圖書信息.條碼號 update 單本圖書信息 set 歷史借閱量 = 歷史借閱量 + 1 --更改圖書歷史借閱量 from inserted, 單本圖書信息 where inserted.圖書條碼號 = 單本圖書信息.條碼號 end insert into 借閱信息 values ('j13488', '2018-05-01', '2018-08-01', 't987628', '541407010169') insert into 借閱信息 values ('j14910', '2016-12-11', '2017-01-25', 't984910', '541607120165') insert into 借閱信息 values ('j97890', '2018-05-14', '2018-06-14', 't940566', '541607120165') --試圖1:顯示所有當前仍未歸還的圖書條碼、借閱者姓名、編號、借閱時間和應還時間 go create view view_1(圖書條碼, 借閱者姓名, 編號, 借閱時間, 應還時間) as select 圖書條碼號, 姓名, 證件號, 借閱時間, 歸還時間 from 借閱信息, 讀者信息 where 借閱信息.借閱人證件號 = 讀者信息.證件號 and 歸還時間 > getdate() --試圖2:顯示某圖書條碼和歷史總借閱量 go create view view_2(圖書條碼, 歷史總借閱量) as select 條碼號, 歷史借閱量 from 單本圖書信息, 圖書信息 where 單本圖書信息.索書號 = 圖書信息.索書號 and 書名 = '幻夜' --視圖3:顯示與某主題詞相關的所有圖書條碼和歷史總借閱量 go create view view_3(類別, 圖書條碼, 歷史總借閱量) as select 類別, 條碼號, 歷史借閱量 from 單本圖書信息, 圖書信息, 主題詞信息 where 主題詞信息.索書號 = 圖書信息.索書號 and 圖書信息.索書號 = 單本圖書信息.索書號 and 類別 = '考研' --試圖4:顯示某讀者的編號(如20181001)和其當前所有未歸還圖書的條碼、圖書名稱和應還日期 go create view view_4(讀者編號, 條碼, 圖書名稱, 應還日期) as select 借閱人證件號, 圖書條碼號, 書名, 歸還時間 from 單本圖書信息, 圖書信息, 借閱信息 where 借閱信息.圖書條碼號 = 單本圖書信息.條碼號 and 單本圖書信息.索書號 = 圖書信息.索書號 and 歸還時間 > getdate() and 借閱人證件號 = '541607120165' --試圖5:顯示某讀者的編號和其對應的歷史借閱信息,包括圖書條碼、圖書名稱、實際借閱日期和實際歸還日期 go create view view_5(讀者編號, 圖書條碼, 圖書名稱, 借閱日期, 歸還日期) as select 借閱人證件號, 圖書條碼號, 書名, 借閱時間, 歸還時間 from 單本圖書信息, 圖書信息, 借閱信息 where 借閱信息.圖書條碼號 = 單本圖書信息.條碼號 and 單本圖書信息.索書號 = 圖書信息.索書號 and 借閱人證件號 = '541607120165' --試圖6:顯示某讀者編號和其發表的書評內容,包括評論的圖書名稱、評論時間和評論內容 go create view view_6(讀者編號, 圖書名稱, 評論時間, 評論內容) as select 評論者id, 書名, 評論時間, 內容 from 借閱信息, 單本圖書信息, 評論信息, 圖書信息 where 借閱信息.圖書條碼號 = 單本圖書信息.條碼號 and 單本圖書信息.索書號 = 評論信息.索書號 and 評論信息.索書號 = 圖書信息.索書號 and 評論者id = '541607120165' --視圖7:顯示某出版社名稱及其出版的所有圖書名稱,並按出版時間排序 go create view view_7(出版社名稱, 圖書名稱, 出版時間) as select top 100 percent 出版社信息.出版社, 書名, 出版時間 from 出版社信息, 圖書信息 where 出版社信息.出版社 = 圖書信息.出版社 order by 出版時間 asc --執行 select * from view_1 select * from view_2 select * from view_3 select * from view_4 select * from view_5 select * from view_6 select * from view_7 order by 出版時間 asc