PureXML в DB2 9: Яким способом запитувати XML-дані? (Исходники), Інтеграція додатків і даних, Бази даних, статті

Введення


Вбудована підтримка XML в DB2 пропонує ефективні та різнобічні можливості для управління XML-даними. DB2 зберігає і обробляє XML у власному ієрархічному форматі, уникаючи обмежень по продуктивності і гнучкості, наявних при запису XML у вигляді тексту в CLOB-полях або при відображенні в реляційні таблиці. На відміну від баз даних, що працюють тільки з XML-даними, DB2 V9 забезпечує також плавну інтеграцію реляційних даних і XML-даних в одній базі даних, навіть в одному рядку таблиці. Ця гнучкість відображається в підтримці мови, що дозволяє звертатися до реляційних даними, XML-даними або обом типам одночасно. XML-дані можна запитувати будь-яким з наступних чотирьох способів:



Введення в запити XML-даних з використанням XQuery і SQL / XML вже публікувалося в статтях: “Запит DB2 XML-даних з використанням SQL” і “Запит DB2 XML-даних з використанням XQuery”. Ми припускаємо, що ви знайомі з концепціями, представленими в цих двох статтях. Зверніть увагу на те, що XPath – це підмножина мови XQuery, тому він неявним чином присутня скрізь, де ми згадуємо XQuery. Можливо, ви вже знаєте XPath, якщо використовували таблиці стилів XSLT або шляху до місцерозташування в DB2 XML Extender. У багатьох ситуаціях мови XPath достатньо для вилучення XML-значень або висловлювання XML-предикатів, тому ви можете почати працювати з XPath, навіть якщо ще не знайомі з усіма додатковими функціональними можливостями XQuery.


DB2 дозволяє використовувати всі ці варіанти для максимізації продуктивності та адаптації запитів даних до вимог ваших додатків. У даній статті ми розглядаємо такі питання:



Давайте почнемо з резюме, а потім більш детально розглянемо кожен варіант і специфічні приклади.


Резюме та рекомендації


Безліч запитів можна записати на простому XQuery, SQL / XML або XQuery з вбудованим SQL. У певних випадках один з варіантів є інтуїтивно більш відповідним для вираження логіки програми, ніж інші. У загальному випадку “правильний” підхід до запиту XML-даних повинен вибиратися для конкретної ситуації з урахуванням вимог додатка та його характеристик. Однак ми можемо висловити наступні рекомендації.



Не залежно від обраної комбінації SQL і XQuery в одному вираженні, DB2 використовує єдиний гібридний компілятор для формування та оптимізації єдиного плану виконання для всього запиту без шкоди для продуктивності виконання запиту.


У наступній таблиці представлені переваги, властиві чотирьом варіантам запиту XML-даних.


Таблиця 1. Резюме











































































Простий SQL


SQL/XML


Простий XQuery


XQuery з вбудованим SQL / XML

XML-предикати ++ ++ ++
Реляційні предикати ++ ++ +
XML і реляційні предикати ++ ++
Об’єднання XML з реляційними даними ++ ++
Об’єднання XML з XML + ++ ++
Перетворення XML-даних o ++ ++
Вставка, оновлення, видалення ++ ++
Маркери параметрів + ++
Повнотекстовий пошук + ++ ++
Об’єднання і угруповання ++ o o
Виклики функцій ++ ++ ++

У наведеній вище таблиці “-” означає, що дана мова не підтримує цю функціональність, “+” означає, що функціональність підтримується, але може існувати ефективніший або зручний спосіб, “+ +” Позначає, що даний мова дуже добре підходить для вираження зазначеної функціональності, і, нарешті, “o” позначає, що, хоча функціональність і може бути виражена, але це робиться незграбно або не ефективно.


Тепер давайте визначимо деякі приблизні дані і таблиці, для того щоб можна було розглянути конкретні приклади запитів.


Зразкові таблиці і дані


Для обговорення варіантів запитів XML-даних ми використовуємо три таблиці, наведені нижче. Таблиця dept має два стовпці з назвами unitID і deptdoc. Кожен рядок таблиці dept описує один відділ вигаданої компанії. Стовпець unitID ідентифікує підрозділ, якому належить відділ (підрозділ може мати кілька відділів), а стовпець deptdoc містить XML-документ, що перераховують співробітників відділу. Таблиця project має один стовпець projectDoc з типом XML. Кожен рядок таблиці projectDoc містить XML-документ, що описує конкретний проект. Проект може охоплювати більше одного відділу. Для ілюстрації гібридних реляційних і XML-запитів, а також з’єднань (joins), є чиста реляційна таблиця unit, в якій міститься прізвище, менеджер і т.д. для кожного підрозділу. Підрозділ може мати кілька відділів.






