Автор: Пользователь скрыл имя, 01 Мая 2012 в 17:05, курсовая работа
Цель данной работы – исследовать способы хранения XML в базах данных, выявить их достоинства, недостатки, область применения. Для достижения данной цели необходимо решить следующие задачи:
а) выявить особенности языка XML;
б) определить и проанализировать существующие способы хранения XML;
в) определить область применения способов хранения;
г) определить существующие на практике критерии выбора способа хранения;
д) реализовать один из способов хранения XML в базе данных.
Введение
1 ОБЩЕСИСТЕМНЫЙ РАЗДЕЛ
1.1 Языки разметки
1.2 Язык разметки XML
1.2.1 Особенности XML
1.2.2 Синтаксис XML
1.2.3 Структура XML
1.3 Базы данных и системы управления базами данных
1.3.1 Общие понятия о базах данных и системах управления базами данных
1.3.2 Реляционные системы управления базами данных
1.4 Хранение XML
1.4.1 Задача хранения
1.4.2 Документы и данные
1.4.3 Способы хранения XML-документов
1.4.3.1 Хранение в файловой системе
1.4.3.2 Хранение в реляционной базе данных
1.4.3.3 Хранение в БД поддерживающей XML
1.4.3.4 Хранение в специализированных xml-серверах (истинных БД)
1.4.4 Критерии выбора способа хранения
1.5 Обзор готовых продуктов
2 СПЕЦИАЛЬНЫЙ РАЗДЕЛ
2.1 Постановка задачи
2.2 Выбор способа представления XML в РСУБД
2.3 Разработка схемы базы данных
2.4 Выбор средств реализации
2.4.1 Выбор системы управления базами данных
2.4.2 Выбор языка программирования
2.5 Разработка интерфейсного ПО
2.6 Инструкция по применению
ЗАКЛЮЧЕНИЕ
Список использованных источников
Приложение
Приложение А
Приложение Б
Основными достоинствами Apache считаются надёжность и гибкость конфигурации. Он позволяет подключать внешние модули для предоставления данных, использовать СУБД для аутентификации пользователей, модифицировать сообщения об ошибках и т. д. Последней стабильной версией этого ПО является Apache HTTP Server 2.2.15, который мы будем использовать.
В результате мы получаем следующий набор ПО:
СУБД MySQL 5.5;
язык программирования PHP 5.3.2;
веб-сервер Apache 2.2.15.
После того как пользователь ввел XML документ, необходимо представить его в виде дерева и пронумеровать вершины в соответствии с методом вложенных множеств.
Для нумерации узлов XML документа применим алгоритм обхода дерева в глубину. Для этого воспользуемся расширением php xml_parser. Для реализации стека мной был применен класс STACK2 из репозитория PEAR, реализованный в модуле stack2.class.php (смотри Приложение А). Этот класс моделирует стек на основе ассоциативных массивов. Рассмотрим основные методы данного класса, используемые мной для разработки приложения.
top() – возвращает верхний элемент стека, без извлечения из стека;
pop() - возвращает верхний элемент стека, с извлечением его из стека;
push() – добавляет элемент в стек;
is_epmty() – проверяет, пуст ли стек.
Расширение xml parser просматривается строчку за строчкой XML документ. Когда парсер встречает открывающий тэг, закрывающий тэг или содержимое элемента вызываются функции определенные программистом:
startElement($parser, $name, $attrs) – при обработке открывающего тэга;
endElement($parser, $name) – при обработке закрывающего тэга;
contents($parser, $data) – при обработке содержимого элемента. Алгоритм работы подпрограммы нумерации вершин дерева выглядит следующим образом:
Начало
Счетчик = 0
Пока не конец документа
Получаем следующий элемент документа
Если обнаружен открывающий тэг
Сохранить в массив имя тэга, атрибуты, значение счетчика
Сохранить массив в стек
Счетчик = Счетчик + 1
Все если
Если обнаружен закрывающий тэг
Массив = извлечь верхний элемент стека №1
Добавить в Массив значение счетчика
Записать массив в БД
Все если
Если обнаружено содержимое элемента
Массив = Извлечь верхний элемент стек
Добавить в массив значение элемента
Все если
Все пока
Конец
Структура массива используемого в программе аналогична структуре записи в таблице базы данных. То есть массив состоит из элементов nodeName, nodeValue, nodeLeft_id, nodeRight_id, attrList. В поле attrList атрибуты заносятся в виде «имя» => «значение». Для сохранения элементов массива в БД достаточно получить по очереди все его элементы и сохранить их в одноименных столбцах таблицы базы данных.
Теперь разработаем скрипт на языке SQL, создающий базу данных для хранения XML.
CREATE DATABASE IF NOT EXISTS `schemaXML` DEFAULT CHARACTER SET utf8 ;
use `schemaXML`;
DROP TABLE IF EXISTS `schemaXML`.`nodesXML`;
CREATE TABLE `schemaXML`.`nodesXML`
(
`node_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`doc_id` INT UNSIGNED NOT NULL,
`nodeName` VARCHAR(64),
`nodeValue` VARCHAR(64),
`nodeLeft_id` INT UNSIGNED NOT NULL,
`nodeRight_id` INT UNSIGNED NOT NULL,
`attrList` VARCHAR(255),
PRIMARY KEY(`node_id`),
KEY(`doc_id`),
KEY(`nodeName`),
KEY(`nodeValue`),
KEY(`attrList`)
) Engine = InnoDB;
Этот скрипт создает таблицу со следующими полями:
`node_id` - идентификатор элемента, не может быть пустым, тип счетчик, максимальное значение 232;
`doc_id` - идентификатор документа, числовой тип, максимальное значение 232;
`nodeName` - имя элемента, текстовое поле, максимальная длинна 64 символа;
`nodeValue` - значение элемента, текстовое поле, максимальная длинна 64 символа;
`nodeLeft_id` - левый номер, числовой тип, максимальное значение 232;
`nodeRight_id` - правый номер, числовой тип, максимальное значение 232;
`attrList` - список атрибутов, текстовое поле, максимальная длинна 255 символов;
Поскольку для реализации метода вложенных множеств нам необходима поддержка механизма транзакций, то в качестве движка базы данных выберем InnoDB.
Для взаимодействия с базой данных будем использовать расширение mysqli, которое пришло на смену устаревшему mysql. MySQLi (MySQL Improved) — расширение драйвера реляционных баз данных, используемого в языке программирования PHP для предоставления доступа к базам данных MySQL. По сравнению с прежними разработками, расширение MySQLi предоставляет различные улучшения, наиболее существенными из которых являются:
объектно-ориентированный интерфейс;
поддержка транзакций;
расширенная поддержка отладки.
Для взаимодействия с базой данных, к ней необходимо подключиться используя параметры соединения, указанные в конфигурационном файле сonfig.conf (смотри Приложение Б). Подключение производится вызовом конструктора класса mysqli:
$mysqli=new mysqli($cfg['host'],$cfg[‘user
В качестве параметров соединения конструктору класса mysqli передаются:
$cfg['host'] – имя или адрес сервера;
$cfg[‘user’] – имя пользователя;
$ cfg ['password'] – пароль пользователя;
$cfg['db'] – база данных для подключения.
Запросы к базе данных осуществляются на языке SQL, с использованием метода $mysqli->query ($query)класс mysqli. В качестве параметра этому методу передается строка с запросом на языке SQL.
После того как процедура сохранения XML в базе данных разработана, необходимо обеспечить извлечение XML из базы данных. Для этого из базы данных извлекаются записи со значением столбца doc_id, равным значению идентификатора документа, введенного пользователем. Причем записи извлекаются в порядке следования левых и правых номеров. Чтобы получить документ с номером $doc_id целиком используется запрос на языке SQL вида:
select concat('<',nodeName,' ',attrList,'> ', nodeValue) as cont, nodeLeft_id from nodesXML where doc_id='$doc_id' union select concat('</',nodeName,'>'), nodeRIght_id as nr from nodesXML where doc_id='$doc_id' order by 2";
При этом из базы данных извлекается уже готовый XML документ, который остается лишь отформатировать.
Для форматирования и отображения xml документа используется класс XML_Beautifier, а в частности его метод formatString($str), которому в качестве параметра передается строка неформатированного xml документа, а возвращается отформатированный XML документ (смотри приложение А). В данном приложении также предусмотрена возможность удаления документа целиком. Для этого используется следующий запрос с СУБД:
delete from nodesXML where doc_id='$doc_id'.
При этом удаляется документ с номером $doc_id.
Далее необходимо реализовать типовые запросы к СУБД. Для демонстрации результатов запросов разработаем XML документ следующего вида:
<miniShop>
<goods id='1'>
<type>motherboard</type>
<manufacturer>
<item>asus</item>
<item>acer</item>
<item id='GB'>GIGABYTE</item>
</manufacturer>
<model>NMX-300j</model>
<price currency='USD'>100</price>
</goods>
<goods id='2'>
<type>cpu</type>
<manufacturer>INTEL</
<model>E-230</model>
<price currency='USD'>1000</price>
<discount amount='0.07'/>
</goods>
</miniShop>.
В данном документе храниться информация о товарах некоторого магазина.
XML состоит из следующих элементов:
goods - товар с уникальным идентификатором (инвентарным номером);
type – тип товара;
manufacturer – производители товара;
item – каждый конкретный производитель товара;
model – модель товара;
price – цена товара, с указанием валюты;
discount – скидка на товар.
Типичной задачей для обработки XML является добавление потомков к какой либо вершине. В нашем приложении для примера можно добавлять ко всем товарам скидку. Для этого необходимо:
определить левый и правый номера каждого товара;
увеличить на два все левые и правые номера всех элементов, большие чем левый номер товара;
вставить новый элемент с левым номером на единицу большим, чем у предка и правым, большим на 2.
Все эти действия выполняются с помощью следующих запросов:
start transaction;
select nodeLeft_id, nodeRight_id from nodesXML where nodeName='goods' and doc_id='$doc_id';
update nodesXML set nodeRight_id=nodeRight_id+'2' where nodeRight_id > '{$row['nodeLeft_id']}';
update nodesXML set nodeLeft_id=nodeLeft_id+'2' where nodeLeft_id > '$parent_left';
insert into nodesXML values ('0','$'doc_id','discount','',
commit;
Для обеспечения целостности данных используется механизм транзакций. Транзакция начинается с запроса start transaction, и завершается запросом commit.
Не менее важной задачей при обработке XML является удаление потомков какой-либо вершины. В разработанном приложении демонстрируется возможность удаления всех потомков элемента “goods” с именем скидка “discount”(те есть удаление скидок на товар). Для этого необходимо:
определить левый и правый номера каждого товара;
удалить все дочерние элементы с именем “discount”;
уменьшить все левые и правые номера всех элементов на два, большие чем левый номер товара;
Все эти действия выполняются с помощью следующих запросов:
select nodeLeft_id, nodeRight_id from nodesXML where nodeName='goods' and doc_id='doc_id';
start transaction;
delete from nodesXML where doc_id='$doc_id' and nodeName='discount' and nodeLeft_id > '$parent_left' and nodeRight_id < '$parent_right';
update nodesXML set nodeRight_id=nodeRight_id-'2' where nodeRight_id > '$parent_left';
update nodesXML set nodeLeft_id=nodeLeft_id-'2' where nodeLeft_id > '$parent_left';
commit;
При выполнении данных запросов также используется механизм транзакций.
В приложении реализована возможность изменять значения отдельных элементов, без извлечения всего документа, а именно можно изменять стоимость товаров с известным значением атрибута id. Для этого необходимо найти элемент goods по известному id, затем найти дочерний элемент price и изменить его значение. Все эти действия выполняются с помощью следующих запросов:
Информация о работе Методы хранения XML в реляционных базах данных