Sinh lƣợc đồ quanhệ

Một phần của tài liệu Chuyển đổi dữ liệu giữa XML và cơ sở dữ liệu quan hệ (Trang 42)

Lược đồ kết quả phải có khả năng chọn, chèn, xoá và cập nhật một phần tử XML bất kỳ đã được khai báo trong DTD. Các bước sau đây sẽ sinh ra tập các quan hệ từ đồ thị đã được giản lược:

1) Mỗi nút e trên đồ thị đã giản lược sẽ sinh ra một quan hệ e cùng với các thuộc tính quan hệ sau đây:

a) ID là khoá chính, với mỗi thuộc tính A của e trong XML sẽ sinh ra một thuộc tính quan hệ A tương ứng có cùng tên.

b) Nếu |e.inlinedSet| 2, chúng ta đưa thêm thuộc tính nodetype để chỉ kiẻu phần tử XML được lưu trữ trong một bộ.

c) Tên tất cả các phần tử XML cuối (xem như nút lá) trong tập

e.inlinedSet. Các nút chưa cuối sẽ được lưu trữ ID, nodetype và các con của nó ở bảng edge.

d) Nếu có đúng một cạnh đơn “,” từ e đến c thì ta thêm c.ID như là một khoá ngoài cảu e tham chiếu đến quan hệ c.

2) Nếu ít nhất có hai quan hệ t1(ID) và t2(ID) được sinh ra bởi bước 1, thì chúng ta sẽ kết hợp tất cả các quan hệ có dạng t(ID) thành một quan hệ đơn table1(ID,nodetype) trong đó nodetype chỉ đến phần tử XML được lưu trữ trong một bộ.

3) Nếu ít nhất có hai bộ t1(ID,t1) và t2(ID,t2) được sinh ra bởi bước 1, thì chúng ta sẽ kết hợp tất cả các quan hệ có dạng t(ID,t) thành một quan hệ đơn table2(ID,nodetype,pcdata) trong đó nodetype chỉ ra phần tử XML nào được lưu trữ trong một bộ.

4) Nếu có ít nhất một cạnh “*” trong đồ thị giản lược DTD thì thêm quan hệ edge(parentID,childID,parentType,childType) để lưu trữ tất cả các quan hệ cha con tương ứng với những cạnh “*”. Miền của parentType và childType là một tập gồm các tên phần tử XML đwocj xác định trong DTD.

Nhìn chung, bước 1 chuyển mỗi nút e trong đồ thị giản lược DTD thành một quan hệ e riêng biệt. Nếu có những nút phần tử XML khác đã được gộp vào phần tử này (như e.inlinedSet2) thì quan hệ e được sử dụng để lưu trữ tất cả các phần tử XML được gộp đó và thuộc tính nodetype để chỉ phần tử XML gốc cho mỗi bộ. Lúc đó, bước 1 sẽ tạo ra một tập các quan hệ có dạng t(ID) và t(ID,t). Bước 3 và bước 3 tối ưu chúng bằng cách thực hiện gộp chúng theo

chiều ngang thành table1(ID,nodetype) và table2(ID,nodetype,pcdata). Sự tối ưu này làm giảm đáng kế số lược các quan hệ đích và dễ dàng ánh xạ từ phép toán XML sang các phép toán quan hệ SQL. Cuối cùng là một quan hệ đơn edge(parentID,childID,parentType,childType) lưu trữ tất cả các quan hệ nhiều- nhiều giữa hai phần tử XML bất kỳ.

Mặc dù thuật toán gộp cải tiến được tạo ra từ thuật toán gộp chia sẻ nhưng đã có nhiều cải tiến đáng kể như sau:

