Thuật toán gộp cơ sở (Basis Inlining)

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

Thuật toán gộp cơ sở giải quyết vấn đề phân mảnh bằng cách gộp hậu duệ của một phần tử vào một quan hệ đơn dựa trên đồ thị DTD [7]. Đồ thị DTD biểu diễn cấu trúc của một DTD. Các nút của đồ thị là những phần tử, thuộc tính và các toán tử trong DTD. Mỗi phần tử xuất hiện trong đồ thị đúng một lần. Các thuộc tính và các toán tử có thể xuất hiện nhiều lần. Quan hệ đệ qui đwocj biểu diễn bởi chu trình trong đồ thị. Đồ thị DTD tương ứng với ví dụ 2.3 được biểu diến như sau:

Hình 2.1: Đồ thị DTD

Thuật toán gộp cơ sở tạo ra đồ thị phần tử để xử lý các phần tử đặc biệt và sinh tập các quan hệ cho phần tử đặc biệt này. Đồ thị phần tử được xây dựng như sau:

-Trên đồ thị DTD, ta tiến hành duyệt theo chiều sâu bắt đầu từ nút phần tử mà ta muốn xây dựng quan hệ. Mỗi nút được đánh dấu là “visited” ở lần đầu tiên được xét và bỏ đánh dấu khi tất cả các con của nó được duyệt qua.

-Trong quá trình duyệt theo chiều sâu trên đồ thị DTD, nếu gặp một nút chưa được đánh dấu thì ta ta tạo ra một nút mới trên đồ thị phần tử có cùng tên với nút vừa gặp. Đồng thời, một cung có hướng được tạo ra trên đồ thị phần tử để nối từ nút được tạo ra trước đó với nút mới sinh (tương ứng quan hệ cha con trong đồ thị DTD). Nếu duyệt đến một nút đã được đánh dấu rồi (kể cả nuúut đã được đánh dấu một lần và được xoá đánh dấu sau khi duyệt qua tất cả các con) thì một cạnh có hướng lại được sinh ra trên đồ thị phần tử để nối từ nút

mới được tạo ra gần nhất tới nút có cùng tên với nút đang xét trong đồ thị DTD.

Ví dụ 2.4: Xây dựng đồ thị phần tử cho editor trong đồ thị DTD ở hình 2.4. Ta thấy đồ thị phần tử kết quả là một cấu trúc cây được mở rộng bởi những phần có liên quan trong đồ thị DTD.

Hình 2.2: Đồ thị phần tử editor

Khi có một đồ thị phần tử, ta tiến hành tạo ra các quan hệ như sau: Đầu tiên ta tạo ra một quan hệ cho phần tử gốc của đồ thị . Tất cảc các hậu duệ của phần tử gốc được gộp vào trong quan hệ đó ngoại trừ hai trường hợp sau:

1)Nếu một phần tử là con trực tiếp của một nút “*” thì ta sẽ tạo một quan hệ riêng biệt, nghĩa là ta đang tạo một quan hệ mới cho phần tử con có giá trị tập hợp.

2) Nút có cạnh chỉ ngược về chính nó thì phải tạo một quan hệ riêng biệt, tương ứng với việc tạo ra một quan hệ mới để quản lý sự đệ qui.

Các thuộc tính trong quan hệ (Hình 2.6) được đặt tên bởi đường dẫn từ phần tử gốc của quan hệ. Mỗi quan hệ có một trường ID làm khoá. Các quan hệ của 2 trường hợp đặc biệt (phần tử có giá trị tập hợp và đệ qui) sẽ có thêm trường parentID. Trường này có tác dụng như một khoá ngoài để chỉ đến quan hệ cha.

book (bookID: integer, book.booktitle : string, book.author.name.firstname: string, book.author.name.lastname: string,

book.author.address: string, author.authorid: string)

booktitle (booktitleID: integer, booktitle: string)

article (articleID: integer, article.contactauthor.authorid: string, article.title: string)

article.author (article.authorID: integer, article.author.parentID: integer, article.author.name.firstname: string,

article.author.name.lastname: string, article.author.address: string, article.author.authorid: string)

contactauthor (contactauthorID: integer, contactauthor.authorid: string)

title (titleID: integer, title: string)

monograph (monographID: integer, monograph.parentID: integer, monograph.title: string, monograph.editor.name: string,

monograph.author.name.firstname: string, monograph.author.name.lastname: string,

monograph.author.address: string, monograph.author.authorid: string)

editor (editorID: integer, editor.parentID: integer, editor.name: string)

editor.monograph (editor.monographID: integer,

editor.monograph.parentID: integer, editor.monograph.title: string, editor.monograph.author.name.firstname: string,

editor.monograph.author.name.lastname: string,

editor.monograph.author.address: string, editor.monograph.author.authorid: string)

author (authorID: integer, author.name.firstname: string, author.name.lastname: string, author.address: string, author.authorid: string)

name (nameID: integer, name.firstname: string, name.lastname: string)

firstname (firstnameID: integer, firstname: string) (adsbygoogle = window.adsbygoogle || []).push({});

lastname (lastnameID: integer, lastname: string)

address (addressID: integer, address: string)

Bảng 2.4: Lược đồ quan hệ được sinh ra từ các DTD ở ví dụ 2.3

Thuật toán gộp cơ sở ánh xạ mỗi phần tử hay thuộc tính sang một quan hệ nên quá trình ánh xạ đơn giản và dễ thực hiện. Đồng thời, nó đã xử lý được vấn đề đệ qui trong khi chuyển đổi. Tuy nhiên, nhược điểm của thuật toán gộp cơ sở là tạo ra số lượng các quan hệ quá lớn và kém hiệu quả đối với một số truy vấn do phải kết hợp quá nhiều bảng.

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