Lập trình với XML cho DB2, Phần 2: Phát huy sự hỗ trợ của cơ sở dữ liệu cho XML trong kiến trúc ứng dụng của bạn

Hãy tìm hiểu cách môi trường lưu trữ và truy vấn XML mới của DB2®

phiên bản 9 cho các hệ điều hành Linux®, UNIX® và Windows® làm việc trong

mô hình dữ liệu XML được mô tả trong Phần 1của loạt bài này. Phần 2 tập trung

vào cách làm thế nào để khaithác sự hỗ trợ đã cải tiến của cơ sở dữ liệu cho XML

trong kiến trúc ứng dụng của bạn.

Giới thiệu

Vị thế của XML trong cơ sở dữ liệu đã thay đổi trong vài năm qua, từ một công

nhân tạm thời thành một công dân hạng nhất. Nó không còn phải biến hình nhân

dạng để phù hợp với thế giới dữ liệu quan hệ. Nó duy trì các di sản phân cấp của

nó một cách tự hào, ngay cả khi khai thác sức mạnh và sự ổn định của thế giới cơ

sở dữ liệu quan hệ. Thực vậy, một số láng giềng cơ sở dữ liệu quan hệ của nó phải

có các kỹ thuật thích nghi, làm cho mình giống với XML để khai thác sự phong

phú của mô hình XML phân cấp.

pdf26 trang | Chuyên mục: XML | Chia sẻ: dkS00TYs | Lượt xem: 2515 | Lượt tải: 3download
Tóm tắt nội dung Lập trình với XML cho DB2, Phần 2: Phát huy sự hỗ trợ của cơ sở dữ liệu cho XML trong kiến trúc ứng dụng của bạn, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
d" )) 
 Trong các truy vấn trên, bạn không chỉ tìm kiếm, lấy ra và hợp nhất các bộ phận 
