Bước 2.1: Để làm cho nhanh, ta có thể loại bớt những pth không cần thiết phải xét: đó là những pth mà vế trái hoặc vế phải chứa một thuộc tính nào đó, mà chỉ nằm trong một quan hệ.. Nếu
Trang 1ADE / AG MNZ
Q2
G DEX
Q3
DE YHN
Q4
MN VH
Q5
HN W
Giải đề thi CSDLNC - K16, KHTN.
Dưới đây là lời giải mang tính chất tham khảo Trình bày khá dài dòng, để thể hiện cách làm (Không phải là cách trình bày trong bài thi) Có gì sai, mong các bạn góp
ý nha
Câu 1:
1.1 Xác định tất cả các pth có nguy cơ dẫn đến mâu thuẫn và phân loại chúng
Nháp: Nên vẽ lược đồ ra cho dễ nhìn
Bước 1: Xác định các Fi (là các pth được bao trong một quan hệ Qi).
Xác định bằng cách nào?
o Đối với bài này, đề cho các Fi có được bằng cách chiếu F0+ lên các Qi+
o Nếu đề bài k nói gì cả, ta phải tìm Fi bằng thuật toán tìm pth được bao,
mà cô đã hướng dẫn (giống như bài tập chương 1)
- Dùng thuật toán tìm pth được bao (cô đã hướng dẫn, giống bài tập chương 1) F1 =
{
ADE MNGZ;
G DE;
DE N;
}
- Tương tự, ta có:
F2 = {G DEX}
F3 = {DE YHN}
F4 = {MN HV}
F5 = {HN W}
Trang 2Bước 2: Với mỗi fi có dạng X A, ta lần lượt xét xem nó có phải là pth có
nguy cơ không?
Bước 2.1: Để làm cho nhanh, ta có thể loại bớt những pth không cần thiết phải xét: đó là những pth mà vế trái hoặc vế phải chứa một thuộc tính nào
đó, mà chỉ nằm trong một quan hệ (bước này làm ngoài giấy nháp thôi)
Lưu ý: Trước hết, ta phải tách thành các pth có dạng X A (nghĩa là VP chỉ
có 1 thuộc tính)
Ví dụ: Pth ADE MNGZ (tách thành 4 pth):
{ADE M; ADE N; ADE G; ADE Z}
Như vậy, ta sẽ có các pth mà chắc chắn k có nguy cơ (k cần phải xét):
- ADE M (có tt A chỉ thuộc Q1 khỏi xét)
- ADE N
- ADE G
- ADE Z
- G X (có tt X chỉ thuộc Q2)
- DE Y (có tt Y chỉ thuộc Q3)
- MN V (có tt V chỉ thuộc Q4)
- HN W (có tt W chỉ thuộc Q5)
Bước 2.2: Với mỗi pth còn lại, xét xem chúng có nhiều hơn 1 CKH tối tiểu
phủ hết các thuộc tính của pth không? Nếu có nhiều hơn 1, thì là pth có nguy
cơ
Phân loại: Có 2 loại: tuyến tính và phi tuyến.
Nếu 1 pth có nhiều hơn 1CKH, và tất cả các CKH đó đều chỉ có 1 quan hệ, thì là tuyến tính, ngược lại là phi tuyến
- Xét G D: có 2 CKH tối tiểu, chứa {GD}, đó là:
o Q1
o Q2
có nguy cơ (tuyến tính, vì 2 CKH này đều có dạng là 1 quan hệ)
- Xét G E: có 2 CKH tối tiểu, chứa {GE}, đó là:
o Q1
o Q2
Trang 3 có nguy cơ (tuyến tính)
- Xét DE N: có 2 CKH tối tiểu, chứa {DEN}, đó là:
o Q1
o Q3
có nguy cơ (tuyến tính)
- Xét DE H: có 2 CKH tối tiểu, chứa {DEH}, đó là:
o Q3
o Q1 |X| Q4
có nguy cơ (phi tuyến, vì có CKH Q1 |X| Q4 chứa 2 quan hệ)
- Xét MN H: có 2 CKH tối tiểu, chứa {MNH}, đó là:
o Q4
o Q1 |X| Q3
Có nguy cơ (phi tuyến)
Cải tiến lược đồ để giảm số lượng pth có nguy cơ:
Đối với những lược đồ quan hệ chưa đạt chuẩn cao, có thể dùng phương pháp phân
rã, nhằm vừa nâng cao chất lượng lược đồ về mặt dạng chuẩn, vừa giảm pth có nguy cơ
- Chẳng hạn, ta thấy G D, G E là pth có nguy cơ, liên quan đến:
o Q1(ADE / AG MNZ)
với F1 = {ADE MNGZ; G DE; DE N;}
o Q2 (G DEX) với F2 = {G DEX}
- Nhận thấy Q1 mới đạt DC 3 (chưa đạt DC B-C, vì có pth G DE, DE N
là pth mà có vế trái không phải là siêu khóa)
- Vậy ta thử phân ra Q1 xem thế nào:
Trang 4ADE / AG MNZ
Q11
AG MNZ
Q12
G DE
G D
G E
2 pth không còn được bao trong một quan hệ nữa:
ADE MNGZ và
DE N
F12 = { G DE} F11 = { AG MNZ}
- Ta nhận thấy, với sự phân rã như trên, Q11 và Q12 đều đạt DC BC Và 2 pth G
D, G E không còn là pth có nguy cơ nữa
- Q12 có thể nhập vào Q2(G DEX) luôn
- Tuy nhiên, sự phân rã trên không bảo toàn pth, (UFi)+ ≠ (F0)+
Cụ thể, 2 pth ADE MNGZ và DE N không còn được bao trong Q11
Do đó, muốn kiểm tra 2 pth này, phải thực hiện kết giữa Q11 và Q12
Nói cách khác, cần một cơ chế ép thỏa ngoại
Vậy nên, cần cân nhắc giữa việc giảm pth có nguy cơ, và tính hiệu quả, tính thuận tiện trong việc kiểm tra pth (Rõ ràng cơ chế ép thỏa ngoại sẽ tốn chi phí hơn, vì phải thực hiện phép kết)
- Các bạn lý luận tương tự với các pth còn lại nhé
1.2 Nếu tập F0 không có pth G XDE và lược đồ quan hệ phổ quát không có thuộc tính X
- Ban đầu, mình nghĩ khi đó, lược đồ C1 sẽ bỏ hẳn Q2 (GDEX) luôn
Nhưng ngẫm lại, thấy chưa chắc bỏ được Q2, mà có thể Q2 vẫn được giữ lại, và
cả 3 thuộc tính GDE cùng nhau tạo thành khóa cho Q2.
Tại sao vậy, tại sao k bỏ hẳn luôn Q2 đi cho tiện?
Lý do: thử tưởng tượng rằng, người dùng muốn nhập 1 bộ thông tin gồm GDE
vào CSDL, nếu k có Q2, họ phải nhập vào đâu? Nhập vào Q1 thì k được, vì muốn nhập Q1, thì phải biết thông tin của thuộc tính A (vì ADE, AG là khóa)
Trang 5Vậy, câu trả lời của mình là:
Có thể lược bỏ Q2 nếu không có nhu cầu nhập thông tin GDE như là một tổ hợp
riêng lẻ.
Ngược lại, vẫn giữ Q2, và khi đó, GDE sẽ là khóa của Q2
(NX thêm: các bạn để ý trong đề có nói câu: “Nếu có, hãy nêu một cách cụ thể”
Như vậy, có thể hiểu câu này sẽ có nhiều giải pháp)
Bây giờ, xét xem số lượng pth có nguy cơ có thay đổi như thế nào?
Trong cả 2 tình huống trên, thì pth G D, G E không còn nữa Do đó, vẫn còn 3 pth có nguy cơ:
o DE N
o DE H
o MN H
1.3 Đánh giá tính nhất quán toàn cục theo phương pháp Thể hiện tiêu biểu:
TQ
1
TQ
2
TQ
3
TQ
4
TQ
5
Chúng ta dựa vào F 0, để thực hiện quy trình thay thế đuổi (chase process):
- Nếu quy trình thay thế đuổi kết thúc (kết thúc nghĩa là không có thay đổi gì nữa trên thể hiện tiêu biểu) thì kết luận: Thể hiện hiện tại trong CSDL là nhất quán toàn cục
- Ngược lại, có xảy ra mâu thuẫn trong quá trình chạy, thì kết luận KHÔNG nhất quán toàn cục
Như ở bài này, ta thấy có xảy ra mẫu thuẫn khi áp dụng pth MN H
Không nhất quán toàn cục
1.4 Sửa bộ (a’degm’nz’) trong TQ1 thành (a’degmnz’): hãy kiểm tra theo phương pháp RBKNSD?
Trang 6Thao tác sửa giống như: xóa đi rồi thêm mới vào.
- Xóa đi 1 bộ trong TQ1 thì k vấn đề gì cả (Nó cũng k bị vi phạm ràng buộc
khóa ngoài thông thường,vì nhìn trên sơ đồ, ta thấy không có mũi tên nào đi vào Q1 cả, nghĩa là khóa của Q1 không được tham chiếu ở các bảng khác
- Thêm 1 bộ vào TQ1 thì mới phải lo nghĩ, ta sẽ kt bằng RBKNSD:
Bước 1: Gọi qi là bộ cần thêm vào bảng TQi Ta cần tìm bao đóng của Qi trên
F0, (Qi)+
F0 Sau đó, kiểm tra xem có bao nhiêu Qj, có thuộc tính nằm trong bao đóng này,
Ta có: (Q1)+
F0 = ADEGMNZ / X YH V W
Q1, Q2, Q2, Q4, Q5 đều nằm trong bao đóng này
Bước 2: Tìm CKH xuất phát từ Q1, phủ hết các thuộc tính của (Q1)+
F0
Ta có CKH là: Q1 |X| Q2 |X| Q3 |X| Q4 |X| Q5
Bước 3: Dựa vào CKH trên, xây dựng bộ mở rộng qi*
Ta có: qi* = a’degmnz’ / x yh v w
Bước 4: Lần lượt chiếu qi* lên các quan hệ Qj (tìm được ở bước 1), xem thử có tồn tại trong TQj không? Nếu tồn tại thì OK, nếu k tồn tại thì bị vi phạm
RBKNSD
∏Q2(qi*) = gdex ∈ TQ2
∏Q3(qi*) = deyhn ∈ TQ3
∏Q4(qi*) = mnvh ∈ TQ4
∏Q5(qi*) = hnw ∈ TQ5
Không vi phạm RBSNSD Chấp nhận thao tác sửa
Câu 2:
Viết bằng ngôn ngữ tân từ và SQL92 câu truy vấn sau:
Danh sách tổ hợp các trị MNH được lưu trong CSDL với M = m’
Giải:
Đây là câu truy vấn được phát biểu trên quan hệ phổ quát:
∏MNH(Q0) = ?
(Xem bài báo cáo do a.Nguyễn Xuân Thái trình bày)
Bước 1: Với mỗi Qi, tính (Qi)+
F0 Sau đó, kiểm tra xem bao đóng nào chứa “MNH”
Trang 7Ta có:
(Q1)+
F0 = ADEGMNZ / X YH V W chứa “MNH”
(Q2)+
F0 = GDEX / HYN W
(Q3)+
F0 = DEYHN / W
(Q4)+
F0 = MNVH / W chứa “MNH”
(Q5)+
F0 = HNW
Vậy có 2 bao đóng chứa “MNH”
Bước 2: Với mỗi bao đóng (Qi)+
F0 chứa “MNH” đó, tìm CKH Tối tiểu xuất phát từ
Qi, bao phủ được “MNH”
Với Q1, ta có Q1 |X| Q3
Với Q4, ta có Q4
Vậy:
∏MNH(Q0) = ∏MNH(Q4) U ∏MNH(Q1 |X| Q3)
Viết bằng Đại số quan hệ:
∏MNH( σM = m’(Q4)) U ∏MNH( σM = m’ (Q1 |X| Q3))
Viết bằng ngôn ngữ tân từ:
Ngôn ngữ tân từ có 2 cách viết:
• Viết bằng phép tính quan hệ có biến là bộ (tuple calculus)
• Phép tính quan hệ có biến là miền (domain calculus)
(Các bạn có thể tham khảo những cách viết này trong sách Giáo trình CSDL, Khoa CNTT, Trường ĐHKHTN, HCM, sách có bán ở nhà sách trước trường)
Ban đầu, mình dùng cách viết có biến là bộ, một cách đơn giản, mình viết thế này: {t.M, t.N, t.H | Q4(t) ∧ t.M = m’}
∨
{t1.M, t1.N, t3.H | Q1(t1) ∧ Q3(t3) ∧ t1.D = t3.D ∧ t1.E = t3.E ∧ t1.M = m’}
Tuy nhiên, cô nói k được Viết như vậy là 2 câu truy vấn tách biệt rồi
Dưới đây là lời giải của cô: (cô sử dụng cách viết có biến là miền)
{m,n,h | (∃m) (∃v) (Q4(mnvh) ∧ m=«m’»)
∨
(∃a) (∃d) (∃e) (∃g) (∃m) (∃z) (∃y)
(Q1(adegmnz) ∧ Q3(deyhn) ∧ m=«m’»)
Trang 8Lưu ý:
Chúng ta dùng ký hiệu d,e giống nhau trong Q1 và Q3, để thể hiện tính kết giữa Q1
và Q3 trên thuộc tính DE
Trang 9Câu 3:
Trang 10Thuộc-hdCó-hsnckt-là Có-các-hd
Của-kh
Trang 11Có-các-pb
Trang 12Viết câu truy vấn bằng OQL (chuẩn ODMG 3.0)
Danh sách tên khách hàng là đơn vị có kèm theo tên người đại diện có hợp đồng tư vấn đầu tư về hạ tầng cơ sở (loại đầu tư) và có hồ sơ nghiên cứu khả thi với ngày được duyệt dưới 30 ngày so với ngày thành lập phiên bản hồ sơ nghiên cứu khả thi sau cùng và do chuyên viên “X” phụ trách.
Đọc xong câu truy vấn, muốn ná thở luôn, còn dài hơn cầu Bình Triệu nữa, hic
SELECT kh.TÊN-KH, (KH-ĐƠN-VỊ)kh.TÊN-NGƯỜI-ĐẠI-DIỆN
FROM DS_HD-TV-ĐẦU-TƯ hdtvdt,
hdtvdt.Của-kh kh
WHERE hdtvdt.Có-cvpt-là.TÊN-CV = “X”
AND hdtvdt.LOẠI-ĐTƯ = “hạ tầng cơ sở”
AND (hdtvdt.Có-hsnckt-là.NGÀY-ĐƯỢC-DUYỆT-HSO –
Last(hdtvdt.Có-hsnckt-là.Có-các-pb).NGÀY-LẬP) <= 30
AND kh in DS_KH-ĐƠN-VỊ
Một số lời bàn bên cạnh câu truy vấn trên:
Điểm 1: Last(hdtvdt.Có-hsnckt-là.Có-các-pb)
Ta dùng hàm last, nhận vào 1 collection, trả ra phần tử cuối cùng của collection
đó Collection này phải thuộc dạng có thứ tự
Do đó, khi cài đặt, có thể chọn kiểu list hoặc array cho danh sách các
PHIÊN-BẢN
Nếu vẫn không muốn dùng hàm last, có thể thay bằng một câu truy vấn con như sau (tuy nhiên, cách này k phải theo tư tưởng của hướng đối tượng)
SELECT pb.NGÀY-LẬP
FROM hdtvdt.Có-hsnckt-là.Có-các-pb pb
WHERE pb.SỐ-PB = (SELECT max(pb2.SỐ-PB)
3
Trang 13FROM hdtvdt.Có-hsnckt-là.Có-các-pb pb2)
Điểm 2: kh in DS_KH-ĐƠN-VỊ
Nếu k muốn xài kiểu đó thì còn 1 cách khác
kh.MÃ-KH in (SELECT khdv.MÃ-KH
FROM DS_KH-ĐƠN-VỊ khdv)
Nhưng ko hay bằng cách trên, vì 2 lẽ: thứ nhất là có SELECT lồng, vừa dài dòng, lại không hiệu quả vì tốn chi phí tạo ra danh sách các MÃ-KH, thứ hai, cách này so sánh trên thuôc tính MÃ-KH (có thể là kiểu string) sẽ không nhanh
bằng việc so sánh địa chỉ của đối tượng)
Điểm 3: (KH-ĐƠN-VỊ)kh.TÊN-NGƯỜI-ĐẠI-DIỆN
Cái này gọi là Class Indicator (giống ép kiểu trong lập trình hướng đối tượng,
ép từ kiểu Cha, xuống kiểu Con) (xem tại mục 4.8.2 Class Indicator page 104)