Siêu kiểu Any
Kiểu phi thủ tục Kiểu hàm
Kiểu nguyên thuỷ Kiểu cấu trúc Kiểu sƣu tập
boolean Kiểu có thứ tự class struct set/bag list/array
string int/float char set bag list aray
1.4.3.3. Truy vấn Select … From … Where
Cú pháp của khối lệnh trọng tâm Select trong OQL đƣợc qui định nhƣ sau [19].
Select [distinct] <Danh sách kết quả>
From <Danh sách lớp/sƣu tập lớp>
Where <Biểu thức điều kiện>
[Group by <Các thuộc tính phân nhóm>] [Having <Điều kiện lọc>]
[Order by (<Khoá sắp xếp> asc|desc, …)]
Trong đó, từ khoá distinct nếu sử dụng thì kết quả của truy vấn có kiểu tập đối tƣợng phân biệt. Mệnh đề group by phân nhóm trên lớp sƣu tập, các đối tƣợng đƣợc nhóm theo giá trị của các thuộc tính phân nhóm. Mỗi cấu trúc của nhóm chứa một nhóm các thuộc tính và nhóm các đối tƣợng có cùng giá trị. Mệnh đề order by sắpthứ tự các đối tƣợng trong lớp sƣu tập kết quả.
Để truy nhập các đặc trƣng của đối tƣợng ta sử dụng tên của đối tƣợng kết hợp với tên các đặc trƣng của đối tƣợng (thuộc tính, mối quan hệ và các phép toán) để truy nhập vào các thành phần của một đối tƣợng hoặc các đặc tính liên quan đến nó. Kiểu miền của một thuộc tính của một lớp có thể là một lớp khác. Điều này quy định việc đi từ các đối tƣợng của một lớp đến các đối tƣợng của một lớp khác thông qua các liên kết hợp thành.
Sử dụng lƣợc đồ CSDL quản lý nhân viên đƣợc biểu diễn trong Hình 1.7 minh hoạ cho các ví dụ về các dạng thức biểu diễn của truy vấn OQL.
+maso : string +hoten : string +ngaysinh : string +diachi : string +SNCT : int +Luongcoban : double NhanSu +nql : QuanLy +phong : PhongBan +duan : DuAn NhanVien +tenphong : string +dienthoai : string +ngansach : float +truongphong : QuanLy PhongBan +luonghđ : float NV_HopDong +hesoluong : float +namvao : int NV_BienChe +maduan : string +tenduan : string +chiphi : float DuAn +chucvu : string +luongquanly : double +phong : PhongBan +duan : DuAn QuanLy
Ví dụ 1.3. Cho biết tên của các nhân viên biên chế thuộc phòng do trƣởng phòng là “Nam” quản lý.
Select s.hoten
From NV_BienChe as s
Where s.PhongBan.truongphong.hoten = “Nam”
Cấu trúc nhƣ s.PhongBan.truongphong.hoten gọi là biểu thức đƣờng dẫn. Vì mỗi đối tƣợng có một OID, thuộc tính OID do hệ thống xác định đối với mỗi lớp. Do đó một biểu thức đƣờng dẫn có thể xem xét nhƣ một ký hiệu viết tắt đối với việc biểu diễn một dãy các phép nối. Chẳng hạn, mệnh đề Where ở ví dụ trên có thể viết tƣơng đƣơng nhƣ sau:
“s.PhongBan = PhongBan.OID and PhongBan.truongphong = PhongBan.OID and PhongBan.Hoten = „Nam”
1.4.3.4. Thuộc tính và lƣợng từ
Biểu thức lôgic trong OQL thực hiện việc kiểm tra trên các thành viên của một lớp sƣu tập. Các phép toán kiểm tra đƣợc sử dụng trong biểu thức lôgic là:
(i) forall – kiểm tra với một điều kiện đúng (true) cho tất cả các đối tƣợng chứa trong lớp sƣu tập.
(ii) exists – kiểm tra sự tồn tại của một đối tƣợng trong lớp sƣu tập thảo mãn một điều kiện cho trƣớc.
(iii) unique – kiểm tra tính duy nhất của các đối tƣợng trong lớp sƣu tập. (iv) in – kiểm tra một đối tƣợng có thuộc về một lớp sƣu tập hay không.
(v) some, any và all – đây là những lƣợng từ đƣợc dùng để so sánh sự ít nhất (some hay any) hay với mọi (all) cho các đối tƣợng thuộc (in) trong một lớp sƣu tập.
(vi) set inclusion – các phép toán so sánh bao hàm {<, <=, >, >=} áp dụng với Các lớp sƣu tập để kiểm tra sự bao hàm của một lớp sƣu tập này và lớp kia. Cú pháp của truy vấn có lƣợng từ forall, exists và in là:
<Truy vấn> ::= forall <Truy vấn> in <Truy vấn> : <Truy vấn> | exists <Tên> in <Truy vấn> : <Truy vấn>
| exists | unique (<Truy vấn>)
| <Truy vấn> <Phép toán so sánh> [some | any | all] <Truy vấn>
Các vị từ trong truy vấn CSDL hƣớng đối tƣợng có thể đƣợc thiết lập bằng cách sử dụng các thuộc tính tập hợp và phép toán thành viên in. Một số ví dụ về lƣợng từ.
Ví dụ 1.4
Select e.hoten
From NhanVien as e Where „Hà Nội‟ IN e.diachi
Truy vấn trên có thể đƣợc viết lại bằng cách sử dụng lƣợng từ EXISTS nhƣ sau:
Ví dụ 1.5: Select k.hoten
From NhanVien as e
Where e. EXISTS diachi = “Hà Nội”
Lƣợng từ với mọi forall có thể đƣợc áp dụng cho các thuộc tính tập đối với các dạng vị từ. Đƣờng dẫn không chứa thuộc tính tập hợp gọi là đơn trị, ngƣợc lại gọi là giá trị - tập. Các vị từ có thể sử dụng trong các biểu thức đƣờng dẫn.
Ví dụ 1.6. Biểu thức đƣờng dẫn có thể có nhiều hơn một lƣợng từ với sự kết hợp giữa
exist và forall.
Select e.phongban From PhongBan as e
Where e. EXISTS phongban.forall DU_AN.tenduan = “ Bảo trì”
1.4.3.5. Biến tham chiếu
Biến vùng mô tả cho một biểu thức đƣờng dẫn có thuộc tính cuối cùng là một thuộc tính phức đƣợc gọi là biến tham chiếu. Ngƣời ta sử dụng các biến vùng biểu diễn cho các đối tƣợng của lớp trong một biểu thức đƣờng dẫn.
Ví dụ 1.7: Select s.tenphong
From PhongBan as s, s.duan as f Where s.ngansach < f.chiphi
Trong đó, f là một biết tham chiếu đến các đối tƣợng thuộc lớp PhongBan. Ví dụ trên có thể đƣợc viết tƣơng đƣơng nhƣ sau:
Select s.tenphong From PhongBan as s
Where s.ngansach < s.duan.chiphi
1.4.3.6. Phƣơng thức tham chiếu
Phƣơng thức trong truy vấn OQL đƣợc thể hiện qua hai dạng. Dạng thứ nhất là
phương thức thuộc tính – suy dẫn, sử dụng để tính giá trị cho mỗi đối tƣợng trong lớp mà phƣơng thức tác động. Phƣơng thức thuộc tính – suy dẫn có thể đƣợc sử dụng giống nhƣ một thuộc tính trong truy vấn. Dạng thứ hai là phương thức tân từ, trả về một giá trị kiểu boolean đối với mỗi đối tƣợng trong lớp. Ví dụ, ta có phƣơng thức “VienDaiHoc() : Boolean” trên lớp DaiHoc, phƣơng thức này trả về giá trị true nếu Đại học có trên 5 trƣờng thành viên hoặc trên 30.000 sinh viên và false nếu ngƣợc lại.
1.4.3.7. Kết xuất một cấu trúc
Mô hình dữ liệu hƣớng đối tƣợng cho phép sử dụng các đối tƣợng có cấu trúc tập, danh sách và bộ để thiết lập các đối tƣợng phức từ các đối tƣợng đơn. Ngôn ngữ truy vấn OQL cho phép thiết lập các giá trị phức trong kết quả trả về của một truy vấn
bằng việc dùng các phép toán thiết lập kiểu đối tƣợng phức ở mệnh đề Select với cú pháp:
<Truy vấn>::= struct ([<Định danh>:<Truy vấn> [, <Định danh>:<Truy vấn> ] *] ) |set | bag | list | array ([<Truy vấn> [,<Truy vấn>]*] )
Ví dụ 1.8.
Select tuple(maso : s.maso, hoten : s.hoten, Baotri: select c
from s.DuAn as c
where c.tenduan = “Bảo trì”) From NhanVien as s
Where s.hesoluong >2,5
1.5. Các phép toán đối tƣợng
Các phép toán đại số đối tƣợng đƣợc chia làm sáu loại: phép toán đối tƣợng, phép toán bộ, phép toán hợp, phép toán “ túi”, phép toán danh sách và phép toán mảng [4, 17, 26].
1.5.1. Phép toán đối tƣợng
Mỗi đối tƣợng đƣợc biểu diễn nhƣ một bộ ba (OID, Tên lớp, Giá trị), OID là định danh của đối tƣợng, Tên lớp là kiểu của đối tƣợng và Giá trị của đối tƣợng do ngƣời sử dụng định nghĩa thƣờng là kiểu bộ. Có ba phép toán đối tƣợng:
- Chiếu lấy định danh (πO): phép toán πO nhận vào một đối tƣợng và trả về định danh của đối tƣợng.
- Chiều lấy giá trị (πV): phép toán πV nhận vào một đối tƣợng và trả về giá trị của đối tƣợng.
- Chiếu lấy đối tƣợng (πD): phép toán πD nhận vào một định danh đối tƣợng và trả về đối tƣợng có định danh tƣơng ứng.
1.5.2. Phép toán bộ
Thiết lập bộ: tuple(a1 : v1, …, an : vn). Phép toán tuple nhận một số các thuộc tính và các cặp giá trị (ai : vi) và trả về một bộ (a1, …, an).
Chiếu bộ π(Attrs)(): phép toán này nhận một bộ và trả về một bộ con với tên các thuộc tính đƣợc mô tả trong tập Attrs.
Trích xuất giá trị thuộc tính ðAttrs(): nhận vào một bộ và trả về giá trị của thuộc tính mô tả Attrs.
Nối bộ tuple_cat(): nhận vào hai bộ và nối chúng vào một bộ mới. Phép toán này đƣợc dùng thay thế tích Đề các.
1.5.3. Phép toán tập hợp
- Thiết lập tập hợp set() hoặc {}: Phép toán thiết lập một tập khởi tạo một tập từ một số phần tử.
- Phép toán hợp: set_union. - Phép toán hiệu: set_diff. - Phép toán chọn trên tập hợp σs
s.f(): phép toán nhận vào một tập (thƣờng là một tập đối tƣợng) và trả về một tập (đối tƣợng) sao cho mỗi phần tử ở tập kết quả đều thoả mãn điều kiện mô tả trong công thức f.
Ví dụ: cho A = {2, 6, 4, 9}, s
s.s > 5 (A) = {6, 9}. Ký hiệu “” trong “s” đƣợc dùng nhƣ một biến đếm các phần tử trong tập đã cho. Với tập đã cho là một lớp, s là một biến thể hiện lớp.
- Phép toán làm phẳng tập set_flat(): phép toán set_flat nhận vào một tập các tập và trả về một tập chứa phần hợp của các tập lồng nhau. Ví dụ, set_flat({1, 2, 3}, {2, 3, 4}, {4, 5}) = {1, 2, 3, 4, 5}.
- Phép toán áp dụng hàm trên tập set_applys.e(): phép toán set_applys.e nhận vào một tập và áp dụng biểu thức đại số e cho mỗi phần tử trong tập. Ví dụ, cho A = {{1, 2, 3}, {2, 3, 4}, {4, 5}} là một tập các tập, thì set_applys.A set_diff{3}(A) = {{1, 2}, {2, 4}, {4, 5}}. Phép toán set_apply và chiếu bộ (hoặc trích xuất giá trị thuộc tính) thƣờng đƣợc sử dụng nhƣ phép chiếu trên một tập các bộ. Ví dụ xét truy vấn “Cho biết tên và tuổi của các nhân viên”, ta có:
) (
set_apply.(hoten,tuoi)(V(S)) NhanVien
1.5.4. Phép toán bag “túi”
Các phép toán trên kiểu dữ liệu bag gồm có: thiết lập bag, hợp, hiệu, chọn, làm phẳng, áp dụng hàm trên bag: bag(), bag_union(), bag_diff(), b
s.f(), bag_flat(), bag_applys.e() và bagtoset(): chuyển đổi một “túi” (bag) về tập hợp (set) bằng cách loại bỏ các trùng lặp trong “túi”.
1.5.5. Phép toán trên danh sách
Thiết lập danh sách, lấy phần tử đầu tiên, lấy phần tử cuối cùng, ghép danh sách, chọn, làm phẳng, áp dụng hàm: list(), first(), last(), list_cat(), l
s.f(), list_flat(), list_applys.e().
1.5.6. Phép toán trên mảng
- Thiết lập mảng, ghép mảng, áp dụng: array(), array_cat(), array_ applys.e().
- Trích xuất phần tử πi() : phép toán này trả về phần tử thứ i trong mảng đã cho. - Chiếu mảng πi,j(), j > i: phép toán trả về một mảng con chứa các phần tử có chỉ
số từ i đến j của mảng đã cho.
1.6. Kết luận
UML là ngôn ngữ mô hình hóa, ngôn ngữ đặc tả và ngôn ngữ xây dựng mô hình trong quá trình phát triển phần mềm, đặc biệt là trong phân tích và thiết kế hệ thống hƣớng đối tƣợng. Chƣơng 1 trình bày các khái niệm cơ bản nhƣ đối tƣợng, định danh
đối tƣợng, lớp, kiểu và quan trong nhất là quan hệ kế thừa. Giới thiệu về ngôn ngữ truy vấn CSDL hƣớng đối tƣợng OQL và đại số đối tƣợng để viết lại các truy vấn đối tƣợng dƣới dạng các biểu thức đại số. Ngôn ngữ truy vấn hƣớng đối tƣợng OQL cung cấp khá nhiều kiểu dữ liệu thích hợp trong mô hình CSDL hƣớng đối tƣợng, đảm bảo cho sự đặc tả các đối tƣợng phức một cách phong phú và linh hoạt. Đó là những kiến thức cần thiết để phục vụ cho các chƣơng sau. Ta thấy rằng CSDL hƣớng đối tƣợng tập chung xử lý về dữ liệu, nhằm làm cho chƣơng trình trở nên linh hoạt, tin cậy và dễ phát triển. Hơn thế tính đột phá của cơ sở dữ liệu hƣớng đối tƣợng là chúng cho phép ngƣời thiết kế đặc tả cấu trúc của các đối tƣợng cùng với các phƣơng thức thực hiện trên đối tƣợng đó.
Chƣơng 2
TỐI ƢU HÓA TRUY VẤN CƠ SỞ DỮ LIỆU HƢỚNG ĐỐI TƢỢNG
2.1. Giới thiệu
Khi thực thi một truy vấn, có thể có nhiều phƣơng án mà hệ thống CSDL cho phép xử lý. Các phƣơng án đều có kết quả cuối cùng là tƣơng đƣơng về kết quả tính toán nhƣng khác nhau về chi phí thực hiện, tức là tổng thời gian cần để thực hiện một truy vấn. Lựa chọn phƣơng án nào để có tổng thời gian thực hiện truy vấn là nhỏ nhất. Nhƣ vậy, vấn đề cần quan tâm là làm sao cực tiểu tần suất sử dụng của CPU, bộ nhớ, chi phí vào/ra và các nguồn tài nguyên về lĩnh vực truyền thông. Với kỹ thuật phần cứng hiện nay việc tối ƣu thực thi một truy vấn chỉ còn là vấn đề làm cực tiểu thời gian trả lời của truy vấn, trong khi đó các hệ thống lại chịu sự chi phối chính ở thời gian trao đổi vào/ ra. Do đó, chúng ta cần lựa chọn phƣơng án nào để có tổng thời gian thực hiện là nhỏ nhất? Để giải quyết vấn đề đó, chúng ta cần dùng các phƣơng pháp để tối ƣu hoá truy vấn trong các hệ thống quản trị CSDL.
Trong những năm gần đây vấn đề tối ƣu hoá truy vấn hƣớng đối tƣợng đƣợc nhiều nhà nghiên cứu quan tâm, các kỹ thuật tối ƣu hoá truy vấn đƣợc phát triển có tính kế thừa từ mô hình CSDL quan hệ nhƣ dựa vào sự chuyển đổi lƣợc đồ CSDL hƣớng đối tƣợng sang lƣợc đồ quan hệ nhúng, thực hiện phƣơng pháp biên dịch truy vấn đối tƣợng OQL về truy vấn quan hệ SQL. Việc sử dụng CSDL quan hệ nhúng làm nền trong lƣu trữ vật lý và các thao tác dữ liệu đƣợc thực hiện qua giao diện hƣớng đối tƣợng là giải pháp ứng dụng phù hợp cho một số hệ thống CSDL đối tƣợng – quan hệ. Bên cạnh đó, để giải quyết cho một lớp các truy vấn đối tƣợng không lồng, có thể sử dụng phƣơng pháp tối ƣu truy vấn dựa trên tập luật biến đổi đại số đối tƣợng đƣợc áp dụng cho các mô hình dữ liệu hƣớng đối tƣợng có hỗ trợ tập luật. Phƣơng pháp này xử lý cho lớp các truy vấn trên các kiểu đối tƣợng phức nhƣ kiểu túi, đa tập, danh sách, bộ, …v.v, nhƣng khi thực hiện trên các lớp sƣu tập, các biểu thức đại số đối tƣợng lồng thì nó chi phí ƣớc lƣợng và các phƣơng án thực thi truy vấn chƣa hiệu quả. Vì vậy, cần phải nghiên cứu các phƣơng pháp, đề xuất các kỹ thuật tối ƣu hóa truy vấn phù hợp cho các truy vấn đối tƣợng lồng.
Đối với tối ƣu hóa các truy vấn lồng trong CSDL hƣớng đối tƣợng đã đƣợc Cluet, S. [27] đề xuất theo cách tiếp cận hai bƣớc. Bƣớc đầu tiên, đƣợc gọi là tối ƣu hóa trên cơ sở phụ thuộc: biến đổi các truy vấn ở mức ngôn ngữ nhằm thực hiện các biểu thức con chung và các truy vấn con độc lập một cách hiệu quả hơn. Các truy vấn đã biến đổi đƣợc biên dịch thành các biểu thức đại số lồng nhau. Sự định giá các
vòng lặp lồng nhau có thể không hiệu quả. Vì vậy, ở bƣớc hai xử lý cho các truy vấn con lồng trong giai đoạn “làm phẳng” các biểu thức đại số lồng nhau giúp cho phép định giá hiệu quả hơn. Trong luận văn, tập chung nghiên cứu cách tiếp cận phƣơng pháp biểu diễn các truy vấn lồng bằng siêu đồ thị kết nối. Xuất phát từ ý tƣởng biểu diễn và tối ƣu hóa các truy vấn bằng siêu đồ thị của J.D Ullman [12] và Han [16] trên ngôn ngữ QUEL/SQL, Chúng tôi nghiên cứu mở rộng thuật toán tối ƣu hóa câu truy vấn Wong-Youssefi trong ngôn ngữ truy vấn OQL trên CSDL hƣớng đối tƣợng và đƣa ra phƣơng pháp ƣớc lƣợng chi phí phụ thuộc tỷ số giữa số các đối tƣợng của lớp bắt đầu trong biểu thức đƣờng dẫn và tổng số các đối tƣợng của lớp, dựa trên mối quan hệ nhiều - nhiều giữa các lớp. Tỷ số này là một trong những tham số lựa chọn trong quá trình thiết kế CSDL.
2.1.1. Siêu đồ thị kết nối
Siêu đồ thị là sự tổng quát hóa của một đồ thị, trong đó một cạnh có thể nối với bất kỳ đỉnh nào. Về mặt hình thức, một siêu đồ thị H làmột cặp H = (V, E) chứa một tập các đỉnh V và tập các siêu cạnh E. Trong đó, tập đỉnh V tƣơng ứng với tập các mục dữ liệu (hay gọi là thuộc tính), và mỗi siêu cạnh e E tƣơng ứng với một tập các mục dữ liệu có liên quan với nhau (lớp, điều kiện). Khái niệm siêu đồ thị là sự mở rộng của một đồ thị mà mỗi siêu cạnh của nó đƣợc kết nối từ tập các đỉnh. Ta có