Chương 1 Object Oriented Database
Chủ đề2 Object Definition Language & Object Query Language
3 Object Definition Language (ODL) Object Definition Language (viết tắt là ODL): ngôn ngữ mô tả đối tượng Là ngôn ngữ do tổ chức ODMG (Object Data Management Group) đề xuất Dùng để xác định mô hình logic cho cơ sở dữ liệu hướng đối tượng Dùng để định nghĩa các lớp đối tượng và các mối quan hệ giữa chúng
Định nghĩa lớp đối tượng 4
Định nghĩa lớp đối tượng 5 Từ khóa class: xác định tên lớp đối tượng Từ khóa attribute: dùng để xác định thuộc tính đối tượng Kết thúc định nghĩa phải có dấu chấm phẩy class Student { attribute string name; attribute Date dateofbirth; attribute string address; attribute string phone; // plus relationship and operations...
Định nghĩa lớp đối tượng (tt) 6 class Course { attribute string crse_code; attribute string crse_title; attribute short credit_hrs; // plus relationships and operation...
Định nghĩa thuộc tính 7 Thuộc tính của một đối tượng có thể là tham chiếu hoặc tham trị Tham trị: giá trị bình thường literal value (chuỗi kí tự, con số, kí tự, ) Tham chiếu: giá trị sẽ là OID của 1 đối tượng khác Một số kiểu literal trong OO Model: Atomic literal: hằng số mà ta không thể phân nhỏ ra thành những thành phần nhỏ hơn. Ví dụ: số nguyên, số thực, kí tự, giá trị logic Collection literal: tập hợp nhiều thành phần. Có 4 kiểu được ODMG hỗ trợ: Set: tập hợp không có thứ tự, không có thành phần trùng nhau Bag: tập hợp không có thứ tự, có thể có thành phần trùng nhau List: tập hợp có thứ tự Array: dynamically sized ordered collection, located by position Dictionary: tập hợp các cặp key-value, các key không có trùng lắp Structure literal: kiểu dữ liệu có cấu trúc như phân số, số phức,
Định nghĩa thuộc tính (tt) 8 struct Address { string street_address; string city; string state; string zip; struct Phone { short area_code; long personal_number; class Student { attribute string name; attribute Date dateofbirth; attribute Address addresses; attribute set<string> emails; attribute set<phone> phones; // plus relationship and operations...
Trường hợp thuộc tính là một đối tượng 9 Thuộc tính của một đối tượng có thể là tham chiếu đến một đối tượng khác Mặc dù cách khai báo tương tự như thuộc tính bình thường. Nhưng về mặc lưu trữ thì chỉ lưu trữ Object Identifier của đối tượng mà nó tham chiếu Sẽ không hỗ trợ các phép tìm kiếm phức tạp. Do đó nên tạo mối quan hệ hơn là tạo 1 thuộc tính liên kết class Course { // the dept attribute s value is an OID attribute Department dept;... class Department { attribute short dept_number; attribute string dept_name; attribute string office_address;
Định nghĩa mối quan hệ kết hợp 10
Định nghĩa mối quan hệ kết hợp 11 ODMG chỉ hỗ trợ định nghĩa mối quan hệ 1 ngôi và 2 ngôi. Trường hợp mối quan hệ 3 ngôi trở lên thì chuyển về các mối quan hệ 2 ngôi Trường hợp mối quan hệ 2 ngôi: Phải xác định tên mối quan hệ ở cả 2 chiều Phải định nghĩa mối quan hệ ở cả 2 lớp đối tượng Nếu là quan hệ 1 nhiều thì bên lớp 1 phải sử dụng các kiểu Collection (set, bag, list, ) mô tả danh sách các đối tượng của lớp nhiều tham gia Cú pháp relationship set<clssn>/clssn <RelName> inverse <InvRelName> Trong đó: relationship, inverse là từ khóa RelName: tên mối quan hệ theo chiều thuận InvRelName: tên mối quan hệ theo chiều ngược lại ClssN: tên lớp
Ví dụ minh họa 12 class Student { (extent students) attribute string name; attribute Date dateofbirth; attribute Address address; attribute Phone phone; relationship set<courseoffering> takes inverse CourseOffering::taken_by;
Ví dụ minh họa (tt) 13 class CourseOffering { (extent courseofferings) attribute string term; relationship set<student> taken_by inverse Student::takes; relationship Course belongs_to inverse Course::offers; class Course { (extent courses) attribute string crse_code; attribute string crse_title; attribute short credit_hrs; relationship set<course> has_prereqs inverse Course::is_prereq_for; relationship set<course> is_prereq_for inverse Course::has_prereqs; relationship list<courseoffering> offers inverse CourseOffering::belongs_to;
14 Từ khóa extent? The extent of a class is the set of all instances of the class within the database For example, the extent called students refers to all the Student instances in the database
Định nghĩa mối quan hệ kế thừa 15
Định nghĩa mối quan hệ kết thừa 16 Sử dụng từ khóa extends để xác định lớp cha mà nó kết thừa class Employee { (extent employees) attribute short empname; attribute string empnumber; attribute Address address; attribute Date datehired; void printlabel( ); class HourlyEmployee extends Employee { (extent hrly_emps) attribute float hourlyrate; float computewages( ); class SalariedEmployee extends Employee { (extent salaried_emps) attribute float annualsalary; attribute boolean stockoptions; void contributepension( );
Định nghĩa lớp trừu tượng 17 abstract class Student { (extent students) attribute long stu_number; attribute string name; attribute Date dateofbirth; attribute Address address; attribute Phone phone; class GraduateStudent extends Student { (extent grads) attribute char undergrad_major; attribute GRE gre_score; attribute GMAT gmat_score; class UndergradStudent extends Student { (extent undergrads) attribute SAT sat_score; attribute ACT act_score;
18 Object Query Language (OQL) Object Query Language (viết tắt là OQL): ngôn ngữ truy vấn đối tượng Là ngôn ngữ do tổ chức ODMG (Object Data Management Group) đề xuất Có cú pháp tương tự như SQL Có thể dùng xen kẽ host language và OQL language. Đây là ưu thế so với cách sử dụng SQL trong ứng dụng dùng RDBMS
Câu truy vấn cơ bản 19 OQL cho phép sử dụng cú pháp truy vấn select from where tương tự như câu lệnh SQL Ví dụ: tìm tên và số tín chỉ (tính theo giờ) của môn có mã là ADB SELECT c.crse_title, c.credit_hrs FROM courses c WHERE c.crse_code = ADB Ở đây, courses (được định nghĩa bởi từ khóa extent) và được đặt tên là c trong câu truy vấn này. Cách truy xuất thành phần dữ liệu của đối tượng: Cú pháp: <tên đối tượng>.<tên thành phần dữ liệu> Dấu chấm nói lên quan hệ sở hữu Ý nghĩa của cú pháp: truy xuất thành phần dữ liệu nào của đối tượng nào
Sử dụng các phép toán trong câu lệnh SELECT 20 Tương tự như trong SQL, OQL cho phép sử dụng các phép toán so sánh trong mệnh đề WHERE Từ khóa DISTINCT dùng để tìm các phần tử khác biệt Ví dụ: select s.age from students s where s.name = John Marsh select s from students s where s.gpa = 3.0 select s from students s where s.gpa = 3.0 and not (s.address.city = Dayton ) select distinct s.age from students s where s.gpa > 3.0
Câu truy vấn dùng nhiều lớp đối tượng 21 Trong truy vấn OQL, có thể dựa vào các mối quan hệ đã được định nghĩa để truy xuất đến những lớp đối tượng khác. Ví dụ: tìm mã các môn học mà được mở vào học kì 1 năm 2012 SELECT distinct y.crse_code FROM courseofferings x, x.belongs_to y WHERE x.sem = Fall and x.year = 2012 Ở đây thông qua mối quan hệ belongs_to đã dược định nghĩa trước để truy xuất để lớp CourseOfferring Khác với SQL trong RDBMS, trong OQL ta không dùng cú pháp JOIN mà sử dụng mối quan hệ (reference) Ta có thể viết như sau: SELECT distinct y.crse_code FROM courses y, y.offers x WHERE x.sem = Fall and x.year = 2012
Ví dụ minh họa 22 Tìm các mã môn học được mở năm 2012 mà có số tín chỉ nhỏ hơn hoặc bằng 30 giờ SELECT y.crse_code FROM courseofferings x, x.belongs_to y WHERE y.year = 2012 and y.credit_hrs <= 30 Tìm các tên và mã môn học mà sinh viên Nguyen Van A đăng kí học SELECT c.crse_code, c.crse_title FROM students s, s.takes x, x.belongs_to c WHERE s.name = Nguyen Van A
Path Expression 23 Gọi: a đối tượng thuộc lớp đối tượng C p là tên thuộc tính (hoặc mối quan hệ, phương thức) của lớp đối tượng C Khi đó: Nếu p là thuộc tính thì a.p là giá trị thuộc tính của đối tượng a Nếu p là phương thức thì a.p là kết quả khi gọi phương thức p của đối tượng a Nếu p là mối quan hệ thì a.p là đối tượng hoặc tập các đối tượng có mối quan hệ với a thông qua mối quan hệ p
Kết quả trả về là một đối tượng, cấu trúc 24 Trong OQL, có thể cho phép tạo ra đối tượng, cấu trúc khi trả về kết quả Ví dụ: SELECT distinct struct(name: s.name, gpa: s.gpa) FROM students s WHERE s.name = Mary Jones SELECT distinct Transcript(name: s.name, gpa: s.gpa) FROM students s WHERE s.name = Mary Jones
Viết câu truy vấn lồng nhau 25 Ví dụ: tìm mã và tên môn học cùng với những course offering nào mà số lượng sinh viên đăng kí ít hơn 20 người SELECT distinct struct (code: c.crse_code, title: c_crse_title, (select x from c.offers x where x.enrollment < 20 ) ) FROM courses c Tìm tên, địa chỉ và điểm tích lũy của những sinh viên sinh năm từ 1992 trở về sau và có điểm tích lũy lớn hơn 3.0 SELECT x.name, x.address, x.gpa FROM (select s from students s where s.gpa > 3.0) as x WHERE x.birthyear > 1992
Calculating Summary Values 26 Tương tự như SQL, ngôn ngữ OQL cũng hỗ trợ các hàm count, sum, max, min, avg. Ví dụ 1: tìm tổng số sinh viên trong trường select count (*) from students s Ví dụ 2: tính lương trung bình của các nữ nhân viên trong công ty select avg (e.salary) from employees e where e.gender = female
Mệnh đề GROUP BY 27 Tương tự như SQL, ngôn ngữ OQL hỗ trợ mệnh đề GROUP BY Ví dụ 1: tính lương thấp nhất trong mỗi phòng ban SELECT min(e.salary) FROM employees e GROUP BY e.dept Ví dụ 2: nhóm các project dựa vào mức độ ưu tiên của nó SELECT * FROM projects p GROUP BY low: priority = low, medium: priority = medium, high: priority = high
Mệnh đề HAVING 28 Tương tự như SQL, ngôn ngữ OQL cũng hỗ trợ mệnh đề HAVING Ví dụ: nhóm các project dựa vào mức độ ưu tiên của nó nhưng chỉ liệt kê những dự án nào mà có số giờ làm việc hơn 50 tiếng SELECT * FROM projects p GROUP BY low: priority = low, medium: priority = medium, high: priority = high HAVING sum(select x.hours from p.has x) > 50
Sử dụng khái niệm tập hợp 29 Nếu ta muốn xem một phần tử nào đó có thuộc vào một tập hợp nào đó hay không thì dùng từ khóa Ví dụ 1: tìm mã số và tên nhân viên có kĩ năng thiết kế database và mô hình hóa đối tượng SELECT e.emp_id, e.name FROM employees e WHERE Database Design in skills or OO Modeling in skills Ví dụ 2: Tìm những dự án mà không cần kĩ năng lập trình C++ SELECT * FROM projects p WHERE not ( C ++ Programming in p.skills_required)
Những phép toán trong tập hợp 30 Ngôn ngữ OQL có hỗ trợ các phép toán tập hợp như: UNION (hợp), INTERSECT (giao nhau), EXCEPT (phần khác nhau) Để kiểm tra có ít nhất một phần tử có trong tập hợp nào đó thì ta sử dụng từ khóa exists Để kiểm tra tất cả các phần tử thỏa mãn điều kiện nào đó ta dùng từ khóa for all
Trao đổi và thảo luận 31