МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ» (ФГБОУ ВПО «КубГУ») Кафедра вычислительных технологий Хранение Р-ГРАФОВ в базе данных Памбукян А.А Краснодар 2014 СОДЕРЖАНИЕ ВВЕДЕНИЕ .............................................................................................................. 2 1. Основные понятия баз данных .......................................................................... 3 1.1 Понятие ключа в базах данных ............................................................... 4 1.2 Иерархические структуры данных в реляционных БД ......................... 5 2. Общее представление SQL ................................................................................. 7 3. Организация хранения P – графов в реляционной БД .................................... 7 3.1 Построение ER - диаграммы «сущность - связь» для хранения P графов ................................................................................................................. 8 3.2 Генерация программного кода на основе ER – диаграммы ................. 10 3.3 Пример составления запросов для занесения данных в таблицы ........ 11 3.4 Решение задачи о масштабируемости P – графов. ................................ 12 3.5 Внедрение проекта на сайт кафедры....................................................... 13 ЗАКЛЮЧЕНИЕ ..................................................................................................... 15 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ........................................... 16 ПРИЛОЖЕНИЕ А. Код программы .................................................................... 17 ВВЕДЕНИЕ 2 Для обеспечения необходима эффективности соответствующая информационных организация данных. процессов Проблема моделирования данных связана с таким представлением данных, которое наиболее естественно отражает реальный мир и может поддерживаться компьютерами. В настоящее время в самых различных областях широкое распространение получила разработка баз данных Целью данной проектирования баз курсовой работы данных, включая является изучение принципы основ построения на концептуальном, логическом и физическом уровнях. А также применение полученных знаний для организации хранения особого вида графовых масштабируемых структур (P – графов). В список основных задач для достижения поставленной цели входит: создание HTML-каркаса (клиента) для работы с пользователем разработка PHP-скрипта (сервера) для работы с запросами, поступающими от клиента. создание базы данных mysql при помощи денвера для хранения p графов. Работа выполнена в рамках научно-исследовательского проекта КубГУ «Разработка и реализация информационно-аналитической среды, предназначенной для исследования и проектирования информационнокоммуникационных систем». 1. Основные понятия баз данных База данных - собрание записей, интегрированных в некоторые структуры.Записью в базах данных называют минимальную уникально 3 идентифицируемую единицу независимого хранения данных, образованную иерархией полей. Поле записи – именованный элемент данных, являющийся частью структуры записи базы данных или файла. Известны три разновидности структуры данных: иерархическая, сетевая и табличная. Соответственно по признаку структуры базы данных делятся на иерархические БД, сетевые БД и реляционные БД (наиболее распространенные). Хранение P-графов в данной работе также осуществляется в реляционной БД. Каждая таблица реляционной БД представляется как совокупность строк и столбцов, где строки соответствуют экземпляру объекта, конкретному событию или явлению, а столбцы - атрибутам (признакам, характеристикам, параметрам) объекта, события, явления. Одно из важнейших достоинств реляционных баз данных - возможность хранения логически сгруппированных данных в разных таблицах и объединение их в единую базу путем задания связей между ними. Такая организация данных позволяет уменьшить избыточность хранимых данных, упрощает их ввод и организацию запросов и отчетов. 1.1 Понятие ключа в базах данных Ключ или потенциальный ключ – это минимальный набор атрибутов, по значениям которых можно однозначно выбрать требуемый экземпляр сущности. Минимальность означает, что исключение из набора любого атрибута не позволяет идентифицировать сущность по оставшимся. Ключи можно разделить по признаку общности как: - Простой – сформирован из значений единственного поля, которые однозначно определяют каждую запись. - Составной – сформирован из значений нескольких полей. 4 По способу возникновения: - Естественный – основан на уже существующем поле. - Суррогатный – основан на добавленном искусственным путем отдельном поле для однозначной идентификации. - Интеллектуальный ключ – основан на естественном ключе путем добавления дополнительного поля. По ограничению целостности данных: - Первичный ключ – служит как ограничение целостности в рамках одной таблицы для однозначной идентификации, конкретно поле первичного ключа не может повторяться или быть пустым. Есть множество желательных (не обязательно требуемых) характеристик первичного ключа: Первичный ключ не должен иметь смыслового содержания, то есть он не должен описывать характеристики сущности. Значение первичного ключа никогда не должно меняться. Первичный ключ должен состоять из минимально возможного числа атрибутов. Легче управлять уникальными значениями, если они являются числовыми. - Внешний ключ (вторичный) – служит как ограничение целостности связей нескольких таблиц, конкретно подчиненная таблица не может ссылаться на несуществующие записи главной таблицы (что позволяет строить целостные модели данных). 1.2 Иерархические структуры данных в реляционных БД Рассмотрим некоторые варианты представления иерархических структур в реляционных БД. Наиболее общим случаем является дерево с неограниченным уровнем вложенности и неограниченным количеством потомков. Для 5 хранения такого рода иерархии необходимо добавить в описание сущности дополнительное поле – ссылку на первичный ключ предка. Такой способ организации иерархии является самым распространенным и универсальным. Однако ему присущи следующие недостатки: Необходимость рекурсивных запросов для получения полного пути от произвольного элемента до корня дерева. Сложность вычисления уровня вложенности произвольного элемента. Сложность получения всех (в том числе и не прямых) потомков данного узла. Следующей по степени универсальности является иерархия с неограниченным числом уровней вложенности и конечным числом потомков элемента иерархии. Ограничение количества потомков позволяет хранить данные в следующем виде. o Ссылка на предка o Информация о первом элементе уровня иерархии o Информация о втором элементе уровня иерархии o … o Информация о n-ном элементе уровня иерархии, где n – максимальное количество потомков Ссылка на предка содержит в себе ссылку на запись, хранящую информацию о предыдущем уровне иерархии и смещение (номер столбца) с описанием родителя. Больших преимуществ использования такой структуры нет, так как при изменении максимального количества потомков одного узла придется добавлять еще один столбец таблицы, что крайне неудобно. Последняя из видов иерархии – иерархия с ограниченной вложенностью и ограниченным числом потомков. В данном типе иерархии при определенной организации первичного ключа можно существенно упростить работу с иерархией. Для хранения данного вида иерархии 6 можно использовать ранее описанные структуры иерархий с неограниченной вложенностью и количеством потомков и иерархий с ограниченным количеством уровней и неограниченным числом потомков. 2. Общее представление SQL Язык SQL (Structured Query Lanquage) - стандартный язык, используемый для связи с такими системами управления реляционными базами данных, как Oracle, INGRES, Informix, Sybase, SQLbase, Microsoft SQL Server, DB2 (СУБД самой IBM), продуктами SQL/DC, Paradox, Access, Approach и многими другими. Выделяются следующие подъязыки SQL: - Язык определения данных (ЯОД). Он же Data Definition Language (DDL). Определяет структуру базы, задает пользователей, хранимые объекты и привилегии доступа к ним. - Язык манипулирования данными (ЯМД). Он же Data Manipulation Language (DML). Вставляет, обновляет и удаляет данные и выполняет запросы к ним. Язык управления данными (транзакциями) Data Control Language (DCL). 3. Организация хранения P – графов в реляционной БД Известно, что P – графы – это особый вид графовых структур, которые используются для моделирования различных систем. Объектами моделирования могут являться вычислительные системы и их компоненты. Моделируемы объекты, в свою очередь, состоят из элементов (блоков, узлов) и связей между ними. Вершина графа – это и есть элемент, а ребро или дуга графа – связь. Так как связей между блоками может быть много, у вершин выделяют входные и выходные полюсы. Таким образом, 7 соединяются не вершина с вершиной, как в простом графе, а полюс вершины с полюсом через вспомогательные элементы. То есть получаются новые структуры – P – графы. Сам P – граф, как и его вершина, имеет полюсы. Полюса графа посредством дуг и вспомогательных элементов могут соединяться с другими графами. Такой граф в дальнейшем можно рассматривать как вершину, т.е. для достижения цели необходимо реализовать хранение масштабируемой структуры. Пример P – графа изображен на рисунке 1. Рисунок 1 - Пример Р – графа В данной курсовой работе хранение P – графа в базе данных реализовано в трехтабличном представлении: одна таблица содержит узлы графа, вторая – его полюса, а третья – связи между полюсами. Связи сохраняются в виде начальной и конечной точек. 3.1 Построение ER - диаграммы «сущность - связь» для хранения P графов 8 ERwin - средство разработки структуры базы данных (БД). ERwin сочетает графический интерфейс Windows, инструменты для построения ER-диаграмм, редакторы для создания логического и физического описания модели данных и прозрачную поддержку ведущих реляционных СУБД и настольных баз данных. С помощью ERwin можно создавать или проводить обратное проектирование (реинжиниринг) баз данных. Этот программный продукт - лидер среди средств моделирования баз данных и хранилищ данных. Сущность - это множество индивидуальных объектов - экземпляров, причем все эти объекты являются различными. Связь - это функциональная зависимость между сущностями. Каждая сущность обладает атрибутами. Атрибут - это свойство объекта, характеризующее его экземпляр. Общепринятым видом графического изображения реляционной модели данных является ER-диаграмма. На такой диаграмме сущности (таблицы) изображаются прямоугольниками, возможно, соединенными между собой линиями (связями). Такое графическое представление облегчает восприятие структуры базы данных по сравнению с текстовым описанием. В нашем случае для реализации задачи хранения P – графов была построена ER – диаграмма, представленная на рисунке 2. В роли сущностей выступают вершины, полюса и связи между полюсами. На диаграмме сущность изображается прямоугольником. Горизонтальная линия прямоугольника разделяет атрибуты сущности на составляющие первичный ключ в верхней части, и прочие (не входящие в первичный ключ) - в нижней части. 9 Первичный ключ образует содержит Атрибуты Связь 3.2 Генерация программного кода на основе ER – диаграммы CREATE TABLE Node ( ID_node INTEGER NOT NULL, Name_Node VARCHAR(15) NULL, ID_Parent_node CHAR(18) NULL, Name_Parent_node VARCHAR(15) NULL ); ALTER TABLE Node ADD PRIMARY KEY (ID_node); CREATE TABLE Pole ( ID_pole INTEGER NOT NULL, Name_Pole VARCHAR(15) NULL, Pole_Type VARCHAR(5) NULL, ID_node INTEGER NOT NULL ); ALTER TABLE Pole ADD PRIMARY KEY (ID_pole); CREATE TABLE Link ( ID_Link INTEGER NOT NULL, ID_poleOut INTEGER NOT NULL, ID_poleIn INTEGER NOT NULL ); 10 ALTER TABLE Link ADD PRIMARY KEY (ID_Link); ALTER TABLE Pole ADD FOREIGN KEY R_15 (ID_node) REFERENCES Node (ID_node); ALTER TABLE Link ADD FOREIGN KEY R_13 (ID_poleOut) REFERENCES Pole (ID_pole); ALTER TABLE Link ADD FOREIGN KEY R_14 (ID_poleOut) REFERENCES Pole (ID_pole); ALTER TABLE Link ADD FOREIGN KEY R_16 (ID_poleIn) REFERENCES Pole (ID_pole); 3.3 Пример составления запросов для занесения данных в таблицы Рассмотрим добавление в базу данных графа – константы дерево (tree) Добавление данных в таблицу с узлами (node): insert into node values('tree', null, null) insert into node values('v1', 1, 'tree') insert into node values('v2', 2, 'v1') insert into node values('v3', 2, 'v1') Добавление данных в таблицу с полюсами: insert into pole values('tree', 'pi',null) insert into pole values('v1','p1','out') insert into pole values('v1','p2','out') insert into pole values('v2','p3','in') insert into pole values('v3','p4','in') Добавление данных в таблицу со связями: insert into link values(1,2,3) insert into link values(2,2,4) insert into link values(3,1,6) insert into link values(4,7,8) 11 Введенные данные графически проиллюстрированы на рисунке 3 Рисунок 3 – граф-константа дерево 3.4 Решение задачи о масштабируемости P – графов. Введем новую графовую константу «star» (звезда) в нашу базу данных. Предположим, что наш новый граф является родителем для уже существующего графа «tree» (дерево). Тогда, чтобы отразить это в нашей базе, потребуется всего лишь одна команда по обновлению записи: UPDATE `node` WHERE ‘ID_node’ = 1 `ID_Parent_node`=5,`Name_Parent_node`='star' Для наглядности, отобразим внесенные изменения на рисунке 4 12 Новый узел графа «star» Рисунок 4 – представление масштабируемости P – графа 3.5 Внедрение проекта на сайт кафедры Этапы внедрения проекта на сайт кафедры: 1) Добавление таблиц в базу данных dbhttp0699 , расположенную на хостинге kubannet , с помощбю веб – приложения phpMyAdmin. Скриншот представлен на рисунке 5. 2) Загрузка ftp – файлов на сервер с помощью бесплатного FTP – менеджера FileZilla 3) Добавление ссылки http://www.cs.kubsu.ru/nastya2/Pgraph.php на сайт кафедры посредством специальной системы управления содержимым Joomla, рисунок 6. На рисунке 7 можно увидеть содержимое ссылки с курсовым проектом. 13 Рисунок 5 – Добавление таблиц в базу данных Рисунок 6 – Ссылка на курсовой проект Рисунок 7 – содержимое ссылки http://www.cs.kubsu.ru/nastya2/Pgraph.php 14 ЗАКЛЮЧЕНИЕ В ходе работы над курсовым проектом были освоены основные принципы построения баз данных, организовано хранение P – графов в реляционной базе, решена задача масштабируемости P – графов. Разработан программный код для работы с пользователем (демонстрации базы данных). Данный проект был внедрен на сайт кафедры вычислительных технологий Кубанского Государственного университета. 15 СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 1. Селко Д. SQL для профессионалов: продвинутое программирование на SQL // «ЛОРИ», - М.: 2004, - 103 С. 2. Селко Д. Стиль программирования на SQL // «Русская Редакция», - М.: 2006, - с.5. 3. Голованов М. Иерархические структуры данных в реляционных БД. [Электронный ресурс] URL: http://www.rsdn.ru/article/db/Hierarchy.xml#EZ, [28.01.2002] 16 ПРИЛОЖЕНИЕ А Код программы Сторона клиента: <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <title>Программа добавления данных</title> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></scri pt> <script type="text/javascript" src="jquery-1.7.1.min.js"></script> </head> <body> <h2 align="center">Хранение P - графов в базе данных</h2> <p>P-графы - это особый вид графовых структур, которые используются для моделирования различных систем. Объектами моделирования могут являться вычислительные системы и их компоненты, а также компьютерные сети, их узлы и линии связи.</p> <form method="POST" align="left" action="PG_insert.php"> <input type="submit" id="Nodes" name="Nodes" value="Получить список всех узлов" /></br> </br> <input type="submit" id="Poles" name="Poles" value="Получить список всех полюсов" /></br> </br> <input type="submit" id="Links" name="Links" value="Получить список всех связей" /></br> </br> <input type="submit" id="Join" name="Join" value="Объединить" /></br> </br> </form> </body> </html> Сторона сервера: <html> <head> <title>Запросить данные из БД</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> </head> 17 <body> <?php $link = mysql_connect('localhost', 'root', '') or die('Не удалось соединиться: ' . mysql_error()); mysql_select_db('test') or die('Не удалось выбрать базу данных'); $qr_resNode = mysql_query("select * from node"); $qr_resPole = mysql_query("select * from pole order by Name_Pole"); $qr_resLinks = mysql_query("select * from link"); $qr_resjJoin = mysql_query("select * from node natural join pole"); if(isset($_POST['Nodes'])) { echo '<table border = "1">'. '<thead>'. '<tr>'. '<th>ID узла</th>'. '<th>Имя узла</th>'. '<th>ID родителя</th>'. '<th>Имя родителя</th>'. '</tr>'. '</thead>'; while($data = mysql_fetch_array($qr_resNode)) { echo '<tr>'. '<td>' . $data['ID_node'] . '</td>'. '<td>' . $data['Name_Node'] . '</td>'. '<td>' . $data['ID_Parent_node'] . '</td>'. '<td>' . $data['Name_Parent_node'] . '</td>'; } echo '</table>'; } if(isset($_POST['Poles'])) { echo '<table border = "1">'. '<thead>'. '<tr>'. '<th>ID полсюса</th>'. '<th>Тип полюса</th>'. '<th>Имя полюса</th>'. '<th> Принадлежит вершине с ID</th>'. '</tr>'. '</thead>'; 18 while($data = mysql_fetch_array($qr_resPole)) { echo '<tr>'. '<td>' . $data['ID_pole'] . '</td>'. '<td>' . $data['Pole_Type'] . '</td>'. '<td>' . $data['Name_Pole'] . '</td>'. '<td>' . $data['ID_node'].'</td>'; } echo '</table>'; } if(isset($_POST['Links'])) { echo '<table border = "1">'. '<thead>'. '<tr>'. '<th>ID связи</th>'. '<th>ID выходного полюса</th>'. '<th>ID входного поллюса</th>'. '</tr>'. '</thead>'; while($data = mysql_fetch_array($qr_resLinks)) { echo '<tr>'. '<td>' . $data['ID_Link'] . '</td>'. '<td>' . $data['ID_poleOut'] . '</td>'. '<td>' . $data['ID_poleIn'] . '</td>'; } echo '</table>'; } if(isset($_POST['Join'])) { echo '<table border = "1">'. '<thead>'. '<tr>'. '<th>ID узла</th>'. '<th>Имя узла</th>'. '<th>ID родителя</th>'. '<th>Имя родителя</th>'. '<th>ID полсюса</th>'. '<th>Тип полюса</th>'. '<th>Имя полюса</th>'. '</tr>'. 19 '</thead>'; while($data = mysql_fetch_array($qr_resjJoin)) { echo '<tr>'. '<td>' . $data['ID_node'] . '</td>'. '<td>' . $data['Name_Node'] . '</td>'. '<td>' . $data['ID_Parent_node'] . '</td>'. '<td>' . $data['Name_Parent_node'] . '</td>'. '<td>' . $data['ID_pole'] . '</td>'. '<td>' . $data['Pole_Type'] . '</td>'. '<td>' . $data['Name_Pole'] . '</td>'; } } <p> <a href="Pgraph.php">Вернуться к списку</a> </p> </body> </html> 20