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 1 của loạt bài này. Phần 2 tập trung vào cách làm thế nào để khai thá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.

Hardeep Singh, Kiến trúc sư các công nghệ nâng cao, IBM

Hardeep Singh là một thành viên của nhóm công nghệ cao. Ông là kiến trúc sư về tạo công cụ XML và di trú XML của DB2. Ông đã có hơn 23 năm kinh nghiệm chuyên môn.



11 07 2011

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.

Bài viết này giới thiệu cách môi trường lưu trữ và truy vấn XML mới làm việc trong mô hình dữ liệu XML từ phần 1. Nó cho thấy rằng một khi bạn thích ứng với kiến trúc phát triển ứng dụng dựa trên XML mới, thì các lược đồ cơ sở dữ liệu của bạn trở nên đơn giản hơn nhiều và tự nhiên hơn như thế nào. Nó cũng cho thấy cách truy vấn dữ liệu XML trong cơ sở dữ liệu không khác với cách truy vấn dữ liệu trong ứng dụng. Cuối cùng, nó cho bạn thấy cách kết hợp các dữ liệu quan hệ với các dữ liệu XML để có được những điểm tốt nhất của cả hai thế giới đó.


Các khái niệm cơ bản về cơ sở dữ liệu XML

Mặc dù hầu hết các cơ sở dữ liệu quan hệ chính đều có một số hỗ trợ cho XML, nhưng sự hỗ trợ của pureXML DB2 cho XML là mạnh mẽ và hiệu quả hơn nhiều, làm cho nó trở thành một cơ sở dữ liệu lý tưởng để thử nghiệm mô hình lập trình XML. Trong bài này tôi tập trung vào cách để khai thác sự hỗ trợ đã cải tiến này của cơ sở dữ liệu cho XML trong kiến trúc ứng dụng của bạn.

DB2 cho phép bạn lưu trữ, truy vấn, thao tác và xuất bản:

  • Dữ liệu quan hệ bằng SQL
  • Dữ liệu quan hệ như XML bằng SQL/XML
  • Dữ liệu XML bằng Xquery
  • Dữ liệu lai (Dữ liệu quan hệ & XML) bằng SQL/XML và Xquery
Hình 1. Lưu trữ lai của DB2
Hình 1. Lưu trữ lai của DB2

Lưu trữ XML trong cơ sở dữ liệu

Ưu điểm chính của sự hỗ trợ XML trong cơ sở dữ liệu quan hệ là bạn có thể ghi lưu được cả dữ liệu quan hệ và dữ liệu XML trong cùng một bảng. Và mặc dù về nội tại bên trong XML được lưu trữ dưới dạng (dạng cây) phân cấp, nhưng về mặt logic, trong bảng cơ sở dữ liệu nó dường như được lưu trữ trong chỉ một cột đơn (như một CLOB hay BLOB).

Từ các đối tượng dữ liệu trong phần 1, bạn thấy rằng có hai bảng với ít nhất hai cột mỗi bảng.

Liệt kê 1. Các bảng
CREATE TABLE CUSTOMER_TABLE (
CUSTOMERID CHARACTER (12) NOT NULL,
CUSTXML XML NOT NULL ,
CONSTRAINT CC1183665042494 PRIMARY KEY ( CUSTOMERID) )

CREATE TABLE PURCHASE_TABLE (
CUSTOMERID CHARACTER (12) NOT NULL ,
ITEMXML XML NOT NULL ,
CONSTRAINT CC1183665244645 FOREIGN KEY
(CUSTOMERID) REFERENCES CUSTOMER_TABLE (CUSTOMERID)
ON DELETE CASCADE ON UPDATE NO ACTION
ENFORCED ENABLE QUERY OPTIMIZATION )

Từ các mệnh đề trên, rõ ràng rằng bằng cách lưu trữ một đối tượng dữ liệu của ứng dụng dưới dạng XML, thì các lược đồ quan hệ đơn giản hóa rất nhiều. Hơn nữa, việc cơ sở hạ tầng vẫn là quan hệ cho phép các dữ liệu XML sử dụng được các khả năng đã được minh chứng của các cơ sở dữ liệu quan hệ, ví dụ như các triggers, các ràng buộc và các mối quan hệ khóa ngoài.

Vì rằng về mặt lôgic thì cột XML tỏ ra giống như cột VARCHAR, CLOB, hoặc BLOB, nên các câu lệnh INSERT cũng tương tự.

insert into CUSTOMER_TABLE values('hardeep',
'<Customer customerid="hardeep" firstname="hardeep" lastname="singh"/>')

Hoặc nếu bạn chèn vào từ một chương trình Java:

