數據庫系統概論復習重點
第一章 緒論
1. 實體:客觀存在並且相互區別的事物,例如:一個學生,學生的一次選課
2. 屬性:實體所具有的某一特性,例如學生的成績
3. 碼:唯一標識實體的屬性集,例如學號是學生實體的碼
4. 實體型:用實體名及其屬性集合來抽象和刻畫同類實體,例如學生(學號,姓名,性別.......等)
5. 概念模型的表示方法:E-R圖
6. 信息世界抽象出概念模型,機器世界根據概念模型得到數據模型
7. 數據模型:由數據結構,數據操作,數據完整性約束條件組成
8. 關系模型的數據結構:
關系:即我們說的一張表(不允許表內部還有表)
元組:表的一行
屬性:表的一列
碼:唯一確定一個元組,如學號
分量:元組中的一個屬性值
關系模式:例如:學生(學號,姓名,性別,班級)
第二章 關系數據庫
一.傳統的集合運算(二目運算)(以關系R和關系S為例,二者都有n個屬性,並且屬性取自用一個域,下同)
1.並:結果由屬於R或者屬於S的元組組成,但是要去除重復的元組
2.差:結果由屬於R但是不屬於S的所有元組組成
3.交:由既屬於R又屬於S的元組組成
4.笛卡兒積:域上的集合運算
總結:傳統的集合運算是二目運算,包括並,差,交,笛卡兒積四種
二.專門的關系運算
1. 選擇:從關系中選取使特定邏輯表達式為真的元組
2. 投影:關系R上的投影是從R中選若干屬性列組成新的關系
3. 連接:從需要連接的關系的笛卡兒積中選滿足條件的元組,常用的有等值連接和自然連接
4. 除:R除以S等於T
要求:T包含所有在R但是不在S中的屬性和值,且T和S的笛卡兒積必須在R中
第三章 關系數據庫標准語言SQL
一.查詢:
1..單表查詢:查詢課程平均成績大於所有同學課程平均成績的同學的學號
select sno
from SC
group by
having avg (grade)>= all (select avg(grade)
from SC
group by sno)
--在使用group by 分組的時候,where 是針對符合條件的元組的,而having是針對符合條件的分組的,該例也使用了嵌套查詢
2. 連接查詢:查詢選修二號課程的同學的學號和姓名
select Student.sno,sname
from Student,SC
where Student.sno=SC.sno and con='2'
--找到課程號為2的元組,且這些元組的學號等於Student表里面的學號,然后投影這些元組的sno,sname屬性
3. 嵌套查詢:查詢選修二號課程的同學的學號和姓名
select sno,sname
from Student
where son in (select sno
from SC
where con='2')
--先在SC表里面找到課程號為2的同學的學號,然后將找到的學號傳遞給Student表,然后根據傳遞的學號在Student表中尋找該學號的學生的學號和姓名
4. exists嵌套查詢:查詢選修二號課程的同學的學號和姓名
select sno,sname
from Student
where exists (select *
from SC
where sno=Student.sno and con='2')
--先在內部循環查詢課程號為2的同學是不是存在,若存在則在exists處返回True,就返回該學生元組的所有信息,然后打印該元組的sno和sname屬性,若不存在則在exists處返回false,后面就不會返回元組信息
5. 雙重exists嵌套查詢:查詢選修了所有課程的同學
select sname
from Student
where not exists (select *
from Course
where not exists (select *
from SC
where SC.sno=Student.sno and SC.cno=Course.cno))
--對於這個雙重exists嵌套循環個人的理解是這樣的:先在最內層循環尋找Course表中有的課程看SC表里面有沒有同學全部選了,not exists的意思是里面沒有找到就寫進去,因為有兩個exists,所以雙重否定表肯定,意思就是寫進去
三.視圖:從一個或幾個基本表導出的表,是虛表,視圖中的數據仍然存放在基本表中,透過視圖可以查看自己感興趣的數據
視圖是一個虛表,也可以通過這個表進行查詢,插入,刪除和修改
1.行列子集視圖(一個表中截取某些行和列)
create view bt_s(sno,sname)
as
select sno,sname
from Student
where age>=18;
2.分組視圖(含有group by語句的視圖)
create view s_g(sno,gavg)--括號內部是視圖列名
as
select Student.sno,avg(grade)
from Student,SC
group by Student.sno;
第四章 數據庫安全性
一.用戶的創建和權限操作
1.用戶的創建
create user u1 for login a
2.用戶權限的操作
具體參考附帶文件
(本章重點在用戶的創建及對權限操作的部分)
第五章 數據庫的完整性
1.斷言:為數據庫的完整性約束服務,任何使斷言不為真值的操作都會被拒絕執行
例:數據庫這門課程最多被60個同學選修
create assertion ASSE_SC_DB_NUM
check (60>=(select count(*)
from Course,SC
where SC.cno=Course.cno and Course.cname='數據庫');
2.觸發器:用戶定義在表上的一類由事件驅動的特殊過程(具體意思請理解觸發器三個字)
例:在Student表中如果插入的學生的age小於20,那么把該學生的age改為20
create trigger tri_age on Student
after insert
as
declare @age int ,@no char (12)
select @age=age,@no=sno from Student
begin
if
@age<20 update Student set age=20 where sno=@no
end;
第六章 關系數據理論
1.X->Y:X確定Y,Y依賴於X
2.函數依賴:平凡函數依賴,非平凡函數依賴,完全函數依賴,部分函數依賴
例:在關系(sno,cno,Grade)中
非平凡函數依賴:(sno,con)->Grade
平凡函數依賴:(sno,cno)->sno,(sno,cno)->cno////沒有包含Geade
例:X->Y,X’為X的真子集
完全函數依賴:X’不確定Y
部分函數依賴:X’確定Y
3主,非屬性的區別:
主屬性:包含任意一個碼
非主屬性:不包含任意一個碼
4.范式
范式之間的關系是個同心圓,最外面是第一范式,依次往內部是二,三,BC,四范式
第一范式:屬性不可再拆分
第二范式:非主屬性對碼是完全依賴
例:關系S-L-C(sno,sdept,sloc,cno,Grade),函數依賴有:(sno,cno)->Grade,sno->sdept,(sno,cno,)->sdept,snp->sloc,(sno,cno)->sloc,sdept->sloc,其中碼是(sno,cno)
分析:sdept,sloc是非主屬性,碼中的cno確定不了這兩個非主屬性,即非主屬性對碼是部分函數依賴,所以S-L-C不是第二范式
現在我們來分析一下S-L-C,它包含有兩類的非主屬性,Grade與(sloc,sdept),Grade對碼是完全依賴,因為sno和cno確定Geade,而(sloc,sdept)對碼是部分函數依賴,所以我們分解一下:
SC(sno,cno,Grade)與SL(sno,sdept,sloc)
現在SC與SL都是屬於第二范式
第三范式:不存在非主屬性對碼有傳遞函數依賴
例子:接着上的例子來
SL中,sno可以確定sdept,而sdept可以確定sloc,存在傳遞函數依賴,所以SL不是第三范式
SC中 要求sno和cno一起才能確定Grade,所以不存在傳遞函數依賴,所以SC是第三范式
BC范式:要求每一個決定因素包含碼
例:在關系Y(C,B,D)中,C->B,C->D,碼是C
分析:決定因素是:C->B,C->D,都包含了C,所以是每一個決定因素都包含了碼,所以Y是BC范式
第四范式:不允許非平凡且非函數依賴的多值依賴
解析一下:就是允許非平凡且函數依賴的多值依賴(個人理解)
例子:WSC(W,S,C),W表示倉庫,S表示保管員,C表示貨物,W->->S,S->->C
分析;W->->S和S->->C都是非平凡的多值依賴,且碼是(W,S,C),全碼,不存在函數依賴,所以存在飛平凡且非函數依賴的多值依賴,所以WSC不是第四范式,現在我們來把WSC分解一下:WS(W,S)和WC(W,C),現在(W,S)中W->->S是平凡多值依賴,不存在函數依賴,所以不存在非平凡且非函數依賴的多值依賴,所以是第四范式,WC同理可得是第四范式
數據依賴的公理系統:
1.公理系統:
自反律:若Y屬於X,X屬於U,則X->Y
增廣律:若X->Y,那么XZ->YZ
傳遞律:若X->Y,Y->Z,那么X->Z
2.推理規則:
合並規則:若X->Y,X->Z,那么X->YZ
偽傳遞規則:X->Y,WY->Z,那么XW->Z
分解規則:若X->Y,Z屬於Y,那么X->Z
模式分解:
1.是否保持了函數依賴:通過分析分解之后的函數依賴,看能不能通過公理系統和推理規則推導出原來的函數依賴,如果能,則證明保持了函數依賴,否則就是沒有保持
2.是否保持了無損連接的特性:
例:已知R(U,F),U={A,B,C,D,E},F={AB->C,C->D,D->E},R的一個分解為R1(A,B,C),R2(C,D),R3(D,E),證明這個分解的連接具有無損連接的特性
解答:
我們先來構造初始表
A | B | C | D | E |
a1 | a2 | a3 | b14 | b15 |
b21 | b22 | a3 | a4 | b25 |
b31 | b32 | b33 | a4 | a5 |
構造規律:行數為函數依賴的個數,所以3行,每行代表一個函數依賴,我們以AB->C為例,這個函數依賴中有A,B,C所以第一行的這三列填a,其余填b,后面兩行類似
現在開始修改表:還是以AB->C為例,這個函數依賴的右邊是AB,所以我們尋找A,B列,如果有相同的分量則C列全部修改為a
修改后的表:
A | B | C | D | E |
a1 | a2 | a3 | a4 | a5 |
b21 | b22 | a3 | a4 | a5 |
b31 | b32 | b33 | a4 | a5 |
如果修改之后某行全為a,那么該分解具有無損連接的特性
所以該分解具有無損連接的特性,證明完畢
第十一章 並發控制
1.封鎖
排他鎖(X鎖):若事物T對對象A加上X鎖,則只允許T讀取和修改A,在T釋放A上的X鎖之前,其他事物不能對A加任何鎖,目的是保證在事物T釋放A上的X鎖之前其他事物不能讀取和修改A
共享鎖(S鎖):若事物T對對象A加S鎖,則只允許T讀取A而不能修改A,在T釋放A上的S鎖之前,其他事物只能對A加S鎖,目的是保證在事物T釋放對象A上的S鎖之前其他事物只能讀取而不能修改A
2.活鎖,死鎖
活鎖:某一個事物一直處於等待狀態,避免活鎖要采取先來先服務的策略
死鎖:某兩個事物互相等待,永遠進行下去,導致這倆個事物永遠不能結束
3.可串行化調度:某個調度與串行化調度的結果一樣,那么這個調度就叫做可串行化調度(正確調度)
4.怎么判斷一個調度是不是可串行化調度?
沖突可串行化是可串行話調度的充分條件
沖突:不同事物對同一個數據的讀寫和寫寫操作
------------------------------------------------------------------------------------------------------------------------------
下面是關於SQL語句的相關代碼(參考文件):
實驗一 表的建立樣例 (1) create table Student( S# char(12) primary key, Sname char(8) unique, Age int, Sex char(2), ); //創建了一個Student表,有3個列,一個主碼約束,注意書寫格式和字符 (2) create table course( c# char primary key, Cname char(20)NOT NULL, Teacher char(8), ); //建立了一個course表,3個列,一個列為非空 (3) create table SC( S# char(12), C# char(4), Grage int, primary key(S#,C#),若在一個表里面要建立多個主碼約束,就這么用 ); //建立了一個SC表,3個列, 表的修改樣例 (1)增加表的屬性 alter table Student add s_sdept char //在Student表里面增加s_sdept屬性 char后面沒有數字默認一個字符 (2)在SC表里面建立兩個外碼約束,S#是外碼,被參照表是Student(S#),c#是外碼,被參照表是course(c#): 分析; SC表里面S#和C#都是主碼,現在要建立外碼約束,是外碼約束必定有參照表 代碼: alter table SC add constraint fkS# foreign key (S#) references Student(S#)//名稱為fkS#的外碼約束鍵 alter table SC add constraint fkC# foreign key (C#) references course(C#)//名稱為fkC#的外碼約束鍵 建立索引 在student表上建立屬性S#的唯一索引:create unique index Stus# on Student(S#)//建立名稱為 'Stus#'的唯一索引 在course表上建立C#的唯一索引:create unique index c1ouc# on Course(C#)/建立名稱為‘couc#’的唯一索引 實驗二 create table Student( S# char(12) primary key, Sname char(8) unique, Age int, Sex char(2), ); create table Course( C# char(12) primary key, Cname char(20) NOT NULL, Teacher char(8), ); create table SC( S# char(12), C# char(12), Grage int , primary key(S#,C#), ); alter table Student add S_sdept char(12) alter table SC add constraint fkS# foreign key (S#) references Student(S#) alter table SC add constraint fkC# foreign key (C#) references Course (C#) create unique index StuS# on Student(S#) create unique index CouC# on Course (C#) 1.在Student表中增加兩條學號相同的記錄,驗證實體完整性是否起作用 insert into Student values ('201510101001','張天',20,'男','c'); 可以加入 insert into Student values ('201510101001','高磊',20,'男','c'); 不能插入,因為學號相同,S#是主碼約束 insert into Student values ('201510101000','張天',20,'男','c'); 同樣不能插入,Sname是唯一約束 答案:實體完整性起作用 2.在SC表中插入一條記錄,驗證參照完整性是否起作用 insert into SC values ('201510101002','1001','78') 不能執行,因為在其余的兩個表里面,沒有要插入的數據,不符合參照完整性 insert into Course values ('1001','數據結構','塗珊') insert into SC values ('201510101001','1001','78') 現在可以執行了,因為在Course和Student表里面有要插入的數據,符合參照完整性 答:參照完整性起作用 3.在Student表中增加”學生入學”列,其數據類型是日期型 alter table Student add S_entrance datetime 4.將Sex的數據類型由字符型修改成整型 alter table Student drop column sex alter table Student add Sex char(2) alter table Student alter column Sex int 答:因為之前Sex列里面已經放進去了東西,如果直接把char類型轉換成int類型的話會報錯誤,所以先把Sex列刪除,然后再建立Sex列,然后再轉換 5.增加Course表中的Cname的UNIQUE約束 alter table Course add constraint UQ_Cname unique (Cname) 6.定義SC表中的Grade字段采用的是百分制 alter table SC drop column Grage alter table SC add Grade int alter table SC add constraint ck_Grade check(Grade<=100 and Grade>=0) 因為開始輸入的時候把Grade寫成了Grage,所以先刪除了,再創建了一個新的列,Grade里面答數據也被刪除了,需要的話要重新輸入,再執行百分制語句 check約束,對值進行范圍限制 7.刪除Course表中的UNIQUE約束、SC表中的CHECK約束 alter table Course drop constraint UQ_Cname alter table SC drop constraint ck_Grade 8.試着刪除Course表中的PRIMARY KEY約束,會出現什么情況 alter table Course drop constraint primary key (C#) 不知道怎么刪除,雖然知道C#有pk約束,但是不知道約束名.. select * from Student select * from Course select *from SC 附加: delete from SC where S#='01090122' 刪除學號為01090122的這一行,實用 .......................................................................................... 1.檢索LIU老師所授的課程號和課程名 select C#,Cname from Course where Teacher='LIU' 2.檢索年齡大於歲的男學生的學號和姓名 select S#,Sname from Student where Age>23 and Sex='男' 3.檢索學號為S3學生所學課程的課程名與任課教師名 select Cname,Teacher from Course,SC where Course.C#=SC.C# and SC.S#='S3' 4.檢索至少選修LIU(李東)老師所授課程中一門課程的女學生姓名 select Sname from Student where exists ( select distinct S# from SC where C# in ( select distinct C# from SC where C# in ( select C# from Course where Teacher='李東') intersect select distinct C# from SC group by C# having count(S#)>=1 ) ) and Sex='女' 5.檢索WANG同學不學的課程的課程號 select C# from SC where S# not in (select S# from Student where student.Sname='WANG') 6.檢索至少選修兩門課程的學生學號 select S# from SC group by S# having count(C#)>=2 7.檢索全部學生都選修的課程的課程號與課程名 select C#,Cname from Course where C# in (select C# from SC group by SC.C# having count(SC.S#)>=(select count(*) from Student)) .......................................................................................... 實驗三 --1.統計有學生選修的課程門數 select count(distinct C#) from SC --2.求選修C4課程的女學生的平均年齡 select avg(Age) as stu_avg from SC,Student where SC.C#='2' and Student.S#=SC.S# and Student.Sex='女' select avg(Age) as Stu_avg from Student where S# in (select S# from SC where C#='2') and Sex='女' 3--.求LIU(李東)老師所授課程的女學生的平均年齡 select avg(Age) as Stu_avg from Student where S# in ( select S# from SC where C# in ( select C# from Course where Teacher='李東'))and Sex='女' select avg(Age) as Stu_avg from Student where S# in ( select S# from SC where C# in ( select C# from Course where Teacher='LIU'))and Sex='女' --4.統計每門課程的學生選修人數(超過10人的課程才統計)。要求顯示課程號和人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列 select distinct Course.C#,count(*) from SC,Course where SC.C#=Course.C# group by Course.C# order by 2 desc ,C# asc --5.檢索學號比WANG(李勇)同學大,而年齡比他小的學生姓名 select B.Sname from Student A,Student B where A.Sname='李勇' and A.S#<B.S# and A.Age>B.Age select B.Sname from Student A,Student B where A.Sname='WANG' and A.S#<B.S# and A.Age>B.Age --6.在表SC中檢索成績為空值(80)的學生學號和課程號 select S#,C# from SC where Grage=null select S#,C# from SC where Grage=80 --7.檢索姓名以L(李勇)打頭的所有學生的姓名和年齡 select Sname,Age from Student where Sname like 'L%' select Sname,Age from Student where Sname like '李%' --8.求年齡大於女同學平均年齡的男學生姓名和年齡 select Sname,Age from Student where Sex='男' and Age>( select avg(Age) from Student where Sex='女') --二.視圖 create view S_Grade(S#,C_num,AVG_Grage) as select S#,count(C#),avg(Grage) from SC group by S# 實驗四 --1. select * from S_Grade --允許,打印這個視圖 --對應操作: select distinct S#,count(C#) as C_num,avg(Grage) as AVGGrage from SC group by S# --2. select S#,C_num from S_Grade where AVG_Grage>80 --允許,打印視圖中AVG_Grage>80的行的S#和C_num --對應操作: select S#,count(C#) as C_num from SC group by S# having avg(Grage)>80 --3. select S#,AVG_Grage from S_Grade where C_num>(select C_num from S_Grade where S#='201215122') --允許,打印比學號為201215122的同學的課程數目多的同學的學號和平均成績 --對應操作: select S#,avg(Grage) as AVG_Grage from SC group by S# having count(C#)>( select count(C#) from SC group by S# having S#='201215122') --4 update S_Grade set C_num=C_num+2 where S#='201215122' --不允許,因為SC表中的屬性有的要參照Student表和Course表 --5 delete from S_Grade where C_num>2 --不允許,因為視圖'S_Grade'來自於SC表,而SC表的增刪改查都要參照其余兩個表 實驗五 --1.建立用戶U1、U2、U3、U4、U5、U6、U7,用戶類型全部選擇為CONNECT。 --創建用戶,但是前提是要先創建a,b,c的登錄名 create user u1 for login a create user u2 for login b create user u3 for login c --2.在SYSTEM(即DBA)中與7個CONNECT用戶之間進行授權。完成教材4.2.4小節【例4.1】~【例4.7】的授權語句。 --在完成授權之后,驗證用戶是否擁有相應的權限。例如: -- 用戶U7向SC表中插入一條數據記錄:(201215130,6,88);顯示插入1條記錄,即用戶U7擁有對SC表的插入數據權限。 --答: --4.1 把對Student表查詢的權限給u1 grant select on Student to u1 --4.2 把對Student表和Course表的所有權限給u2,u3 grant ALL PRIVILEGES on Student to u2,u3 grant ALL PRIVILEGES on Course to u2,u3 --4.3把對SC表的查詢權限給所有用戶 grant select on SC to public --4.4 把對Student表的學號更新和查詢權限給u1 grant update(S#),select on Student to u1 --4.5 把對SC表的插入權限給u2,並且u2可以傳播此權限 grant insert on SC to u2 with grant option --4.6把對SC表的插入權限給u3,並且u3可以傳播此權限 grant insert on SC to u3 with grant option --4.7把對SC表的插入權限給u1 grant insert on SC to u1 --總結: --u1的權限:對Student表的查詢和學號更新,對SC表的查詢和插入 --u2的權限:Student表的所有權限,Course表的所有權限,SC表的查詢權限和插入 --u3的權限:Student表的所有權限,Course表的所有權限,SC表的查詢權限和插入 -- 驗證: u3 insert into SC (S#,C#,Grage) values ('201215130','6',88)--無法插入,因為SC表的學號和課程號是參照Student表和Course表的 --正確方法: u2 insert into Student values ('201215130','d佬',40,'男') u2 insert into SC (S#,C#,Grage) values ('201215130','6',88) --3.完成教材4.2.4小節【例4.8】~【例4.10】的權限回收語句。在權限被回收之后,查看該用戶是否真正喪失了對數據的相應權限。例如: -- 用戶U3查詢表SC。用戶U3重新登錄數據庫。執行命令:select * from sc;執行失敗。表明用戶U3不再擁有此權限。 revoke update(S#) on Student from u1--收回u1對Student表的學號更新權限 revoke select on SC from public--從所有用戶收回對SC表的查詢權限 revoke insert on SC from u2 cascade--把u2對SC表的插入權限收回,並且把從u2這里獲得該權限的用戶的權限也刪除,級聯刪除 --總結: --u1的權限:對Student表的查詢,對SC表插入 --u2的權限:Student表的所有權限,Course表的所有權限 --u3的權限:Student表的所有權限,Course表的所有權限 u3 select * from SC 實驗6 --1.往關系C中插一個課程元組(‘C8’,‘VC++’,‘BAO’) insert into Course values ('C8','VC++','BAO') --2.在SC中刪除尚無成績的選課元組 delete from SC where Grage=null --3.把選修LIU(李東)老師課程的女同學選課元組全部刪去 delete from SC where S# in ( select S# from Student where Sex='女' and S# in( select S# from SC where C# in( select C# from Course where Teacher='李東'))) --查看是否刪除成功 select * from SC --4.把MATHS(高數)課不及格(小於88)的成績全改為88分 update SC set Grage=88 where Grage<88 and S# in ( select S# from SC where C# in ( select C# from Course where Cname='高數')) --5.把低於所有課程總平均成績的女同學成績提高5% update SC set Grage = Grage * 1.05 where ( (S# in( select S# from Student where Sex='女')) and SC.Grage<( select AVG(Grage) from SC) ) --思路很重要 --6.在表SC中修改C4課程的成績,若成績小於等於70分時提高5%,若成績大於70分時提高4%(用兩個UPDATE語句實現) update SC set Grage = Grage *1.05 where Grage<=70 update SC set Grage = Grage *1.04 where Grage>70 --7.在表SC中,當某個成績低於全部課程的平均成績時,提高5%。 update SC set Grage = Grage *1.05 where SC.Grage<(select AVG(Grage) from SC) --總結:1.牢記更新的語法 -- update 表名 --set 修改表達式 --where 條件 --2.記得這個操作select AVG(Grage) --from SC --求所有課程的總平均成績 --二、根據學生課程數據庫編寫一個存儲過程,完成下述功能:統計任意一門課程的成績分布情況,即按照各分數段統計人數(分數段自定); --儲存過程塊 create procedure sss @Cname varchar(20) as declare @cours varchar(20); begin select count(*) from SC where Grage between 0 and 59 and C# in ( select C# from Course where Cname=@Cname); select count(*) from SC where Grage between 60 and 80 and C# in ( select C# from Course where Cname=@Cname); select count(*) from SC where Grage between 81 and 100 and C# in ( select C# from Course where Cname=@Cname); end; --調用儲存過程塊 execute sss '高數' 實驗七 第6章 關系數據理論 一、設關系模式R(ABCD),F是R上成立的FD集,F={A→B,C→B},則相對於F,試寫出關系模式R的關鍵碼。並說明理由。 關系模式R的關鍵碼為ACD,因為只有ACD才能推導出R(ABCD) 二、設關系模式R(ABCD),F是R上成立的FD集,F={A→B,B→C}。 1、試寫出屬性集BD的閉包(BD)+。 BCD,因為BD的子集B可以推導出C 2、試寫出所有左部是B的函數依賴(即形為“B→?”)。 B→空集,B→C,B→B,B→BC 三、設關系模式R(ABC),F是R上成立的FD集,F={ B→C,C→A},那么分解ρ={AB,AC}相對於F,是否為無損分解和保持FD? 都沒有,只能推導出A→B,A→C,不能推導出B→C 四、設有關系模式R(運動員編號、比賽項目、成績、比賽類別、比賽主管),如果規定:每個運動員每參加一個一個比賽項目,只有一個成績;每個比賽項目只屬於一個比賽類別;每個比賽類別只有一個比賽主管。試回答下列問題: 1、根據上述規定,寫出模式R的基本FD和關鍵碼; 運動員編號→比賽項目,(運動員編號,比賽項目)→比賽成績,比賽項目→比賽類別,比賽類別→比賽主管 關鍵碼:運動員編號,比賽項目 2、說明R不是2NF的理由,並把R分解成2NF模式集; 非主屬性對碼不是完全依賴,因為比賽項目→(比賽類別,比賽主管),非主屬性對比賽項目,部分函數依賴 分解: R1:(運動員編號,比賽項目)→比賽成績 R2:比賽項目→(比賽類別,比賽主管) 3、進而分解成3NF模式集。 第三范式要求不存在傳遞函數依賴,所以: R1:(運動員編號,比賽項目)→比賽成績 R2:比賽項目→比賽類別 R3:比賽類別→比賽主管 五、設關系模式R(ABCD),在R上有四個相應的FD集及分解: 1、F={B→C,D→A},ρ={BC,AD} 2、F={AB→C,C→A,C→D},ρ={ACD,BC}試對上述兩種種情況分別回答些列問題: ①確定R的關鍵碼 1.BD 2.AB和BC ②是否無損分解? 1.沒有保持 畫圖可得: A B C D b11 a2 a3 b14 a1 b22 b23 a4 2.保持了 A B C D a1 b12 a3 a4 b21 a2 a3 b24 A B C D a1 b12 a3 a4 a1 a2 a3 a4 存在一行有a1,a2,a3,a4 ③是否保持FD集? 1.保持了 2.沒有保持,丟失了AB→C ④確定ρ中每個模式的范式級別。 1.BCNF 2.BCNF 因為每一個決定因素都包含了碼
以上是個人對數據庫系統概論的部分知識的了解,若有不正確的地方,歡迎兄弟們拍磚指正!!!
參考書籍:數據庫系統概論 王珊 薩師煊著 第5版