- Tính đầy đủ: Thuật toán có thể thực hiện với bất kỳ DTD đầu vào nào kể cả các DTD có chu trình tuỳ ý. Thuật toán gộp chia sẻ đưa ra một qui tắc để xử lý hai phần tử đệ qui lẫn nhau và nó không chỉ rõ cách xử lý đối với một chu trình có chứa nhiều hơn 2 phần tử. Hơn nữa, tuy thuật toán gộp cải tiến không kiểm tra sự tồn tại của đệ qui một cách rõ ràng như thuật toán gộp chia sẻ nhưng mặc định các chu trình sẽ được xử lý.

- Giảm dƣ thừa cho các nút chung: Một nút được gọi là nút chung nếu bậc của nó lớn hơn 1. Thuật toán này xử lý các nút chung khác với thuật toán gộp chia sẻ. Chiến lược gộp cải tiến là loại bỏ dư thừa và đưa ra qui tắc ánh xạ đối với các mối quan hệ nhiều-nhiều sang các quan hệ riêng biệt.

- Tối ƣu: Có hai trường hợp rất phổ biến trong các tài liệu XML: (1) có những phần tử XML không có thuộc tính nhằm mục đích tạo ra một tên thẻ hỗ trợ cấu trúc lồng. (2) có những nút lá là nút chung được nhiều phần tử XML chia sẻ. Nếu chúng ta tạo ra các quan hệ riêng biệt cho mỗi loại phần tử như thế thì chúng ta sẽ tạo ra một tập các quan hệ dạng t(ID) hoặc t(ID,t). Vì vây, thay vì chúng ta tạo ra hai quan hệ table1(ID,nodetype) và table2(ID,nodetype,pcdata) thì chúng ta kết hợp tất cả các quan hệ này lại. Quá trình tối ưu này làm giảm đáng kể số lượng các quan hệ trong khi sinh lược đồ và thuận lợi cho việc chuyển đổi các truy vấn XML sang các truy vấn quan hệ.

- Hiệu quả: Thuật toán gộp chia sẻ đưa ra thuộc tính parentID cho nút có toán tử * trong khi bản thân toán tử * không bao giờ được chuyển thành một quan hệ riêng biệt. Điều này dễ dàng duyệt tài liệu XML ngược lên (từ các con đến cha) chứ không thể duyệt từ trên xuống (từ cha đến con). Ngược lại, gộp cải tiến sẽ chuyển các cạnh “*” thành một quan hệ đơn edge(parentID,childID,parentType,childType) và tạo ra hai chỉ mục rõ ràng parentID và childID. Theo cách này việc định hướng ngược lên hoặc trên xuống đều được hỗ trợ hiệu quả.

Ví dụ 2.7: Xét DTD như sau <!DOCTYPE publication [

<!ELEMENT publication (journal*,conference*)> <!ELEMENT journal (name,editors,paper+)> <!ELEMENT conference (name,paper+)>

<!ELEMENT paper (ptitle,authors, (volume,number)?)> <!ATTLIST paper year CDATA >

<!ELEMENT editors (person+)> <!ELEMENT authors (person+)>

<!ELEMENT person (pname,institute,techreport*)> <!ELEMENT techreport (title,references)>

<!ELEMENT references (paper+)> <!ELEMENT institute (#PCDATA)> <!ELEMENT pname (#PCDATA)> <!ELEMENT name (#PCDATA)> <!ELEMENT ptitle (#PCDATA)> <!ELEMENT title (#PCDATA)> <!ELEMENT volume (#PCDATA)> <!ELEMENT number (#PCDATA)> ]>

Hình 2.5 Đồ thị đã được gộp sau khi áp dụng thuật toán Inline

Các quan hệ được tạo lập cho ví dụ 2.7 như sau:

 publication(ID)

 conference(ID, name.ID)

 journal(ID, nodetype, name.ID)

 name(ID, PCDATA).

 paper(ID, nodetype, ptitle, volume, number, year)

 person(ID, nodetype, pname, institute) (adsbygoogle = window.adsbygoogle || []).push({});

 techreport(ID, nodetype, title)

Một phần của tài liệu Chuyển đổi dữ liệu giữa XML và cơ sở dữ liệu quan hệ (Trang 42)