Chương 3 MỘT SỐ ĐỀ XUẤT KHÁC VỀ XỬ LÝ PHÉP NỐI TRONG CÁC HỆ CSDL
3.2 Một số phương án tiếp cận xử lý nối phân tán khác
3.2.1 Sử dụng thông tin phụ thuộc vị trí (placement dependency) để thực hiện nối [7]
Xét nối tự nhiên giữa hai quan hệ R1 và R2 trên thuộc tính chung A, với giả thiết rằng chúng được phân mảnh như trong hình 3.12. Chúng ta xét phương án nối như sau: (F11><F21)∪(F12 ><F22). Với phương án này, nếu như ta có thể thu được kết quả như R1><R2, thì thao tác nối các mảnh có thể thực hiện song song mà không cần phải truyền dữ liệu. Thêm nữa ta có thể tận dụng các chỉ mục sẵn có trên từng trạm để thực hiện nối. Tuy nhiên trên thực tế thì phương án này có thể dẫn đến kết quả không chính xác.
S1 S2
R1 F11 F12
R2 F21 F22
Hình 3. 12 Hai quan hệ được phân mảnh
Ví dụ nếu bộ s trong F11 và bộ t trong F22 cùng chứa giá trị “a” của thuộc tính A, thì bộ s sẽ được nối với bộ t trong phép nối giữa R1 và R2. Tuy nhiên với phương án nối trên thì chúng lại không tham gia trong phép nối của các mảnh, do các bộ này nằm trên các trạm khác nhau và thao tác nối các mảnh được thực hiện mà không có việc truyền dữ liệu. Tuy kết quả của phương án này không phải lúc nào cũng chính xác, nhưng trong nhiều trường hợp cụ thể thì ta vẫn có thể sử dụng nó cùng với các ràng buộc.
Thí dụ 3.1:
R1 là là quan hệ NHANVIEN; R2 là quan hệ chứa các thông tin của những người phụ thuộc vào nhân viên này PHUTHUOC(MSNV, MSPT,TENPT,… ). Giả sử các bộ của PHUTHUOC luôn được gắn với bộ của NHANVIEN, tức là nếu một nhân viên làm việc tại một chi nhánh, và nếu bộ của họ nằm tại F11 thì bộ của người phụ thuộc sẽ nằm tại F21, điều đó có nghĩa là: R1><R2=(F11><F21)∪(F12 ><F22).
Định nghĩa 3.1 Hai mảnh của quan hệ Ri và Rj có phụ thuộc vị trí trên thuộc tính A
nếu Fis ><A Fjt =φ với s≠t. Nói cách khác Ri><Rj=∪(Fis><Fjs), với mỗi trạm
s chứa các mảnh của hai quan hệ [7].
Để thuận tiện ta biểu diễn điều kiện nối là Ri.A=Rj.A.
Nhận xét 1: Nếu Ri và Rj có phụ thuộc vị trí trên thuộc tính A., thì nó sẽ có phụ thuộc vị trí trên mọi tập các thuộc tính B (có chứa A). Có được kết quả trên là do nếu Fis và Fjt với s≠t không có giá trị chung nào trên thuộc tính A thì chúng không thể có giá trị chung nào trên thuộc tính (hợp) B chứa A.
Tiếp theo ta nhận thấy rằng nếu Ri và Rj có phụ thuộc vị trí trên thuộc tính A, và thuộc tính (hoặc tập của các thuộc tính) B xác định hàm bởi A và A không chứa giá trị null thì Ri và Rj sẽ có phụ thuộc vị trí trên B. Giả sử nếu ta không có phụ thuộc vị trí trên B, có nghĩa là: có 2 trạm khác nhau s và t với mảnh của Ri nằm trên trạm s là Fis và mảnh của Rj nằm trên trạm t là Fjt, và giá trị chung “b” trên thuộc tính B. Do phụ thuộc hàm và do không chứa giá trị null, nên bộ củaFis và bộ của Fjt có giá trị “b” trên thuộc tính B, thì phải có cùng giá trị trên thuộc tính A. Như vậy điều này mâu thuẫn với việc Ri và Rj có phụ thuộc vị trí trên thuộc tính A. Như vậy Ri và Rj phải có phụ thuộc vị trí trên thuộc tính B. Nói cách khác thuộc tính B được suy ra trực tiếp bởi A sẽ là thuộc tính mà Ri và Rj có phụ thuộc vị trí trên nó. Dựa trên cách tiếp cận này chúng ta có thể suy luận tiếp cho thuộc tính C (suy ra trực tiếp từ B và gián tiếp từ A). Với tập các phụ thuộc vị trí và tập các phụ thuộc hàm đầy đủ thì ta có thể suy diễn được tất cả các các phụ thuộc vị trí.
Nhận xét 2: Nếu Ri và Rj có phụ thuộc vị trí trên thuộc tính A và Rj, Rk có phụ thuộc vị trí trên B, thì:
) (
)
(Ri><A Rj><B Rk =∪ Fis ><A Fjs ><B Fks với s là các trạm chứa các mảnh của
Ri, Rj, Rk.
Nói cách khác, các thao tác nối các mảnh có có thể được thực hiện cục bộ mà không cần truyền dữ liệu. kết quả thu được theo cách sau:
=
∪
= (( ) )
)
(Ri><A Rj><B Rk s,t Fis ><A Fjs ><B Fkt
)) (
( )) (
(∪s Fis ><A Fjs ><B Fks ∪ ∪s,t≠s Fis ><A Fjs ><B Fkt
Ta thấy rằng thao tác nối cuối cùng trên thuộc tính B luôn cho giá trị rỗng (do tính chất của phụ thuộc vị trí). Do vậy Ri><A Rj><B Rk có thể được xử lý mà không cần truyền dữ liệu. Giả sử truy vấn Q chứa câu truy vấn con Q’ và nối Rj><B Rk. Với Rj là quan hệ kết quả từ Q’ và Rk không nằm trong Q’. Giả sử thao tác nối của Q’ được xử lý mà không cần truyền dữ liệu và có phụ thuộc vị trí của Rj và Rk trên thuộc tính B (hoặc tập con của B), thì thao tác nối của truy vấn có thể được tiến hành mà không cần truyền dữ liệu. (Ví dụ Q’ là Ri><A Rj và Q là
Rk Rj
Ri><A ><B ).
Căn cứ trên các nhận xét trên chúng ta xây dựng một thuật toán để xác định được thao tác nối có thể thực hiện mà không cần truyền dữ liệu.
Placement-Dependency(Q, P, S)
/* R={R1,R2...Rn} là tập các quan hệ dẫn xuất từ truy vấn Q. P là thông tin về phụ thuộc vị trí. S là tập lớn nhất các thao tác nối có thể thực hiện được mà không cần truyền dữ liệu. Khởi đầu S=φ, khi kết thúc nếu S=R thì Q có thể thực hiện không cần truyền dữ liệu */
Khởi tạo S=φ; } ...
, {R1 R2 Rn
R= ;
If cặp quan hệ Ri và Rj ∈R có thể tìm thấy sao cho chúng có phụ thuộc vị trí trên thuộc tính A nào đó và Ri ><C Rj, với C chứa A then
Đặt Ri và Rj vào tập S;
If không tìm thấy cặp quan hệ nào như vậy then Thuật toán kết thúc với S=φ;
While (còn quan hệ Rk trong R nhưng không nằm trong S thỏa mãn tính chất ** ) Chèn Rk vào tập S;
If S =Rthen Q có thể được xử lý mà không cần truyền dữ liệu.
Tính chất ** : để có thể đưa được Rk vào S thì cần có quan hệ Rj trong S sao cho giữa Rj và Rk có phụ thuộc vị trí trên thuộc tính B nào đó và Rj><B Rkcó trong Q hoặc có thể được suy ra từ Q.
Thí dụ 3.2:
Cho truy vấn R1><A R2><B R3><C R4. Giả sử ta có phụ thuộc vị trí như sau:
R1 và R2 trên thuộc tính A
R2 và R3 trên thuộc tính B R3 và R4 trên thuộc tính C.
Khởi đầu S là rỗng, sau khi câu lệnh if đầu tiên được thực hiện thì R1 và R2 sẽ được đưa vào S. Sau đó R3 cũng được đưa vào S do có tồn tại phụ thuộc vị trí giữa R2 và R3 trên thuộc tính B. Tiếp tục như vậy cuối cùng ta đưa được R4 vào trong S. Và vì
4 3
2
1 R R R
R
S= ><A ><B ><C nên truy vấn có thể được xử lý mà không cần truyền
dữ liệu.