- Các khái niệm về Lịch biểu trong giao dịch phân tán (Schedule)
6. Quan hệ hiện thực hoá
5.3. CÁC PHÉP TRUY VẤN TRÊN MÔ HÌNH CSDL HƯỚNG ĐỐI TƯỢNG
5.3.1. Ngôn ngữ truy vấn đối tượng OQL
Trong các hệ thống CSDL hướng đối tượng (OODBS), các câu truy vấn hướng đối tượng OQL (Object Query Language) được biểu diễn giống như trong SQL. OQL của ODMG [11] cũng là ngôn ngữ khai báo giống như SQL, nó cung cấp một môi trường phong phú để truy vấn CSDL đối tượng một cách hiệu quả, kể cả những cơ sở mức cao đối với các tập đối tượng và
những cấu trúc khác. OQL liên quan chặt chẽ với phần truy vấn của SQL-92, nó mở rộng cú
pháp SELECT của SQL-92. OQL cũng bao hàm cả những phần mở rộng đối tượng như định
danh đối tượng, đối tượng phức hợp, biểu thức đường dẫn (path expressions), triệu gọi thao tác (operation invocation) và kế thừa. Các câu truy vấn OQLcó thể bao gồm cả những phương thức của ngôn ngữ ràng buộc. OQL duy trì tính toàn vẹn đối tượng bằng cách sử dụng các phương thức của đối tượng, đúng hơn là những toán tử cập nhật riêng. OQL có thể thực hiện những phương thức thay đổi trạng thái đối tượng như create(), add(), và delete(), …, giống như các hàm. Thí dụ,
Bài giảng “Cơ sở dữ liệu nâng cao” | nvdinh@vnua.edu.vn 100
Tạo ra đối tượng mới của Person có tên (name): Nguyen Long, ngày sinh (birthdate): 26/11/1992 và lương (salary): 100000, còn những thuộc tính khác của Person trong Thí dụ 3.2 được bỏ qua.
OQL là ngôn ngữ truy vấn không hỗ trợ môi trường lập trình đầy đủ, chẳng hạn OQL không thể biểu diễn cho tất cả các tính toán phức tạp. Do đó, nó không phải là hệ tính toán đầy đủ. Vì vậy, để tăng khả năng tính toán cho OQL cần phải liên kết với các ngôn ngữ lập trình khác:
(i) OQL được dùng để mô tả truy vấn và các thao tác của đối tượng;
(ii) Ngôn ngữ định nghĩa đối tượng (ODL): sử dụng mã OQL để định nghĩa giao diện
với các kiểu đối tượng;
(iii) Các ngôn ngữ lập trình khác như C++, Smalltalk và Java được dùng để cài đặt các phương thức và các chương trình ứng dụng. Đồng thời có thể nhúng các câu lệnh OQL trong các thao tác theo mô hình CSDL hướng đối tượng.
Trong (iii) OQL được dùng như ngôn ngữ truy vấn nhúng, nó cũng có thể được sử dụng như một ngôn ngữ truy vấn độc lập, nghĩa là, người dùng có thể biểu diễn các thao tác CSDL đối tượng hoàn toàn bằng OQL mà không cần một chương trình nhúng nào được viết bằng ngôn ngữ lập trình khác.
OQL được thiết kế theo hướng phát triển kế thừa, đó là thiết kế một ngôn ngữ mới đầy đủ dựa trên SQL, ngôn ngữ chuẩn của CSDL quan hệ. Thiết kế của OQL ở dạng hàm, kết quả của truy vấn có kiểu xác định, điều này cho phép kết quả của truy vấn này là đầu vào của một truy
vấn khác, vì vậy các truy vấn phức tạp có thể được xây dựng bằng OQL. Mục đích của mô hình
ODMG là duy trì một mức độ tương thích giữa kỹ thuật CSDL hướng đối tượng và kỹ thuật
CSDL đối tượng – quan hệ bằng cách tích hợp các tính năng của phiên bản tương lai của SQL
trong phiên bản tương lai của OQL.
5.3.2. OQL lõi
OQL (Object Query Language) là ngôn ngữ truy vấn đối tượng được ODMG xây dựng để hỗ trợ mô hình dữ liệu đối tượng chuẩn [4]. Trước khi tìm hiểu về OQL lõi (Core OQL), chúng ta cần nắm vững các phép toán qui ước như sau.
Các phép toán hai ngôi binop = {and, or, intersect, union, except, =, !=, <, >, <=, >=, + -, *, /, ||, mod}
Các phép toán một ngôi unop = {first, last, max, min, avg, sum, count, distinct, listtoset, element, flatten, abs, not, -}
Văn phạm của OQL có các qui tắc dẫn xuất: q ::= b | f | i | c |s
| x
| bag(q, …, q) | set(q, …, q) | list(q, …, q) | array(q, …, q) | dictionary((q, q) , …, (q, q)) | struct(l: q; : : : ; l: q) | C(l: q, …, l: q) | q:l | (C)q
Bài giảng “Cơ sở dữ liệu nâng cao” | nvdinh@vnua.edu.vn 101
| q[q] | q in q | q() | q(q, …, q) | forall x in q: q | exists x in q: q | q binop q | unop (q) | select [distinct] q from (q as x, …, q as x) where q [group by (l: q, …, l: q)] [having q]
[order by (q asc|desc, …, q asc|desc)]
Trong đó b, f, i, c, s là các giá trị boolean, float, int, char và string tương ứng, x là tập đếm được các định danh, l là tập đếm được các nhãn (set of labels), và C tập đếm được tên gọi các lớp.
Trong OQL ta có thể đặt tên các định nghĩa theo cú pháp d ::= define x as q
| define x(x: , …, ) as q
5.3.3. Các kiểu dữ liệu trong OQL
Hệ truy vấn hạt nhân có các kiểu: kiểu nguyên thuỷ, kiểu hàm n-ngôi, kiểu bội sưu tập, các cấu trúc và lớp.
Kiểu trong OQL được xây dựng theo cú pháp như sau:
Types ::= int | float | bool | char | string | void | …
| bag() | set() | list() | array() | dictionary(,) | struct(l: , …, l: ) | C
Ta sử dụng `' để ký hiệu cho kiểu hàm. Thí dụ int float là kiểu hàm có đốisố kiểu nguyên int và kết quả trả lại là float. Kiểu hàm xuất hiện khi cần thể hiện những phương thức có tham số. Những kiểu khác có thể tự giải nghĩa. Thí dụkiểu bag(bool) là kiểu túi (bag) các giá trị logic, và set(list(string)) là tập các danh sách của các chuỗi ký tự. Kiểu dictionary(string, set(int)) là kiểu từ điển với từ khoá là xâu ký tự và giá trị tương ứng là kiểu set(int). Kiểu struct(a: int, b: struct(c: float, d: char)), là kiểu cấu trúc có hai trường, trường đầu có nhãn là a ứng với một số nguyên và trường thứ hai có nhãn là b ứng với một cấu trúc có hai trường (c và d).
Để tiện lợi ta viết Col() để ký hiệu cho kiểu sưu tập (array, bag, dictionary, list hoặc set), với các phần tử có kiểu .
Các kiểu char, int, float và stringđược gọi là những kiểu có thứ tự.
5.3.4. Các dạng truy vấn của OQL
Bài giảng “Cơ sở dữ liệu nâng cao” | nvdinh@vnua.edu.vn 102
(i) Truy vấn tìm tập các đối tượng theo phạm vi tên gọi (extent name). Thí dụ tìm những người (Person) theo tên miền persons như trong hình 3-4 sẽ cho kết quả là set<Person>. persons -> set<Person>
(ii) Đối tượng được đặt tên là một truy vấn hợp lệ. Thí dụmột nhân viên có tên ”Anna”, thì câu truy vấn
Anna -> Person
Xác định thông tin về Anna. Còn câu truy vấn Anna.subordinates -> set<Person>
Xác định những người mà Anna quản lý.
(iii) Các câu truy vấn select: Một câu truy vấn selectsẽ cho lại kết quả là bag, set, hoặc
listcác mục tìm kiếm theo mệnh đề selecttừ mẫu extentmà nó thoả mãn điều kiện
where.
select <collection>
from {<collection> [<iterator var>]}* [where <cond expr>]
[group by <group expr>] [having <cond expr>] [order by <order cond>]
Thí dụ 5.5.
Xét tiếp một câu truy vấn trong OQL có sử dụng Thí dụ được định nghĩa trong ODL đã cho ở
hình 3-4. Nó tương tự như truy vấn trong SQL, nhưng được mở rộng với các đối tượng: select c.address
from Persons p, p.children c
where p.address.street="Bay Street" and
count(p.children) >= 1 and c.address.city != p.address.city
Tìm tất cả những người con của tất cả mọi người “Persons” có ít nhất một con và sống ở phố Bay Street, và không sống cùng thành phố với cha mẹ.
5.3.5. Biểu thức đường dẫn
ODMG 3.0 OQL là ngôn ngữ cho phép tham chiếu theo những đối tượng được tìm thấy để lựa chọn những đối tượng khác [16]. Để thực hiện được mục đích này thì biểu thức đường dẫn (Path expressions) được sử dụng. Biểu thức đường dẫn bắt đầu bằng một đối tượng đã được khởi tạo và sau đó là dấu chấm (.) hoặc mũi tên (->).
Thí dụ, giả sử plà biến có kiểu Personđã được khởi tạo. Hai biểu thức sau tương đương và cùng cho lại thành phố nơi mà vợ (chồng) của đối tượng pđang sống.
p.spouse.address.city.name p->spouse->address->city->name
Bài giảng “Cơ sở dữ liệu nâng cao” | nvdinh@vnua.edu.vn 103
Biểu thức đường dẫn có thể không chứa sưu tập, nghĩa là đường dẫn phải rõ ràng, không nhập nhằng, được gọi là biểu thức đường dẫn đơn giản.
Chúng ta xét biểu thức đường dẫn p.children.address.city.name
Bởi vì children trong lớp Person (Hình 3-4) là thuộc tính sưu tập (set<Person>), nó tham chiếu đến nhiều đối tượng, nghĩa là có nhiều đường dẫn để tham chiếu tới chúng, kết quả là có nhiều đường dẫn để dẫn đến nhiều tên các thành phố. Đối với đa đường dẫn, chúng ta sử dụng cách khác để xác định biểu thức đường dẫn: đặt biểu thức đa đường dẫn vào một biểu thức của OQL.
select c.address.city.name from p.children c
Mệnh đề from bao gồm đường dẫn từ đối tượng p của Person tới thuộc tính children. Khi đó, mỗi đối tượng cđược xem như là một người con (child) và mệnh đề selectđược sử dụng để xác định tên thành phố mà cđang ở, kết quả là bag<string>.
5.3.6. Triệu gọi phương thức trong OQL
Trong ODMG 3.0, một biểu thức đối tượng trong OQL có thể tham chiếu tới, triệu gọi các phương thức (Methods invoking) như là các tài sản sẵn có của nó [16]. Những phương thức này cần phải có kiểu trả lại kết quả phù hợp với các biểu thức OQL mà trong đó chúng xuất hiện (không triệu gọi được những phương thức có kiểu trả lại là void).
Đối với những phương thức (hàm) không có tham số thì phải xử lý trong ngôn ngữ lập trình. Thí dụ, hàm age() của lớp Personở Thí dụ3.3 là hàm không có tham số. Câu truy vấn tìm những người sông ở Nam Dinh có tuổi ngoài 20 có dạng.
select count (*) from persons p
where p.address.city = ‘‘Nam Dinh" and p.age >= 20
Các phương thức này trả lại kết quả là đối tượng phức hợp gồm những đối tượng có quan hệ với nhau. Lớp Person còn có phương thức auto() để xác định đối tượng Auto của mỗi người.
select count (*) from persons p
where p.address.city = ‘‘Nam Dinh" and p.age >= 20 and p.auto.model = ‘‘Toyota"
Đối với những phương thức có tham số thì đòi hởi phải tuân theo cú pháp cặp ngoặc đơn cho các tham số (parentheses syntax for arguments). Thí dụ, hãy tìm tên và tuổi của những người có ông bà, nghĩa là hasAncestor() có đối tượng của Person trong danh sách tham số.
select p.name, p.age, q.name, q.age from persons p, persons q
Bài giảng “Cơ sở dữ liệu nâng cao” | nvdinh@vnua.edu.vn 104
5.3.7. Đa xạ và liên kết muộn trong OQL
OQL hỗ trợ đa xạ (Polymorphism) trong tham chiếu tới các thuộc tính và các phương
thức trong hệ thống phân cấp của các lớp. Thí dụ, lớp Person ở Thí dụ3.1 có thuộc tính name
được cài đặt như là mảng các xâu. Lớp con của nó là Employeelại có phương thức activities()
viết đè những thuộc tính được kế thừa từ Person. Câu truy vấn sau, tìm tên (name) và những hoạt động (activities)của đối tượng được xác định khi chương trình thực thi (run-time), nghĩa là được xác định theo liên kết muộn các đối tượng (late binding) hay còn gọi là liên kết động.
select p.name, p.activities from persons p