create table dept( unitID char(8), deptdoc xml)
 

















unitID deptdoc
WWPR



<dept deptID=”PR27″>
<employee id=”901″>
<name>Jim Qu</name>
<phone>408 555 1212</phone>
</employee>
<employee id=”902″>
<name>Peter Pan</name>
<office>216</office>
</employee>
</dept>

WWPR



<dept deptID=”V15″>
<employee id=”673″>
<name>Matt Foreman</name>
<phone>416 891 7301</phone>
<poffice>216</office>
</employee>
<description>This dept supports sales world wide</description>
</dept>

S-USE





create table project(projectDoc xml)
 









projectDOC




<project ID=”P0001″>
<name>Hello World</name>
<deptID>PR27</deptID>
<manager>Peter Pan</manager>
</project>





<project ID=”P0009″>
<name>New Horizon</name>
<deptID>PR27</deptID>
<deptID>V15</deptID>
<manager>Matt Foreman</manager>
<description>This project is brand new</description>
</project>






create table unit( unitID char(8) primary key not null, name char(20), manager varchar(20),…)
/——-10——–20——–30——–40——–50——–60——–70——–80——–9/
/——– XML error: The previous line is longer than the max of 90 characters ———/






















unitID name manager
WWPR Worldwide Marketing Jim Qu
S-USE Sales US East Coast Tom Jones


Простий SQL


Простий SQL може використовуватися без застосування XPath або XQuery для читання повних документів без XML-предикатів. Це дуже зручно, коли додаток може ідентифікувати XML-документи для вилучення документів повністю на основі реляційних предикатів для однієї і тієї ж таблиці. Наприклад, Query 1 витягує всі документи про відділи для підрозділу “WWPR”.


Query 1





select deptdoc
from dept
where unitID = “WWPR”;

Аналогічно, Query 2 повертає XML-дані для всіх відділів, менеджером яких є Jim Qu.


Query 2





select deptdoc
from dept d, unit u
where d.unitID = u.unitID and u.manager= “Jim Qu”;

Очевидним недоліком є ​​неможливість вказівки предикатів по самим XML-даними або вилучення фрагментів XML-документа. У нашому прикладі простого SQL недостатньо для вибірки тільки відділу PR27 і повернення прізвищ співробітників.


Якщо запити не вимагають предикатів по XML-колонки і завжди повертають XML-документи повністю, простого SQL може бути достатньо. В цьому випадку можна було б зберігати XML просто в стовпцях VARCHAR або CLOB, підвищуючи продуктивність операцій вставки та вилучення документів повністю.


Без використання будь-якої підтримки SQL / XML або XQuery в DB2 V9 простий SQL все одно дозволяє записувати в запитах умови повнотекстового пошуку. За допомогою DB2 Net Search Extender можна створити повнотекстові індекси за XML-стовпцях для підтримки пошуку тексту по базовому ключовим словом аж до розширеного пошуку з морфологією, словником і нечітким пошуком (fuzzy search) на 37 мовах. Можна також обмежити текстовий пошук до певних розділів документа, визначених виразами path. Грунтуючись на пошуку по текстових індексам, Query 3 повертає всі документи відділів, що містять рядок “Sales” в будь-якому місці документа в / dept / description.


Query 3







select deptdoc
from dept
where CONTAINS(deptdoc,”SECTION(“/dept/description”) “sales” “)=1;


SQL / XML (XQuery / XPath, вбудований в SQL)


SQL / XML – це частина стандарту мови SQL, що визначає новий тип даних (XML) разом з функціями запиту, формування, перевірки коректності та перетворення XML-даних. DB2 V8 вже мала численні функції публікації SQL / XML, і користувачі можуть формувати XML з реляційних даних, використовуючи XMLELEMENT, XMLATTRIBUTE, XMLFOREST, XMLAGG, а також інші функції.


DB2 9 додає нові функції SQL / XML-запитів, включаючи предикати XMLQUERY, XMLTABLE і XMLEXISTS. Ці функції дозволяють користувачам вбудовувати XQuery або прості XPath-вирази в SQL-запити.


Як показано в Query 4, функція XMLQUERY зазвичай використовується в операторі select для вилучення XML-фрагментів з XML-стовпців, тоді як XMLEXISTS зазвичай використовується в операторі where для запису предикатів над XML-даними.


Query 4





select unitID, XMLQUERY(“for $e in $d/dept/employee return $e/name/text()”
passing d.deptdoc as “d”)
from dept d
where unitID LIKE “WW%” and
XMLEXISTS(“$d/dept[@deptID = “V15″]” passing d.deptdoc as “d”);

