Để thống nhất trong trình bày các ví dụ của luận văn, tôi sử dụng CSDL quản lý nhân viên đƣợc minh họa nhƣ sau:
Class NhanSu
type tuple ( manhansu: string[10]; hoten: string[20]; gioitinh: string[10]; diachi: string[20];
ngaysinh: tuple (ngay: integer; thang: integer; nam: integer ) sonamcongtac: integer;
luongCB: double)
Class NhanVien inherits NhanSu
type tuple ( nql: string[20]; // nql – người quản lý phongban: PhongBan;
duan: set( DuAn))
Class QuanLy inherits NhanSu
type tuple ( chucvu: string[10];
PCCV: double; //PCCV – phụ cấp chức vụ phongban: PhongBan; duan: DuAn; ngayBĐ: datetime; ngayKT: datetime) Class PhongBan
type tuple ( maphongban: string[10]; tenphongban: string[20]; truongphong: string[20]; sonhanvien: integer )
Class DuAn
Type tuple ( maduan: string[10; tenduan: string[20]; phong: PhongBan; SoNV: int; Ngaybatdau: Datetime; Ngayketthuc: Datetime; kinhphi: double )
2.2.2.1. Biểu diễn các truy vấn đối tƣợng bằng siêu đồ thị
Ví dụ 2.2: Cho biết họ tên tất cả các nhân viên thuộc phòng “Truyền thông”
Select s.hoten
From NhanVien as s, PhongBan as k
Where k.tenphongban = “Truyền thông” and s.phongban = k.maphongban
Truy vấn trên đƣợc viết lại với toán tử EXISTS
Select s.hoten
From NhanVien as s Where EXISTS ( Select *
From PhongBan as k
Where k.tenphongban = “Truyền thông” and s.phongban = k.maphongban )
(a)
(b)
Toán tử EXISTS là toán tử so sánh trên tập hợp. Nó cho phép chúng ta kiểm tra một giá trị nào đó có tồn tại trong một tập hợp không. Vì thế, với mỗi Nhân viên s ta kiểm tra giá trị này trên tập các dòng của Phòng ban k xem có rỗng không. Nếu không rỗng tức là nhân viên s thuộc phòng “Truyền thông” và ta đƣa ra họ tên của nhân viên đó.
Thuộc tính phongban là thuộc tính có kiểu PhongBan, kết nối hàm giữa thuộc tính phongban với lớp PhongBan đƣợc biểu diễn bằng một siêu cạnh kết nhập với lƣợng từ EXISTS). Truy vấn trên đƣợc biểu diễn bằng siêu đồ thị kết nối nhƣ sau:
Hình 2.3. Siêu đồ thị kết nối của ví dụ 2.2
2.2.2.2. Biểu diễn các truy vấn lồng bằng siêu đồ thị kết nối
Ví dụ 2.3: Tìm tất cả các nhân viên có lƣơng cao nhất thuộc phòng “Truyền thông”
Select s.hoten, s.luongCB
From NhanVien as s, PhongBan as g Where g.tenphongban = “Truyền thông”
and s.phongban = g.maphongban
and s.luongCB = (Select max(k.luongCB) From NhanVien as k
Where k.manhansu = s.manhansu)
Với câu truy vấn trên ta có thể thực hiện lần lƣợt các bƣớc biểu diễn siêu đồ thị nhƣ sau. Trƣớc tiên, chúng ta biểu diễn riêng cho từng siêu đồ thị kết nối với hai khối SFW (a) và (b). max(luongCB) phongban ... NhanVien head (a) hoten phongban ….. NhanVien maphongban tenphongban … ….. PhongBan head EXISTS „=“Truyền thông”‟
Sau đó thực hiện việc “trộn” hai siêu đồ thị kết nối thành một siêu đồ thị kết quả (c) bằng phép kết nối s.manhansu = k.manhansu và các biểu thức điều kiện tƣơng ứng.
Hình 2.4. Siêu đồ thị kết nối của ví dụ 2.3.
Ví dụ 2.4: Cho biết tên các nhân viên có mức lƣơng thu nhập lớn hơn hoặc bằng 10 triệu và tham gia các dự án có kinh phí lớn hơn hoặc bằng 200 triệu.
Select g.hoten From QuanLy as g
Where g.luongCB 10.000.000
and g.duan IN ( Select k.tenduan
From DuAn as k
Where k.kinhphi 200.000.000)
Tƣơng tự nhƣ ví dụ 2.3, ta cũng xác định lần lƣợt các siêu đồ thị con cho từng khối SFW. Và truy vấn đƣợc biểu diễn bằng siêu đồ thị kết nối nhƣ sau: Các siêu cạnh đối tƣợng biểu diễn các lớp QuanLy và DuAn. Đối với các siêu cạnh đỉnh, chúng ta có 2 siêu cạnh đỉnh: g.hoten là siêu cạnh đỉnh của khối SFW thứ nhất (kết quả của truy vấn) và k.tenduan là siêu cạnh đỉnh của khối SFW thứ hai cũng là khối SFW
hoten luongCB phongban …
head head NhanVien
(b) tenphongban
...
PhongBan
„=“Truyền thông”‟
hoten luongCB manhansu … phongban
head NhanVien ... Max(luongCB) = tenphongban ... NhanVien PhongBan head (c) „=“Truyền thông”‟
lồng. Hai siêu cạnh điều kiện g.luongCB 10.000.000; k.kinhphi 200.000.000 và siêu cạnh kết nhập g.duan IN k.tenduan đƣợc gán nhãn là IN.
Hình 2.5. Siêu đồ thị kết nối của ví dụ 2.4