Liệt kê 2. Chèn vào từ một chương trình Java
String insertsql= "insert into PURCHASE_TABLE values(?,?)";
PreparedStatement iStmt=connection.prepareStatement(insertsql);
File inputfile= new File(filename); //filename is the path of the XML file
long filesize=inputfile.length();
BufferedReader in = new BufferedReader(new FileReader(inputfile));
iStmt.setCharacterStream(1,in,(int)filesize);
int rc= iStmt.executeUpdate();

Để hiểu rõ hơn về lưu trữ lai, bạn hãy nhìn vào khung nhìn về cách dữ liệu XML dường như về lôgic được lưu giữ như thế nào trong cơ sở dữ liệu quan hệ.

Ghi chú: Ngay cả khi công nghệ lưu trữ vật lý cho XML có thể khác nhau với từng nhà cung cấp cơ sở dữ liệu quan hệ khác nhau, thì khung nhìn lôgic là như nhau.

Hình 2. Khung nhìn lôgic lưu trữ lai của DB2
Hình 2. Khung nhìn lôgic lưu trữ lai của DB2

Truy vấn XML

Khi mở rộng mô hình lược đồ cơ sở dữ liệu thì bạn có thể thấy các bảng quan hệ và các cột. Nếu bạn đào sâu vào một cột XML, thì lược đồ chuyển từ mô hình quan hệ sang mô hình phân cấp cho XML. Bây giờ, nếu bạn bỏ qua thực tế là có hai lược đồ: lược đồ quan hệ và lược đồ XML, và chỉ coi chúng là một mà thôi, thì sau đó bạn có thể điều hướng và truy vấn vào lược đồ thống nhất một cách tự nhiên hơn.

Trong lược đồ thống nhất trong Liệt kê 1, nếu bạn muốn lấy dữ liệu trong cột CUSTXML của CUSTOMER_TABLE, thì bạn phải xác định đường dẫn đến cột CUSTXML làm đích trong truy vấn của bạn.

SELECT CUSTXML FROM CUSTOMER_TABLE where customerid='hardeep';

Truy vấn này trả về dữ liệu khách hàng bên trong cột CUSTXML có tên là Hardeep.

Bây giờ hãy xem xét trường hợp bạn muốn dữ liệu khách hàng có họ (lastname) là Singh. Trong trường hợp này, bạn cần phải xác định đường dẫn đến thuộc tính LastName trong mỗi tài liệu XML (CUSTOMER_TABLE.CUSTXML/Customer/@LastName) và kiểm tra xem họ tên đó có phải là Singh hay không.

Trong một thế giới hoàn hảo, truy vấn sẽ là Select * from CUSTOMER_TABLE where CUSTXML/Customer/@lastname='singh'. Tuy nhiên, trong thế giới thực bạn cần phải xây dựng nó theo một cú pháp mà máy truy vấn cơ sở dữ liệu hiểu được. Một ngôn ngữ mới có tên là XQuery, có thể được sử dụng để truy vấn tài liệu XML, đã được đưa vào thế giới cơ sở dữ liệu. SQL đã được cập nhật để thêm chức năng mới có thể hiểu được ngôn ngữ mới này và bắc cầu nối hai thế giới lại với nhau. Vì vậy, một truy vấn tìm kiếm khách hàng có họ là Singh bây giờ sẽ như sau:

select CUSTXML from CUSTOMER_TABLE
where xmlexists ('$cust/Customer[@lastname= "singh" ]' passing CUSTXML AS "cust" )

Hoặc nếu bạn đã thực hiện cuộc gọi này từ một chương trình Java bằng cách sử dụng truy vấn có tham số (parametrised):

select CUSTXML from CUSTOMER_TABLE
where xmlexists ('$cust/Customer[@lastname= $lname ]'
passing CUSTXML AS "cust" , cast(? as VARCHAR(12)) as "lname")

Một khi bạn bỏ qua cú pháp kỳ cục của việc chuyển tham số cho các hàm SQL/XML, bạn sẽ thấy rằng đối với các truy vấn lai cơ bản trên dữ liệu quan hệ và XML, thì truy vấn XML chủ yếu là chứa các câu lệnh XPath. Điều này khá giống với những gì bạn đã làm ở tầng ứng dụng (trong Phần 1) đối với mô hình dữ liệu XML, ở đây phần lớn mã của bạn đã thực hiện các cuộc gọi XPath đến lớp bao gói (wrapper) mô hình đối tượng tài liệu (DOM) để truy vấn và thao tác dữ liệu XML.

Lưu ý: Trong Viper phiên bản 2, một số đơn giản hóa đã được thực hiện liên quan đến chuyển tham số cho một số hàm SQL/XML. Ví dụ: Trong truy vấn trước, mệnh đề chuyển tham số XMLExists không phải chỉ rõ cột CUSTXML.