Цей приклад запиту використовує XMLEXISTS для вибору відділу V15 підрозділу “WW” і застосовує XMLQUERY для повернення прізвищ всіх співробітників з документа для цього відділу. Результат роботи наступний:







WWPR Matt Foreman

Цей запит також показує, як можна використовувати SQL / XML для запиту XML і реляційних даних інтегрованим способом. Оператор select витягує дані з обох типів стовпців (реляційних і XML), а оператор where містить реляційні і XML предикати. DB2 9.5 може використовувати XML-індекси і реляційні індекси одночасно для визначення цих предикатів і максимізації продуктивності запитів.


В DB2 9.5 можна записати цей запит ще простіше, опустивши оператор “passing” у функціях XMLEXISTS і XMLQUERY. Якщо передавати в XQuery тільки XML-стовпець “deptdoc”, можна просто посилатися в XQuery-запиті на стовпець як $ DEPTDOC без оператора “passing”. Це показано в Query 5.


Query 5





select unitID, XMLQUERY(“for $e in $DEPTDOC/dept/employee return $e/name/text()”)
from dept d
where unitID LIKE “WW%” and
XMLEXISTS(“$DEPTDOC/dept[@deptID = “V15″]”);

Цей самий запит можна записати з використанням функції XMLTABLE, як показано в Query 6. У цьому форматі ми вказуємо умови для обмеження вхідних даних і вилучення вихідних значень, які нам потрібні. В Query 6 XQuery-запит до функцій XMLTABLE ідентифікує співробітників, що працюють у відділі V15, а path-вираз в операторі COLUMNS (“name / text ()”) повертає їх прізвища. Результати роботи аналогічні Query 4 і 5.


Query 6





select d.unitID, T.name
from dept d, XMLTABLE(“$d/dept[@deptID=”V15″]/employee” passing d.deptdoc as “d”
COLUMNS
name varchar(50) path “name/text()” ) as T
where unitID LIKE “WW%”;

Переваги SQL / XML


Підхід SQL / XML має такі переваги:



Недоліки SQL / XML



XQuery як автономний мову


Давайте зробимо крок назад і задамо питання: що таке XQuery і навіщо він нам потрібен? Точно так само як SQL є мовою запитів, розробленим для реляційної моделі, XQuery є мовою, розробленим спеціально для запиту XML-даних. Оскільки XML-дані можуть дуже відрізнятися від реляційних даних, нам потрібна мова, призначений для ефективної роботи з XML-даними. Реляційні відносини є однорівневими, дуже структурованими, суворо типізований і неупорядкованими, в той час як XML-дані є впорядкованими, вкладеними, ієрархічними, не обов’язково типізований і часто нерегулярними і слабкоструктурованих. SQL не може працювати з ними, але XQuery розроблений саме для цього. Зокрема, XQuery розроблений для навігації по дереву XML-документа і для витягання XML-фрагментів, а також включає в себе вираження для створення, управління, ітерації по послідовності XML-елементів та формування нових XML-даних.


IBM розширила всі основні інтерфейси прикладного програмування DB2 (Application Programming Interfaces, API) для підтримки XQuery як першокласного мови, точно так само як і SQL. До них відносяться CLI / ODBC, вбудований SQL, JDBC і. NET. В результаті цього процесор командного рядка DB2 теж підтримує XQuery. Ви можете передавати XQuery-запити в існуючому вигляді (as-is), але повинні починати їх з ключового слова XQUERY для інформування DB2 про використання синтаксичного аналізатора XQuery, як показано в наступному прикладі.


Query 13





XQUERY
for $dept in db2-fn:xmlcolumn(“DEPT.DEPTDOC”)/dept
where $dept/@deptID=”PR27″
return $dept/employee/name;

Query 13 виконує ітерації по кожному елементу “dept” кожного документа department і повертає прізвища співробітників, які працюють у відділі PR27.


Переваги XQuery



Недоліки XQuery



XQuery з вбудованим SQL


Сам по собі XQuery дозволяє звертатися тільки до XML-даними. Це дуже добре, якщо ви оперує тільки з XML-даними, але недостатньо, якщо ваш додаток потребує комбінованому доступі до реляційних і XML-даними, використовуючи всю міць обох мов і моделей даних. Це можливо з SQL / XML, розглянутим вище в цій статті, шляхом вбудовування XQuery в SQL. Зворотне вбудовування (SQL в XQuery) відкриває додаткові можливості. Крім списку переваг і недоліків, розглянутих вище, важливі такі аспекти:


