Thuật toán Xinsert-Ánh xạ dựa trên hƣớng tiếo cận DOM

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 47)

Thuật toán XInsert [6] dựa trên mô hình DOM của W3C. Trong tân của thuật toán Xinsert là giải quyết vấn đề về ánh xạ dữ liệu. Quá trình ánh xạ lược đồ sẽ được thực hiện bởi thuật toán ánh xạ lược đồ DTD.

2.1.6.1. Thuật toán ánh xạ lƣợc đồ DTD-DTD Map

Thuật toán DTDMap sẽ nhóm mỗi nút con đơn vào nút cha nếu sự xuất hiện của nút con trong nút cha chỉ một lần duy nhất. Đây là thao tác gộp nhập. Một nút có thể gộp nếu nó có đúng một nút cha và không có toán tử “*” hoặc “+”. Một nút có thể gộp được ánh xạ với nút cha của nó trong cùng một bảng. Điều này sẽ giảm bớt được số bảng và số lượng kết nối khi truy vấn.

Thuật toán DTDMap có dữ liệu đầu vào là DTD và dữ liệu đầu ra là lược đồ quan hệ. Đồng thời, thuật toán trả về các hàm ánh xạ giữa các phần tử XML, các thuộc tính của DTD và các bảng có các thuộc tính quan hệ tương ứng trong lược đồ kết quả.