của tài liệu XML được lưu trữ trong cơ sở dữ liệu, mà bạn cũng đã biến đổi kết 
quả XML bằng cách thêm các phần tử mới vào cho nó. Ngoài ra, phần tử hardeep 
đã được ngầm ép kiểu thành kiểu (xs: string) của XML. 
So sánh giữa truy vấn cơ sở dữ liệu và mã ứng dụng Java 
Nếu bạn so sánh các truy vấn ở trên với mã Java (Liệt kê 6. Viết lại ứng dụng để 
sử dụng mô hình XML) trong phần 1, bạn sẽ thấy rằng logic là khá tương tự. 
1. Chọn các thông tin Customer từ CUSTOMER_TABLE. 
2. Xây dựng phần tử Items và tìm tất cả các mục mà khách hàng đó đã mua từ 
PURCHASE_TABLE. 
3. Lặp lại từng mục trong danh sách đã chọn và chèn nó vào phần tử Items. 
4. Chèn phần tử Items vào phần tử Customer. 
Tạo một thủ tục lưu sẵn 
Để tách logic nghiệp vụ trong cơ sở dữ liệu khỏi mã ứng dụng, một ý tưởng tốt là 
tạo ra một thủ tục lưu sẵn cho truy vấn này. 
Liệt kê dụ 5. Tạo thủ tục 
CREATE PROCEDURE customerItems(IN custid varchar(12)) 
DYNAMIC RESULT SETS 1 
LANGUAGE SQL 
BEGIN 
DECLARE c_cur CURSOR WITH RETURN FOR 
values(xmlquery(' 
for $Customer in db2-fn:xmlcolumn( 
"CUSTOMER_TABLE.CUSTXML")/Customer 
let $items:=({ 
for $Customer0 in db2-fn:xmlcolumn("PURCHASE_TABLE.ITEMXML")/Customer 
where $Customer0/@customerid= $Customer/@customerid 
return $Customer0/Item 
}) 
 where $Customer/@customerid= $customerid 
return 
transform 
copy $cust:=$Customer 
modify( 
do insert $items as last into $cust) 
return $cust 
' passing custid as "customerid" )) 
OPEN c_cur; 
END 
Thay thế mã ứng dụng bằng cách gọi ra thủ tục lưu sẵn 
Mã ứng dụng bây giờ gọi thủ tục lưu sẵn của DB2 và chuyển XML đến lớp bao 
gói DOM. Mã ứng dụng cho mô hình XML trong phần 1 (Liệt kê 6. Viết lại ứng 
dụng để sử dụng mô hình XML dòng 2 đến 8) sẽ rút lại thành: 
2. ResultSet dbResult = dbstmt.executeQuery("call customerItems ("+custid+")" 
3. XMLParse customerXML = new XMLParse(dbResult. getString(1)); 
Một ví dụ phức tạp hơn 
Ta hãy xem xét một kịch bản phức tạp hơn một chút, kịch bản này cũng tính toán 
số tiền bảo hiểm trên mỗi mục hàng. Để cho thành khó khăn hơn một chút, số tiền 
bảo hiểm không chỉ thay đổi hàng ngày mà còn thay đổi theo giá cả. Điều này có 
nghĩa là bạn phải chuyển đến truy vấn không chỉ là customerid mà còn cả mức giá 
bảo hiểm. Bây giờ giả sử rằng bạn truy vấn mức bảo hiểm hàng ngày mới nhất từ 
trang Web dịch vụ được công ty bảo hiểm cung cấp. Các thông tin về tỷ lệ bảo 
hiểm là một tài liệu XML. 
 Bạn có thể sửa đổi thủ tục lưu sẵn ở trên để tính toán mức giá bảo hiểm. 
Liệt kê 6. Thủ tục lưu sẵn tính toán tiền bảo hiểm cho mỗi mục hàng 
CREATE PROCEDURE customerItemsWithInsurance(IN custid varchar(12), rate 
XML) 
DYNAMIC RESULT SETS 1 
LANGUAGE SQL 
BEGIN 
DECLARE c_cur CURSOR WITH RETURN FOR 
values(xmlquery(' 
for $Customer in db2-fn:xmlcolumn( 
"CUSTOMER_TABLE.CUSTXML")/Customer 
let $items:=( 
{ 
for $Customer0 in db2-fn:xmlcolumn("PURCHASE_TABLE.ITEMXML")/Customer 
let $insurance:= 
{( 
if($Customer0/Item/@price > 500) then ( 
$Customer0/Item/@price * $rate//rate[@price=""]/@rate 
) 
else ( 
if($Customer0/Item/@price > 100) then ( 
$Customer0/Item/@price * $rate//rate[@price="500"]/@rate 
) 
else ( 
$Customer0/Item/@price * $rate//rate[@price="100"]/@rate 
) 
) 
)} 
where $Customer0/@customerid= $Customer/@customerid 
return 
transform 
copy $item:=$Customer0/Item 
modify( do insert $insurance as last into $item) 
return $item 
} 
) 
where $Customer/@customerid= $customerid 
return 
transform 
copy $cust:=$Customer 
modify(do insert $items as last into $cust) 
return $cust 
' passing custid as "customerid", rate as "rate" )); 
OPEN c_cur; 
END 
Cuộc gọi đến thủ tục lưu sẵn có hai thông số thời gian chạy, customerid và phần tử 
XML insurance. 
call customerItemsWithInsurance(?,?) 
Từ ví dụ trên ta thấy rõ ràng là nếu dữ liệu đang được thao tác trong cơ sở dữ liệu 
ở định dạng XML, thì sức mạnh của XQuery có thể được sử dụng để thực hiện 
nhiều logic nghiệp vụ hơn so với trước đây khi chỉ sử dụng một mình SQL. Ngoài 
ra, rõ ràng rằng XML đang được sử dụng trong truy vấn thậm chí không cần phải 
tồn tại trong cơ sở dữ liệu. Vì vậy, dữ liệu XML tham gia vào một truy vấn 
SQL/XML có thể được lưu trữ hoặc trong cơ sở dữ liệu dưới dạng thuần (phân 
cấp) của nó, nó có thể được tạo ra bằng cách sử dụng hàm SQL/XML, hoặc thậm 
chí có thể được chuyển như một tham số thời gian chạy đến truy vấn. Sự khác biệt 
giữa cơ sở dữ liệu và một máy chủ ứng dụng đang dần bị mờ đi. 
Ưu điểm và khuyết điểm 
Giống như mọi công nghệ mới, sẽ có vấn đề liên quan đến sự phát triển. Một số là 
do thực tế rằng quá trình triển khai thực hiện đang ở trong giai đoạn phiên bản đầu 
tiên, một số vấn đề khác là do sức ỳ phải thay đổi một phương pháp luận đúng và 
đã được thử thách mà bạn đã quen với chúng. 
1. Việc cải thiện hiệu suất thông lượng còn chưa ngang bằng với các dữ liệu 
quan hệ. 
2. XQuery là một ngôn ngữ mới và một số hàm SQL/XML có những cú pháp 
cần phải làm quen với chúng. 
3. Có rất nhiều dữ liệu di sản đã ở định dạng quan hệ. 
4. Điều quan trọng nhất là đây là một cách mới để tạo ra các ứng dụng nghiệp 
vụ và các lược đồ dữ liệu, khác với cách thức hiện tại của các ứng dụng 
hướng đối tượng và các lược đồ quan hệ được chuẩn hóa. 
5. Không có nhiều công cụ có thể gỡ lỗi và tối ưu hóa các loại truy vấn để có 
hiệu suất tốt hơn. 
Đối lập với các nhược điểm này là sự thực rằng mô hình mới tự nhiên hơn trong 
cách nó quản lý dữ liệu. Các thông tin về dữ liệu nghiệp vụ được duy trì và được 
thao tác nguyên vẹn ở cả tầng ứng dụng và lẫn tầng cơ sở dữ liệu, thậm chí ở cả 
tầng khách, như bạn sẽ thấy trong phần 3. 
 Mặc dù các ngôn ngữ bao ngoài có thể khác nhau (Java, XQuery, 
JavaScript, PHP), ngôn ngữ được sử dụng để duyệt đi qua tài liệu XML đều 
là một (XPath) ở tất cả các tầng. 
 Mặc dù các dữ liệu di sản là dữ liệu quan hệ, nó vẫn có thể dễ dàng được 
truy vấn và được biến hình (morphing) thành XML bằng cách sử dụng một 
số hàm SQL/XML mới được đưa vào trong Viper 2. Nhìn vào ví dụ trong 
Phần 1, "Trường hợp II: Tất cả các dữ liệu được lưu trữ trong cơ sở dữ liệu 
quan hệ." Truy vấn có thể được đơn giản hóa bằng cách sử dụng hàm 
XMLROW mới, được đưa vào trong Viper 2. 
Select XMLROW (customerid, firstname, lastname OPTION as attributes ROW 
Customer) 
from customer_table where customerid=? 
Bạn cũng có thể tạo phép nối giữa dữ liệu quan hệ và dữ liệu XML. Trong 
kịch bản ví dụ, nếu bạn đã có bảng thứ ba có chứa mô tả sản phẩm của các 
mục đã mua và đây là một bảng quan hệ, thì bạn có thể lấy các mô tả sản 
phẩm đó cho từng mục đã mua bằng cách thực hiện phép nối, sử dụng ID 
của mục hàng. 
Hình 5. Nối các cột quan hệ và XML 
Select details, weight from SQLPRODUCT, ITEM_TABLE 
where xmlexists ('$itemxml/item[@itemid=$pid]' 
passing ITEM_TABLE.ITEMXML AS "itemxml", SQLPRODUCT.PID AS "pid" ) 
Trong DB2 phiên bản 9, bạn có thể chuyển các thông số thời gian chạy tới 
cho XQuery được nhúng trong câu lệnh SQL bằng cách sử dụng mệnh đề 
passing nhưng bạn không thể làm tương tự cho SQL được nhúng trong 
XQuery. Trong Viper 2, hạn chế này đã được gỡ bỏ và bây giờ bạn có thể 
chuyển một biến thời gian chạy sang truy vấn quan hệ được nhúng vào 
XQuery. 
Liệt kê 7. Chuyển biến thời gian chạy tới cho SQL nhúng trong 
XQuery 
values(xmlquery(' 
for $Customer0 in db2-fn:xmlcolumn("PURCHASE_TABLE.ITEMXML")/Customer 
where $Customer0/@customerid= $custid 
return ( 
$Customer0/Item, 
db2-fn:sqlquery( 
''select xmlrow(details, description, weight option ROW "description") 
from sqlproduct where pid= parameter(1)'', $Customer0/Item/@ID)) 
' passing cast( ? AS varchar(255) ) as "custid" )) 
Vì vậy, ngay cả khi một số dữ liệu ở trong các bảng quan hệ và một số dữ 
liệu khác ở trong XML, bây giờ bạn vẫn có thể thực hiện phép nối động 
giữa dữ liệu XML và dữ liệu quan hệ từ bên trong hoặc là truy vấn SQL 
hoặc là XQuery hoặc cả hai. 
 Thậm chí hiệu suất cũng không phải là một vấn đề lớn trong một số trường 
hợp vì: 
o Bạn có thể tạo các chỉ mục dựa trên biểu thức XPath trên các tài liệu 
XML được lưu trữ trong cơ sở dữ liệu. 
o 
create index custfname on customer_table(info) generate key 
using xmlpattern '/Customer/@firstname' as sql varchar(64) 
o 
o Số lượng của các phép nối cần làm sẽ giảm đi vì các lược đồ cơ sở 
dữ liệu trở nên đơn giản hơn. 
o I/O có thể được giảm vì bây giờ bạn có thể nhào nặn các dữ liệu bên 
trong truy vấn trước khi bạn gửi chúng sang ứng dụng. 
o Bạn luôn luôn có thể trích xuất các thông tin then chốt từ một tài liệu 
XML sang các cột quan hệ bằng cách sử dụng các hàm SQL/XML 
như XMLTable và tạo ra các chỉ mục quan hệ trên chúng. 
o Bạn có thể tạo các chỉ mục tìm kiếm văn bản trên tài liệu XML. 
Kết luận 
XML là một ngôn ngữ tuyệt vời. Hầu hết các ngành nghề và các tổ chức chính phủ 
đang tiêu chuẩn hóa các lược đồ XML của mình và yêu cầu làm việc với các văn 
bản điện tử phù hợp với các lược đồ này. Vì dữ liệu giữa các doanh nghiệp (B2B) 
được trao đổi qua đường cáp mạng hiện tại dưới dạng XML, thì tại sao lại không 
lưu trữ dữ liệu dưới dạng như nó vốn thế (pureXML) trong cơ sở dữ liệu? Một khi 
bạn lưu trữ dữ liệu dưới dạng XML, thì bạn có thể lập chỉ mục, truy vấn, xác nhận, 
thao tác, biến đổi, và cập nhật nó bằng cách sử dụng XQuery và SQL/XML tiêu 
chuẩn. Khi bạn đẩy nhiều logic ứng dụng hơn vào truy vấn, thì cơ sở dữ liệu của 
bạn trở thành một bên tham gia tích cực trong thế giới kiến trúc hướng dịch vụ 
(SOA) bằng việc xuất bản các thủ tục lưu sẵn của nó làm dịch vụ web và nguồn 
cấp dữ liệu. 
"Trật tự cũ đã thay đổi, nhường chỗ cho cái mới." Tác giả: Morte d'Arthur 
Mục lục 
 Giới thiệu 
 Các khái niệm cơ bản về cơ sở dữ liệu XML 
 Đẩy logic ứng dụng sang cơ sở dữ liệu 
 Một ví dụ phức tạp hơn 
 Ưu điểm và khuyết điểm 
 Kết luận 

File đính kèm:

  • pdfLập trình với XML cho DB2, Phần 2 Phát huy sự hỗ trợ của cơ sở dữ liệu cho XML trong kiến trúc ứng dụng của bạn.pdf
Tài liệu liên quan