Переваги XQuery з вбудованим SQL



Недоліки XQuery з вбудованим SQL



Результати XML-запиту


Одним із моментів, про який потрібно знати, є те, що залежно від способу написання конкретного запиту DB2 може представляти результати запиту в різних форматах. Наприклад, простий XQuery повертає елементи (наприклад, елементи або фрагменти документів) в наборі даних з одним елементів на рядок, навіть якщо кілька елементів надходять з одного і того ж документа (рядки) бази даних. З іншого боку, SQL / XML може повертати кілька елементів в одному рядку, а не окремих рядках, при використанні функції XMLQUERY. В деяких випадках це може бути бажаним, а в деяких ні. Всі залежить від конкретного додатка. Давайте розглянемо приклади.


Query 23 і Query 24 запитують прізвища співробітників в документах dept. Query +23 написаний на SQL / XML, в той час як Query 24 написаний на XQuery.


Query 23





select XMLQUERY(“$d/dept/employee/name” passing deptdoc as “d”)
from dept;

Query 24





XQUERY db2-fn:xmlcolumn(“DEPT.DEPTDOC”)/dept/employee/name;

Query +23 повертає один рядок для кожного документу dept, і кожен рядок містить прізвища співробітників, які працюють в цьому відділі:








<name>Jim Qu</name> <name>Peter Pan </name>
<name>Matt Foreman</name>

Query 24, з іншого боку, повертає кожне прізвище в окремому рядку:










<name>Jim Qu</name>
<name>Peter Pan</name>
<name>Matt Foreman</name>

Результат Query 24 зазвичай більше підходить для використання в програмі, тому що надає по одному XML-значенням. Проте в цьому випадку невідомо, які прізвища надійшли з одного і того ж документа department. Результат роботи Query 23 містить цю інформацію, але може менше підходити для програми, оскільки може знадобитися розбиття рядків на окремі прізвища. Якщо програма використовує XML-аналізатор для прийому кожного рядка XML-результату з DB2, перший рядок з Query 21 буде відкинута синтаксичним аналізатором, тому що вона не є граматично правильним документом (відсутній один кореневої елемент). Вирішити проблему кореневого елемента можна шляхом додавання в Query 23 конструктора XMLELEMENT, як показано в Query 25.


Query 25





Select XMLELEMENT(name “employees”,
XMLQUERY(“$d/dept/employee/name” passing d.deptdoc as “d”))
from dept d;

Це змінює результат запиту таким чином, що кожен рядок буде граматично правильним XML-документом:










<employees><name>Jim Qu </name><name>Peter Pan </name></employees>
<employees><name>Matt Foreman</name></employees>
….

Згадайте, що Query 15 використовує оператор SQL values ​​і функцію XMLQUERY для дозволу передачі параметра в XQuery. Але результатом роботи Query +15 є один рядок, що містить прізвища всіх співробітників. Якщо краще отримати прізвище кожного співробітника в окремому рядку і є також необхідність у використанні маркерів параметрів, можна застосувати функцію XMLTABLE в Query 26.


Query 26





select X.*
from dept d, XMLTABLE(“for $dept in $d/dept
where $dept/@deptID = $z
return $dept/employee/name”
passing d.deptdoc as “d”, cast(? as varchar(10)) as “z”
COLUMNS
“name” XML PATH “.”) as X ;

Резюме


DB2 pureXML пропонує багатий набір варіантів запиту XML-даних. Ви будете вибирати варіант, який підходить для вас, грунтуючись на вимогах програми та його характеристиках. Якщо потрібно комбінувати реляційні і XML-дані, то кращим варіантом в більшості ситуацій буде SQL / XML. Зокрема, SQL / XML – це варіант, який дозволяє застосовувати маркери параметрів з XML-даними. Якщо є додатки, працюють тільки з XML-даними, хорошим вибором буде автономний XQuery, який може бути розширений вбудованим SQL для дозволу повнотекстового пошуку та активізації UDF-функцій. Розглянуті в даній статті приклади допоможуть вам прийняти обгрунтоване рішення. Ви можете використовувати шаблони запитів з даної статті в якості відправної точки для написання власних запитів до XML-даними.


Загальною рекомендацією є реалізація такого рівня складності в ваших запитах, який дійсно необхідний. Наприклад, визначено можливо мати XQuery з вбудованим SQL-запитом, які мають вбудований XQuery і т.д. Та наш досвід показує, що для написання бажаної логіки запиту вкладення кількох мов більш ніж на один рівень звичайно не потрібно. Тому ми рекомендуємо використовувати тільки один рівень вбудовування XQuery в SQL або навпаки.


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*