<!DOCTYPE univ [

<!ELEMENT univ (colleges, schools?) >

<!ATTLIST univ uName CDATA #REQUIRED> <!ELEMENT colleges (colloge+) >

<!ELEMENT college (dep* ) >

<!ATTLIST college cName CDATA #REQUIRED> <!ELEMENT schools (school+) >

<!ELEMENT school (dep*) >

<!ATTLIST school sName CDATA #REQUIRED> <!ELEMENT dep (tel?, fax?, website?) >

<!ATTLIST dep dName CDATA #REQUIRED> <!ELEMENT tel (#PCDATA) >

<!ELEMENT fax (#PCDATA) > <!ELEMENT website (#PCDATA) > ]>

univ (ID, nodeType, uName)

college (ID, cName)

school (ID, sName)

dep (ID, nodeType, dName, tel, fax, website)

edge (parentID,childID , parentType,childType)

Bảng 2.8: Lược đồ quan hệ của univ.dtd

Ánh xạ DTD ở bảng 2.7 sinh ra lược đồ quan hệ ở bảng 2.8 được thực hiện theo 3 hàm ánh xạ , ,  sau:

-(e) ánh xạ mỗi phần tử sang một bảng quan hệ. Chẳng hạn: (univ)=univ, (uName)=univ.

-(a) ánh xạ một thuộc tính XML sang một thuộc tính quan hệ. Ví dụ:

(uName)=uName, (dName)=dName.

-(e) ánh xạ một phần tử lá sang một thuộc tính quan hệ, như:

(tel)=tel, (fax)=fax.

2.1.6.2. Ánh xạ dữ liệu

Mô hình dữ liệu dùng cho thuật toán ánh xạ dữ liệu dựa trên mô hình DOM của W3C. Tuy nhiên, mô hình này có một vài sự khác biệt so với đặc tả DOM truyền thống. Nghĩa là cây DOM chứa phần tử XML không xem các giá trị XML như những nút mà chỉ xem chúng như những trường dữ liệu của nút phần tử XML. Sự khác biệt này nhằm giúp sự biểu diễn được dễ dàng hơn. Vì vập, thuật toán này có thể thực hiện trực tiếp trên mô hình DOM chuẩn.

Định nghĩa 2.4(DOM Tree)

Xây dựng mô hình tài liệu phần tử XML D như một cây DOM chứa phần tử XML (DOM Tree) T. Trong đó, các nút biểu diễn phần tử, các cạnh

biểu diễn quan hệ cha con giữa các phần tử XML. Mỗi nút e trên cây T có những tính chất sau:

-e.name: Tên của phần tử XML.

-e.parent: Nút cha của e, e.parent=null nếu e là nút gốc của T.

-e.chilren: Tập các nút con của e, e.chilrren= nếu e là nút lá.

-e.attributes: Tập các thuộc tính XML của e, Các thuộc tính cũng có thể là e.a1, …, e.an. Tên và giá trị của các thuộc tính này là e.ai.name và e.ai.value với (i=1,…,n).

e.value: Giá trị của nút e, e.value=null nếu e không phải nút lá.

Ví dụ 2.8:

<?xml version=”1.0” ?>

<!DOCTYPE univ SYSTEM “univ.dtd”> <univ uname= “WSU”>

<colleges>

<college cname= “Science”> <dep dname= “CS”>

<website>www.cs.wayne.edu</website> </dep>

</college>

<college cname= “Engineering”> <dep dname= “ECE”>

<tel>313 -5773920</tel> </dep>

<dep dname= “IE”></dep> </college>

<college cname= “Pharmacy”></college> </colleges>

</univ>

Hình 2.7: DODTree của file univ.xml

Hình 2.7 minh hoạ cây DOM chứa các phần tử XML, mỗi nút e được gán nhãn là e.name (e.value, e.a1=e.a1.value, …, e.an=e.an.value).

Thuật toán ánh xạ dữ liệu XIsert dựa trên khái niệm phần tử có thể gộp. Tuy nhiên, chỉ dựa vào bản thân DOMTree thuật toán không thể xác định được một phần tử XML có thể gộp hay không. Vì vậy, thuật toán cần tham chiếu đến những thông tin dặc tả DTD.

Cho trước một đồ thị DTD là G có các nút n1và n2, l(n1,n2,G) là nhãn của cạnh nối giữa nút n1 và n2 trong G. Với một phần tử e, type(e) để chỉ nút phần tử tương ứng trong G. Mỗi phần tử e trong thuật toán đề có thể xác định được trường EID và mạng giá trị duy nhất. EID được sinh ra khi mỗi phần tử không thể gộp (gồm các phần tử có toán tử “+”, “*”) được xét lần đầu tiên. Trường parentEID và parentNodeType để chỉ quan hệ cha con giữa các phần tử.

(1) Algorithm XInsert

(3) Output: Các phần tử trên cây T được chèn vào CSDL quan hệ. (4) Begin

(5) Queue q := EmptyQueue(), T.root.EID.value := genID(), q.enqueue(T.root) (6) While q.isNotEmpty() do

(7) e := q.dequeue() (8) Table tb:= (e)

(9) Tạo một bộ tp trên bảng tb có các thuộc tính được khởi tạo là NULL (10) tp.ID = e.EID.value

(11) If nodeType . tb.AttributeSet then tp.nodetype = e.name End If

(12) For mỗi thuộc tính e.ai của e do tp.(e.ai) := e.ai.value End For

(13) If e là nút lá then

(14) tp.(e) := e.value

(15) Else /* e không là nút lá */ (16) Queue r := EmptyQueue()

(17) For mỗi nút con e.ci của e do r.enqueue(e.ci) End For

(18) While r.isNotEmpty() do

(19) f := r.dequeue()

(20) If f là nút không thể gộp vào e then

(21) f.EID.value := genID()

(22) f.parentEID.value := e.EID.value (23) f.parentNodeType.value := e.name

(24) If l(type(f.parent), type(f), G) <> „*‟ then

(25) tp.(f.EID) := f.EID.value (26) End If

(27) q.enqueue(f)

(28) Else /* f là nút có thể gộp vào e */

(29) for mỗi thuộc tính f.ai của f do tp.(f.ai) := f.ai.value End For

(30) If f là một nút lá then

(31) tp.(f) := f.value

(32) Else /* f không là nút lá */

(33) For mỗi con f.ci của f do r.enqueue(f.ci) End For

(34) End If

(35) End If

(36) End While

(37) End If

(38) Chèn bộ tp vào bảng tb

(39) If l(type(e.parent), type(e), G) == „*‟ then

(40) insert < e.parentEID.value, e.EID.value, e.parentNodeType.value, e.name > (41) into vào bảng edge

(42) End If

(44) End Algorithm

Thuật toán XInsert đã ánh xạ dữ liệu của một tài liệu XML và CSDL quan hệ và sinh ra lược đồ CSDL từ DTD.

Thuật toán XInsert có hai vòng lặp While lồng nhau. Vòng While ngoài duy trì một hàng đợi q để xử lý những phần tử không thể gộp (dòng 27).

Phần tử không thể gộp này lưu những thông tin về ID, nodeType, thuộc tính và nội dung trong một bộ tp (Các dòng 10-14). Dòng 38 chèn một bộ tp vào bảng (e). Nếu type(e) là phần tử “*” thì chèn bộ tpe vaog bảng edge để lưu mối quan hệ cha con (từ dòng 30-42).

Nếu e không phải là nút lá (dòng 15) thì vòng lặp While bên trong sẽ tìm hậu duệ có thể gộp của e. Thuật toán duy trì hàng đợi r để xử lý nút con cháu của e. Đầu tiên, nó sẽ xác định hậu duệ có thể gộp của e và truy xuất đến dữ liệu của chúng để lưu nội dung thông tin vào bộ tp (từ dòng 28-35). Tiếp theo là nó nắm giữ những tin về cha con của các hậu duệ không thể gộp của e qua các trường parentID và parentnodeType (từ dòng 24-26). Thuật toán sẽ kết thúc khi không còn một phần tử nào trong hàng đợi q và r.

Bổ đề sau đây sẽ phân tích độ phức tạp của thuật toán XInsert thông qua các thuộc tính của thuật toán.

Bổ đề 2.1: Mỗi nút không thể gộp e trên cây T đựơc đưa vào hàng đợi q chính xác một lần, và q chỉ chứa những phần tử không thể gộp.

Chứng minh: Phép toán đẩy phần tử vào qđược thực hiện tại dòng 5 và dòng 27. Nút gốc là không thể gộp nên đựoc đưa vào q tại dòng 5. Dòng 27 nằm trong thân cua rlệnh if (dòng 20), điều kiện của câu lệnh này chỉ ra phần tử f được đưa vào hàng đợi q ở dòng 27 là không thể gộp. Vì vậy qchỉ chứa duy nhất các phần tử không thể gộp.

Để chứng tỏ rằng mỗi phần tử không thể gộp e đựơc đẩy vào q chính xác một lần thì ta phải chứng minh e được đẩy vào q nhiều nhất một lần và ít nhất chỉ một lần. Thật vậy, mỗi phần tử q được lấy ra từ q thì e là không thể gộp vì q chỉ chứa những phần tử không thể gộp. Câu lệnh While từ dòng 18 đến dòng 36 sẽ đẩy từng phần tử con của e là f vào hàng đợi r chính xác một lần, ở đó hoặc f là con của e (dòng 17) hoặc f là có thể gộp vào e (dòng 33) hoặc f là không thể gộp vào e nhưng cha của f là có thể gộp với e (dòng 33). T không phải là chu trình chỉ ra rằng mỗi phần tử không thể gộp của T có thể đựoc đẩy vào q nhiều nhất một lần. Hơn nữa, ngoại trừ nút gốc, câu lệnh While từ dòng 18 đến 36 sẽ đảm bảo rằng mỗi phần tử không thể gộp được đẩy vào q ít nhất một lần ở dòng 27. Phần tử gốc đwocj đưa vào q chính xác chỉ một lần. Vì vậy, mỗi phần tử không thể gộp e được đẩy vào q chính xác một lần.

Bổ đề 2.2: Ngoại trừ phần tử gốc, mỗi phần tử e trên cây T được đẩy vào hàng đợi r chính xác một lần.

Chứng minh: Bổ đề 2.1 cho rằng mỗi phần tử không thể gộp e lấy ra từ q chính xác một lần (dòng 7). Đồng thời với mỗi phần tử e đó, câu lệnh While (dòng 18-36) sẽ đẩy mỗi hậu duệ của e là f chính xác một lần vào hàng đợi r. Khi đó hoặc f là con của e (dòng 17), hoặc f là có thể gộp với e (dòng 33), hoặc f là không thể gộp với e nhưng cha của f là có thể gộp với e (dòng 33). Vì vây, Mỗi phần tử của T ngoại trừ phần tử gốc sẽ thoả mãn một trong 3 trường hợp vừa nêu. Vì vậy, e sẽ được đẩy vào r ít nhất một lần. T không pahỉ là chu trình chỉ ra rằng mỗi phần tử của T có thể được đẩy vào r nhiều nhất một lần. Vậy mỗi phần tử XML của T được đẩy vào r chính xác một lần.

Định lý sau chứng minh XInsert là một thuật toán hiệu quả.

Định lý 2.3: Độ phức tạp của thuật toán XInsert là O(n) với n là số phần tử XML và những thuộc tính trên cây T.

Chứng minh: Từ bổ đề 2.1, câu lệnh lặp While ở dòng 6 sẽ thực hiện m1 lần, với m1 là số các phần tử không thể gộp của T. Theo bổ đề 2.2, câu lệnh lặp While ở dòng 18 sẽ thực hiện m2 lần, với m2=n-1. Ta có m1  m2 <n. Tất cả cac phép toán trong hai vòng lặp While này sẽ bị ràng buộc về thời gian. Vì vậy, thuật toán XInsert có độ phức tạp O(n). (đpcm)

Bảng sau đây chỉ ra cách tài liệu XML trong bảng 2.9 được ánh xạ vào CSDL quan hệ ở bảng 2.10 bởi thuật toán ánh xạ dữ liệu XInsert.

Bảng 2.10: CSDL sau khi lưu trữ univ.xml

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 47)