select CUSTXML from CUSTOMER_TABLE
where xmlexists ('$CUSTXML/Customer[@lastname= $lname ]'
passing cast(? as VARCHAR(12)) as "lname")

Đẩy logic ứng dụng sang cơ sở dữ liệu

XQuery có tất cả các chức năng thô sơ của hầu hết các ngôn ngữ bậc cao (các câu lệnh if-then-else, for, các biến, các hàm và các toán tử số học). Điều này làm cho có thể nhúng logic nghiệp vụ bên trong truy vấn. Thêm nữa, nó có rất nhiều chức năng chung ánh xạ đến XSLT làm cho có thể không chỉ truy vấn mà còn biến đổi đầu ra XML ngay trong cơ sở dữ liệu.

Hãy lấy ví dụ Customer cho mô hình dữ liệu XML từ phần 1.

<Customer customerid ="" firstname="" lastname="" >
<Items><Item ID="" description="" purchaseDate="" price="" /></Items>
</Customer>

Thay thế mã ứng dụng bằng truy vấn DB2

Thay vì việc hợp nhất các dữ liệu XML từ hai bảng trong tầng ứng dụng, bạn có thể làm điều tương tự trong cơ sở dữ liệu bằng cách sử dụng một truy vấn SQL/XML đơn lẻ. Một phép nối một - nhiều của CUSTOMER_TABLE.CUSTXML/Customer/@customerid với PURCHASE_TABLE.ITEMXML/Customer/@customerid.

Hình 3. Phép nối hai cột XML
Hình 3. Phép nối hai cột XML
Liệt kê 3. Truy vấn hai cột XML
values(xmlquery('
for $Customer in db2-fn:xmlcolumn( "CUSTOMER_TABLE.CUSTXML")/Customer

where $Customer/@customerid= $customerid

return
<Customer customerid ="{$Customer/@customerid}"
firstname ="{$Customer/@firstname}" lastname ="{$Customer/@lastname}" >{

for $Customer0 in db2-fn:xmlcolumn("PURCHASE_TABLE.ITEMXML")/Customer
where $Customer0/@customerid= $Customer/@customerid
return $Customer0/Item

}</Customer>

' passing cast( ? AS varchar(255) ) as "customerid" ))

Kết quả XML cho tất cả các mục mà khách hàng hardeep đã mua sẽ là:

Hình 4. Kết quả truy vấn
Hình 4. Kết quả truy vấn

Trong truy vấn trên, bạn đã phải xây dựng phần tử Customer bên ngoài và thêm các thuộc tính từ dữ liệu cột CUSTXML. Viper 2 (phiên bản beta) của DB2 có sự hỗ trợ cho biểu thức cập nhật XQuery cho phép sửa đổi các tài liệu XML, như vậy không cần phải xây dựng phần tử Customer bên ngoài nữa. Thay vào đó, bạn có thể sử dụng chính phần tử này trong bảng khách hàng và chèn các mục từ bảng mua hàng như là các phần tử con.

Liệt kê 4. Truy vấn Viper 2 đối với hai cột XML
values(xmlquery('
for $Customer in db2-fn:xmlcolumn( "CUSTOMER_TABLE.CUSTXML")/Customer

let $items:=(<Items>{

for $Customer0 in db2-fn:xmlcolumn("PURCHASE_TABLE.ITEMXML")/Customer
where $Customer0/@customerid= $Customer/@customerid
return $Customer0/Item

}</Items>)

where $Customer/@customerid= $customerid

return
transform
copy $cust:=$Customer
modify(
do insert $items as last into $cust)
return $cust

' passing hardeep as "customerid" ))

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:=(<Items>{

for $Customer0 in db2-fn:xmlcolumn("PURCHASE_TABLE.ITEMXML")/Customer
where $Customer0/@customerid= $Customer/@customerid
return $Customer0/Item

}</Items>)

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.

<insurance>
<rate price="100" currency="$" rate=".02"/>
<rate price="500" currency="$" rate=".018"/>
<rate price="" currency="$" rate=".015"/>
</insurance>

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:=(
<Items>{
for $Customer0 in db2-fn:xmlcolumn("PURCHASE_TABLE.ITEMXML")/Customer

let $insurance:=<insurance currency="{($rate//rate[@price=""]/@currency)}">
{(
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
)

)
)}</insurance>

where $Customer0/@customerid= $Customer/@customerid

return
transform
copy $item:=$Customer0/Item
modify( do insert $insurance as last into $item)
return $item
}</Items>
)

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
    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ì:
    • 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.
    • create index custfname on customer_table(info) generate key
      using xmlpattern '/Customer/@firstname' as sql varchar(64)
    • 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.
    • 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.
    • 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.
    • 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

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management, SOA và dịch vụ Web
ArticleID=715536
ArticleTitle=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
publish-date=07112011