31
Chương 1 Object Oriented Database

hương - hienlth.info

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Chương 1Object Oriented Database

Chủ đề2Object Definition Language

& Object Query Language

Object Definition Language (ODL)

3

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

• 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

5

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

• 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,…

7

Đị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

• 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

9

class Course {// the dept attribute’s value is an OIDattribute 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

• 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

11

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;

};

Từ khóa extent?

14

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

• Sử dụng từ khóa extends để xác định lớp cha mà nó kết thừa

16

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;

};

Object Query Language (OQL)

18

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ùngRDBMS

Câu truy vấn cơ bản

• 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

• Ở đâ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

19

SELECT c.crse_title, c.credit_hrsFROM courses cWHERE c.crse_code = “ADB”

Sử dụng các phép toán trong câu lệnh SELECT

• 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ụ:

20

select s.agefrom students swhere s.name = “John Marsh”

select sfrom students swhere s.gpa = 3.0

select sfrom students swhere s.gpa = 3.0and not (s.address.city = “Dayton”)

select distinct s.agefrom students swhere s.gpa > 3.0

Câu truy vấn dùng nhiều lớp đối tượng

• 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

• Ở đâ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:

21

SELECT distinct y.crse_codeFROM courseofferings x, x.belongs_to yWHERE x.sem = “Fall” and x.year = 2012

SELECT distinct y.crse_codeFROM courses y, y.offers xWHERE x.sem = “Fall” and x.year = 2012

Ví dụ minh họa

• 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ờ

• Tìm các tên và mã môn học mà sinh viên “Nguyen Van A” đăng kí học

22

SELECT c.crse_code, c.crse_titleFROM students s, s.takes x, x.belongs_to cWHERE s.name = “Nguyen Van A”

SELECT y.crse_codeFROM courseofferings x, x.belongs_to yWHERE y.year = 2012 and y.credit_hrs <= 30

Path Expression

• 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

23

Kết quả trả về là một đối tượng, cấu trúc

• 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ụ:

24

SELECT distinct struct(name: s.name, gpa: s.gpa)FROM students sWHERE s.name = “Mary Jones”

SELECT distinct Transcript(name: s.name, gpa: s.gpa)FROM students sWHERE s.name = “Mary Jones”

Viết câu truy vấn lồng nhau

• 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

• 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

25

SELECT distinct struct (code: c.crse_code, title: c_crse_title,(select xfrom c.offers xwhere x.enrollment < 20

))

FROM courses c

SELECT x.name, x.address, x.gpaFROM (select s from students s where s.gpa > 3.0) as xWHERE x.birthyear > 1992

Calculating Summary Values

• 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

• Ví dụ 2: tính lương trung bình của các nữ nhân viên trong công ty

26

select count (*) from students s

select avg (e.salary)from employees ewhere e.gender = female

Mệnh đề GROUP BY

• 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

• Ví dụ 2: nhóm các project dựa vào mức độ ưu tiên của nó

27

SELECT min(e.salary)FROM employees eGROUP BY e.dept

SELECT *FROM projects pGROUP BY

low: priority = low,medium: priority = medium,high: priority = high

Mệnh đề HAVING

• 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

28

SELECT *FROM projects pGROUP 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

• 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

• Ví dụ 2: Tìm những dự án mà không cần kĩ năng lập trình C++

29

SELECT e.emp_id, e.nameFROM employees eWHERE “Database Design” in skills or “OO Modeling” in skills

SELECT *FROM projects pWHERE not (“C ++ Programming” in p.skills_required)

Những phép toán trong tập hợp

• 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

30

Trao đổi và thảo luận

31