2017年上半年 資料庫系統工程師 答案詳解
2017年上半年 資料庫系統工程師 答案詳解
2017年上半年 資料庫系統工程師 答案詳解
基礎知識 答案
1、B 2、A 3、D 4、B 5、C
6、A 7、B 8、D 9、B 10、A
11、D 12、D 13、A 14、D 15、16、D B
17、18、A C 19、D 20、A
21、D 22、B 23、C 24、B 25、D
26、C 27、D 28、C 29、B 30、D
31、C 32、D 33、C 34、35、A D
36、37、D C 38、D 39、C 40、41、A D
42、43、44、C D C 45、46、A B
47、C 48、B 49、B 50、D
51、B 52、C 53、D 54、C 55、D
56、B 57、58、A B 59、60、C C
61、B 62、A 63、D 64、65、A D
66、A 67、C 68、B 69、C 70、D
71、72、73、74、75、A A C D C
應用技術 答案
試題一
【問題1】(5分)
使用說明中的詞語,給出圖1-1中的實體E1-E5的名稱。
E1:供應商
E2:採購部
E3:檢驗員
E4:庫管員
E5:S/R職員
依據題幹中“下達採購訂單。採購部門針對低存量部件及庫存量提交採購請求,向其供應商(通過供應商檔案訪問供應商資料)下達採購訂單,並存儲於採購訂單檔案中。”可以判斷出E1為供應商
依據題幹中“檢查庫存水平。採購部門每天檢查部件庫存量,當特定部件的庫存量降至其訂貨店時,返回低存量部件及庫存量。”,可以判斷出E2為採購部
依據題幹中“通過訪問質量標準來檢查裝運部件的質量,並將己驗證的提單發給檢驗員。如果部件滿足所有質量標準,則將其新增到接受的部件列表用於更新部件庫存。”,可以判斷出E3為檢驗員
依據題幹中“庫管員根據收到的接受的部件列表新增本次採購數量”,可以判斷出E4為庫管理員
依據題幹中“如果收貨部件專案出現在採購訂單和提單上,則己驗證的提單和收貨部件專案將被送去檢驗。否則S/R職員提交的裝運錯誤資訊生成裝運錯誤通知傳送給供應商。”,可以判斷出E5為S/R職員
【問題2】(4分)
使用說明中的詞語,給出圖1-2中的資料儲存D1-D4的名稱。
D1:庫存表
D2:採購訂單表
D3:質量標準表
D4:供應商表
依據題幹中“更新部件庫存。庫管員根據收到的接受的部件列表新增本次採購數量,與原有庫存量累加來更新庫存部件中的庫存量。”,結合零層圖的資料流,可以得出D1為庫存表
依據題幹中“下達採購訂單。採購部門針對低存量部件及庫存量提交採購請求,向其供應商(通過供應商檔案訪問供應商資料)下達採購訂單,並存儲於採購訂單檔案中。”和“更新部件庫存。庫管員根據收到的接受的部件列表新增本次採購數量,與原有庫存量累加來更新庫存部件中的庫存量。標記訂單採購完成”,結合零層圖的資料流,可以得出D2為採購訂單表,D4為採購訂單表
依據題幹中“檢驗部件質量。通過訪問質量標準來檢查裝運部件的質量,並將己驗證的提單發給檢驗員。如果部件滿足所有質量標準,則將其新增到接受的部件列表用於更新部件庫存。”,結合零層圖的資料流,可以得出D3為質量標準表
【問題3】(4分)
根據說明和圖中術語,補充圖1-2中缺失的資料流及其起點和終點。
裝運錯誤通知:P3(驗證裝運部件)-----E1(客戶)
缺陷裝運通知:P4(校驗部件質量)-----E1(客戶)
產品檢驗:P3(驗證裝運部件)------ P4(校驗部件質量)
檢查庫存資訊:P1(檢查庫存水平)-----D1(庫存表)
依據題幹中“(1)中:否則S/R職員提交的裝運錯誤資訊生成裝運錯誤通知傳送給供應商。”,結合零層圖可以發現缺失資料流:裝運錯誤通知:P3(驗證裝運部件)-----E1(客戶)
依據題幹中“(2)中:如果部件未通過檢查,則將檢驗員建立的缺陷裝運資訊生成缺陷裝運通知傳送給供應商。”,結合零層圖可以發現缺失資料流:缺陷裝運通知:P4(校驗部件質量)-----E1(客戶)
依據題幹中“(1)中:如果收貨部件專案出現在採購訂單和提單上,則己驗證的提單和收貨部件專案將被送去檢驗。”,結合零層圖可以發現缺失資料流:產品檢驗:P3(驗證裝運部件)------ P4(校驗部件質量)
依據題幹中“1、檢查庫存水平。採購部門每天檢查部件庫存量,當特定部件的庫存量降至其訂貨店時,返回低存量部件及庫存量。”,結合零層圖可以發現缺失資料流:檢查庫存資訊:P1(檢查庫存水平)-----D1(庫存表)
【問題4】(2分)
用200字以內文字,說明建模圖1-1 和圖1-2時如何保持資料流圖平衡。
父圖中某個加工的輸入輸出資料流必須與其子圖的輸入輸出資料流在數量上和名字上相同。父圖的一個輸入(或輸出)資料流對應於子圖中幾個輸入(或輸出)資料流,而子圖中組成的這些資料流的資料項全體正好是父圖中的這一個資料流。
試題二
【問題1】(4.5分)
補充圖2-1中的“簽約”聯絡所關聯的實體及聯絡型別。
依據題幹中“租客租賃公寓必須和公司簽訂租賃合同。一份租賃合同通常由一個或多個租客(合租)與該公寓樓的經理簽訂,一個租客也可租賃多套公寓。合同內容應包含簽訂日期、開始時間租期、押金和月租金。”,說明簽約應該是經理與租賃之間的,而已份租賃包括一位或多位租客,以及一個或多個公寓,所以可以考慮為:經理實體集與租賃(由租客和公寓組合成一個大的實體集)之間的聯絡
在結合題幹中“每個經理管多個公寓樓,每個公寓樓由一個經理管理,和一個樓有多個公寓”的描述,可以判定聯絡的型別為1:*
【問題2】(4.5分)
補充邏輯結構設計中的( a) (b)(c ) 三處空缺。
(a)業務技能
(b)樓編號
(c)月租金
從題幹中“系統需記錄每個員工的姓名、類別、一個聯絡電話和月工資。員工類別可以經理或維修工,也可兼任。每個經理可以管理多幢公寓樓。每幢公寓樓必須由一個經理管理。系統需記錄每個維修工的業務技能,如:水暖維修、電工、木工等”說明需要記錄的屬性有:姓名、類別、一個聯絡電話、月工資和業務技能。因此(a)處應為:業務技能
題幹中“每幢公寓樓有唯一的樓編號和地址以及每幢公寓樓必須由一個經理管理”同時管理聯絡沒有轉換成一個獨立的關係,也就意味著管理聯絡被合併到了公寓樓的實體對應的關係中,因此,公寓樓實體對應的關係的屬性應該有:樓編號、地址、經理編號;因此(b)處應該為:樓編號
依據題幹中“合同內容應包含簽訂日期、開始時間租期、押金和月租金。”結合關係合同(合同編號,租客編號,樓編號, 公寓號,經理編號,簽訂日期,起始日期,租期,(c),押金),可以得出(c)處應該為:月租金
【問題3】(6分)
租期內,公寓內設施如出現問題,租客可在系統中進行故障登記,填寫故障描述,每項故障由系統自動生成唯一的故障編號,由公司派維修工進行故障維修,系統需記錄每次維修的維修日期和維修內容。請根據此需求,對圖2-1 進行補充,並將所補充的ER圖內容轉換為一個關係模式,請給出該關係模式。
維修(故障編號,維修工,維修日期,維修內容,樓編號,公寓號,租客編號)
題幹中“租期內,公寓內設施如出現問題,租客可在系統中進行故障登記,填寫故障描述,每項故障由系統自動生成唯一的故障編號,由公司派維修工進行故障維修,系統需記錄每次維修的維修日期和維修內容”
說明,維修應該與租賃(由租客和公寓組合成一個大的實體集)之間存在多對多的聯絡,同時需要有自己的屬性:故障編號、維修日期、維修內容。
維修(故障編號,維修工,維修日期,維修內容,樓編號,公寓號,租客編號)
試題三
【問題1】(6 分)
對關係"機構發起者",請回答以下問題:
(1) 列舉出所有候選鍵。
(2) 它是否為3NF ,用1100字以內文字簡要敘述理由。
(3) 將其分解為 BC 正規化,分解後的關係名依次為:機構發起者1,機構發起者 2 ,..., 並用下劃線標示分解後的各關係模式的主鍵。
(1)統一社會信用程式碼
(2)否,存在傳遞依賴 :統一社會信用程式碼→法人代表身份證號,法人代表身份證號→法人代表姓名
(3)機構發起者1(機構名稱,統一社會信用程式碼,電話號碼,人代表身份證號)主鍵:統一社會信用程式碼
機構發起者2(人代表身份證號,法人代表姓名)主鍵:法人代表身份證號
【問題2】(6 分)
對關係“公益搖動 ”,請回答以下問題:
(1)列舉出所有候選鍵。
(2) 它是否為2NF ,用100字以內文字簡要敘述理由。
(3)將其分解為 BC 正規化,分解後的關係名依次為:公益活動1,公益活動 2 ,..., 並用下劃線標示分解後的各關係模式的主鍵。
(1)發起者編號+被捐助者身份證號
(2)否:存在部分函式依賴:發起者編號→(發起者電話號碼)對碼(發起者編號,被捐助者身份證號)存在部分函式依賴
(3)公益活動1(發起者編號,發起者電話號碼)主鍵:發起者編號
公益活動2(發起者編號,被捐助者身份證號,發起時間,結束時間,募捐金額)主鍵:發起者編號+被捐助者身份證號
【問題3】(3分)
基金會根據被捐助人提供的醫療發票或其它資訊,將所籌款項支付給被捐助者。可以存在分期多次支付的情況,為了統計所籌款項支付情況(詳細金額和時間) ,試增加”支付記錄“關係模式,用100字以文字簡要敘述解決方案。
支付記錄(支付編號,發起者編號,被捐助者身份證號,支付金額,支付時間,被捐助人的相關資訊)(被捐助人的相關資訊為醫療發票或其他資訊),支付編號唯一標識每一次支付
試題四
【問題1】(3 分)
請將下面建立銷售單表的 SQL 語句補充完整,要求指定關係的主碼和外碼約束。
CREATE TABLE SALES(
Sno CHAR(8) (a)
VEMno CHAR(5) (b)
Gno CHAR(8) (c)
SDate DATE,
STime TIME);
(a)PRIMARY KEY
(b)REFERENCES VEM(VEMno)
(c)REFERENCES GOODS(Gno)
【問題2】(4分)
建立銷售記錄詳單檢視SALES_Detail ,要求按日期統計每個售貨機上各種商品的銷售數量,屬性有 VEMno、Location 、Gno、Brand 、Price 、amount 和SDate。為方便實現,首先建立一個檢視 SALES_Total ,然後利用SALES_Total 完成檢視 SALES_Detail 的定義。
CREATE VIEW SALES _Total(VEMno,Gno,SDate,amount) AS
SELECT VENno ,Gno ,SDate ,count(*)
FROM SALES
GROUP BY (d);
CREATE VIWE (e) AS
SELECT VEM.VEMno,Location ,GOODS.Gno ,Brand,Price,amount,SDate
FROM VEM,GOODS,SALES_Total
WHERE (f) AND (g)
(d)VEMno,Gno,SDate
(e)SALES_Detail(VEMno,Location,Gno,Brand,Price,Amount,SDate)
(f)VEM.VEMno=SALES_Total. VEMno
(g)GOODS.Gno= SALES_Total. Gno
f和g可以互換
【問題3】 (3分)
每售出一件商品,就自動向銷售單中新增一條銷售記錄。如果一天內某個售貨機上某種商品的銷售記錄達到 10條,則自動向缺貨單中新增一條缺貨記錄。需要用觸發器來實現缺貨單的自動維護。程式中的 GetTime()獲取當前時間。
CREAT(h) OOS_TRG AFTER (i) ON SALES
REFERENCING new row AS nrow
FOR EACH ROW
BEGIN
INSERT INTO OOS
SELECT SALES .VENno, (j) GetTime()
FROMSALES
WHERE SALES.VEMno = nrow.VEMno AND SALES.Gno = nrow.Gno
AND SALES.SDate = nrow.SDate
GROUP BY SALES.VEMno,SALES.Gno,SALES.SDate
HAVING count(*)> 0 AND mod(count(*), 10)=0;
END
(h)TRIGGER
(i)INSERT
(j)SALES.Gno,SALES.SDate
【問題4】 (3分)
查詢當天銷售最多的商品編號、品牌和數量。程式中的 GetDate()獲取當天日期。
SELECT GOODS.Gno ,Brand, (k)
FROM GOODS,SALES
WHERE GOODS.Gno=SALES.GNO AND SDATE =GetDate()
GROUP BY (1)
HAVING(M) (SELECT count(*)
FROM SALELS
WHERE SDATE = GetDate()
GROUP BY Gno);
(k)COUNT(*) AS 數量
(l)GOODS.Gno,Brand
(m)COUNT(*)>=ALL
【問題5】(2分)
查詢一件都沒有售出的所有商品編號和品牌。
SELECT Gno ,Brand
FROM GOODS
WHERE GNO(N)
SELECT DISTINCT GNO
FROM(o);
(n)NOT IN
(o)SALES
試題五
【問題1】(9分)
引入兩個偽指令 a = R(X) 和 W(b,X) 。其中a = R(X) 表示讀取當前紅包記錄的ReceiverID 欄位(記為資料項 X) 到變數a中, W(b,X)表示將搶紅包人的唯一標識b的值寫入到當前紅包記錄的ReceiverID 欄位(資料項 X) 中,變數a為空值時才會執行 W(b,X) 操作。假設有多個人同時搶同一紅包(即同時對同一記錄進行操作),用 ai=Ri (X)和 Wi(bi, X)表示系統依次響應的第i個人的搶紅包操作。假設當前資料項 X 為空值,同時有三個人搶同一紅包,則
(1)如下的排程執行序列:
a1 =R1, a2 = R2(X),W1(b1 ,X),W2(b2,X), a3 = R3(X)
搶到紅包的是第幾人?並說明理由。
(2)引入共享鎖指令 SLocki(X)、獨佔鎖指令XLocki(X)和解鎖指令 ULocki(X) ,其中下標i表示第i個搶紅包人的指令。如下的排程執行序列:
SLock1(X),a1 = R1(X),SLock2(X),a2 = R2(X),XLock1(X)......
是否會產生死鎖?並說明理由。 (3)為了保證系統第一個響應的搶紅包人為最終搶到紅包的人,請使用上述。)中引入的鎖指令,對上述(1)中的排程執行序列進行修改,在滿足2PL協議的前提下,給出一個不產生死鎖的完整的排程執行序列。
(1)第2人,併發操作出現了丟失更新的問題,第2個的更新覆蓋了第1個的更新,原因是破壞了事物的隔離性。
(2)會產生死鎖,由於資料X同時被1和2加鎖了S鎖,再對方沒有釋放的時候,都無法加成功X鎖,導致1和2一直都處於等待的狀態
(3)XLock(X) a=R(X) W(b,X)UNLock(X)
【問題2】(6分)
下面是用 SQL實現的搶紅包程式的一部分,請補全空缺處的程式碼
CREATE PROCEDURE ScrambleRed (IN BatchNo VARCHAR(20) , --紅包批號
(IN RecvrNo VARCHAR(20)) 一接收紅包者
BEGIN
--是否已搶過此批紅包
if exists( SELECT * FROM Red
WHERE BatchID = BatchNo AND ReceiverID = RecvrNo) thm
return -1;
end if;
---讀取此批派發紅包中未領取的紅包記錄ID
DECLARE NonRecvedNo VARCHAR(30);
DECLARE NonRecvedNo CURSOR FOR
SELECT ID
FROM Red
WHERE BatchID = BatchNo AND ReceiverID IS NULL;
-開啟遊標
OPEN NonRecvedRed;
FETCH NonRecvedRed INTO NonRecvedNo;
while not error
一搶紅包事務
BEGIN TRANSACTION;
//寫入紅包記錄
UPDATE RED STE RECDIVER ID =RecvrNo
WHERE ID = nonRECVED AND(a)
//執行狀態判定
If<修改的記錄數>= 1 THEN
COMMIT;
(b);
Return 1;
Else
ROLLBACK;
End if;
(c);
End while
--關閉遊標
CLOSE NonRecved RD
Return 0;
END
(a)BatchID=BatchNo
(b)CLOSE NonRecvedRed
(c)END TRANSACTION
完結