Tải bản đầy đủ (.docx) (13 trang)

giải đề thi cơ sở dữ liệu nâng cao

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (194.37 KB, 13 trang )

Q1
ADE / 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 F
0
+
lên các Q
i
+
.
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}
Bướ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
 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:
Q1
ADE / 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, Q
11
và Q
12
đều đạt DC BC. Và 2 pth G
 D, G  E không còn là pth có nguy cơ nữa.
- Q
12
có thể nhập vào Q
2
(G DEX) luôn.
- Tuy nhiên, sự phân rã trên không bảo toàn pth, (UF
i

)
+
≠ (F
0
)
+
.
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).
Vậ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:
A D E G H M N V W X Y Z
TQ
1
a d e g h m n x y z
a’ d e g h m’ n x y z’
TQ
2
d e g h n x y
TQ
3
d e h n y
TQ
4
h m n v
h’ m’ n v’
TQ
5
h n w
h’ n w’
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?
Thao 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
F
0
, (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ó: (Q
1
)
+
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 (Q
1

)
+
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ệ Q
j
(tìm được ở bước 1), xem thử có
tồn tại trong TQ
j
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
(Q
0
) = ?
(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”
Ta 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
(Q
0
) = ∏
MNH
(Q
4
) U ∏
MNH
(Q
1
|X| Q
3
)
Viết bằng Đại số quan hệ:

MNH


M = m’
(Q
4
)) U ∏
MNH

M = m’
(Q
1
|X| Q
3
))
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 | Q
4
(t) ∧ t.M = m’}

{t
1
.M, t
1
.N, t
3

.H | Q
1
(t
1
) ∧ Q
3
(t
3
) ∧ t
1
.D = t
3
.D ∧ t
1
.E = t
3
.E ∧ t
1
.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) (Q
4
(mnvh) ∧ m=«m’»)

(∃a) (∃d) (∃e) (∃g) (∃m) (∃z) (∃y)
(Q
1
(adegmnz) ∧ Q
3

(deyhn) ∧ m=«m’»)
}
Lư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.
Câu 3:
Thuộc-hsnckt
Thuộc-hd
Có-hsnckt-là
Có-các-hd
Của-kh
Có-các-pb
Viế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
1
2
FROM 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)

×