1. Trang chủ
  2. » Giáo án - Bài giảng

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

13 958 6

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 13
Dung lượng 44,22 KB

Nội dung

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 1

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 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 2

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

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 4

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, 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 5

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:

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 6

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

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 7

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(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 8

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

Trang 9

Câu 3:

Trang 10

Thuộc-hdCó-hsnckt-là Có-các-hd

Của-kh

Trang 11

Có-các-pb

Trang 12

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

Trang 13

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)

Ngày đăng: 27/01/2015, 11:02

TỪ KHÓA LIÊN QUAN

w