Разработка и анализ хранимой процедуры для получения глубины дерева связей таблицы и схемы базы данных
Представление хранимой процедуры для получения получения глубины дерева связей таблицы и схемы базы данных. Произведение анализа этой процедуры с помощью SQLDetective 4.3. Получение и анализ метрики кода и составление блок-схемы хранимой процедуры.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | статья |
Язык | русский |
Дата добавления | 31.07.2018 |
Размер файла | 708,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Разработка и анализ хранимой процедуры для получения глубины дерева связей таблицы и схемы базы данных
Рыбанов Александр Александрович
В статье представлена хранимая процедура для получения получения глубины дерева связей таблицы и схемы базы данных. Произведен анализ процедуры с помощью SQLDetective 4.3. Получены и проанализированны метрики кода и составлена блок-схема хранимой процедуры.
Похожие материалы
· Анализ навигационного меню образовательного сервиса с использованием метода сортировки карточек
· Проектирование навигационного меню сайта на основе метода сортировки карточек
· Анализ программ моделирующих транспортные потоки методом Саати
· Сравнительный анализ программных продуктов оценки инвестиционных проектов
· Сравнительный анализ библиотек, поддерживающих контрактное программирование
Анализ количественных метрик физических схем баз данных является актуальной задачей [4-6, 10, 12], так как база данных является ядром информационной системы.
Применение количественных метрик физических схем баз данных позволяет разработчикам [1-3, 8, 13]:
1. оценить сложность разработанной базы данных;
2. оценить общий объем работ по созданию базы данных;
3. оценить объем работ, выполненных каждым членом команды;
4. выбрать наилучшую схему базы данных из нескольких вариантов;
5. оценить сложность реализации базы данных.
Целью работы является повышение эффективности процесса анализа хранимых процедур с помощью CASE-средств (на примере хранимой процедуры для получения глубины дерева связей таблиц и схемы базы данных).
Хранимые процедуры являются более безопасными, чем обычные запросы, так, как позволяют повысить производительность и безопасность путем ограничения или вообще исключения доступа пользователей к таблицам базы данных.
Расчет физических характеристик физических схем баз данных рассмотрим на примере СУБД MySQL. Исходные данные для получения метрических характеристик MySQL базы данных хранятся в базе данных метаинформации - information_schema.
На основе метаданных Information_schema могут быть получены следующие метрики БД [7, 9, 11]: глубина дерева связей таблиц БД; глубина дерева связей схемы БД.
Глубина дерева связей таблицы - это расстояние от ее конкретной таблицы, до элемента самого нижнего уровня.
Глубина дерева связей схемы БД - это максимальное расстояние от её корневого элемента, до элемента самого нижнего уровня.
Для апробации предлагаемого подхода получения метрических характеристик была использованная база данных «sakila» (рис. 1) с сайта dev.mysql.com (http://dev.mysql.com/doc/sakila/en/sakila-structure.html).
Рис. 1. Физическая схема базы данных «sakila»
Метрические характеристики глубины дерева связей для таблиц базы данных «sakila» приведены в таблице 1.
хранимый процедура код данные
Таблица 1. Глубина дерева связей для таблиц базы данных «sakila»
Имя таблица |
Глубина дерева связей таблицы |
|
payment |
7 |
|
rental |
5 |
|
inventory |
5 |
|
staff |
4 |
|
store |
4 |
|
customer |
3 |
|
address |
2 |
|
film_category |
2 |
|
city |
1 |
|
film |
1 |
|
film_actor |
1 |
|
language |
0 |
|
actor |
0 |
Анализ метрических характеристик, представленных в таблице 1, показывает, что глубина дерева связей базы данных «sakila» равна 7.
Ниже приведен код инвариантной хранимой MySQL процедуры, позволяющей получать описанные выше метрики для любых MySQL баз данных.
Возможны следующие варианты вызова:
1) Получение метрических характеристик для всех таблиц базы данных:
GetDBTablesDepth(<имя базы данных>);
2) Получение метрических характеристик для конкретной таблицы базы данных
GetDBTablesDepth(<имя базы данных>, <имя таблицы>);
Исходный код хранимой процедуры:
PROCEDURE GetDBTablesDepth(IN for_schema_name varchar(240), IN for_table_name varchar(240))
BEGIN
-- идентификатор сети "родительской" таблицы при составлении подсетей
declare netId1 mediumint;
-- идентификатор сети "таблицы-потомка" при составлении подсетей
declare netId2 mediumint;
-- счётчик количества подсетей
declare curNetId mediumint default 0;
-- идентификатор подсети для текущей пары таблиц
declare curStepNetId mediumint;
-- имя "родительской" таблицы
declare t1 varchar(240);
-- имя "таблицы-потомка"
declare t2 varchar(240);
-- текущий цикл завершён?
declare done int default false;
-- текущая "родительская" таблица при расчёте глубины
declare t varchar(240) default t1;
-- текущая "таблица-потомок" (следующий шаг) при расчете глубины
declare t_next varchar(240);
-- количество не обойденных "таблиц-потомков" у текущей "родительской" таблицы
declare child_count mediumint;
-- текущая достигнутая глубина обхода
declare d mediumint default 1;
-- перекресток - глубина таблицы, к которой требуется возвратиться
declare cur_crossroad_depth mediumint default 0;
-- идентификатор текущего обхода
declare cur_traversal_id mediumint default 1;
-- идентификатор последнего обхода
declare last_traversal_id mediumint;
-- ветвь - уникальный идентификатор однозначно идентифицирующий весь пройденный путь до текущей таблицы
declare cur_branch_id mediumint default 0;
-- максимальная длинна для текущего обхода
declare max_depth mediumint;
-- курсор для перебора всех таблиц, ссылающихся на другие таблицы в текущей базе данных
declare cur1 cursor for
select distinct `table_name`, `referenced_table_name`
from `information_schema`.`key_column_usage`
where (`table_schema` = for_schema_name and `referenced_table_name` is not null);
-- курсор для перебора всех таблиц, НЕ ссылающихся на другие таблицы в текущей базе данных
declare cur11 cursor for
select distinct `table_name`
from `information_schema`.`key_column_usage`
where (`table_schema` = for_schema_name and `referenced_table_name` is null);
-- курсор для перебора всех таблиц, в каждой из подсетей
declare cur2 cursor for
select `net_id` , `t_name`
from __TableNets
order by net_id;
drop table if exists __TableNets;
create table if not exists __TableNets (
net_id mediumint not null,
t_name char(64) not null,
parent_count mediumint not null);
open cur1;
-- из всех таблиц в текущей базе данных составляем выбираем те таблицы,
-- которые связаны друг с другом. В итоге получаем несколько связанных подсетей
make_nets: loop
begin
declare continue handler for not found set done = true;
fetch cur1 into t1, t2;
end;
if done then
leave make_nets;
end if;
set netId1 = null;
set netId2 = null;
-- находим есть ли уже данная таблица в __TableNets, берём её net_id
select net_id into netId1 from __TableNets where __TableNets.t_name=t1;
select net_id into netId2 from __TableNets where __TableNets.t_name=t2;
set curStepNetId = null;
if netId2 is not null then
set curStepNetId = netId2;
end if;
if netId1 is not null then
set curStepNetId = netId1;
end if;
-- если находим что 2 подсети связаны, меняем занчение net_id на одинаковое у обеих
if netId1 is not null and netId2 is not null and netId1 != netId2 then
update __TableNets set net_id=netId1 where net_id = netId2;
end if;
if curStepNetId is null then
set curStepNetId = curNetId;
-- наращиваем счётчик количества подсетей
set curNetId = curNetId + 1;
end if;
-- если первый элемент для сети новый
if netId1 is null then
-- добавляем его в эту подсеть
insert into __TableNets values(curStepNetId, t1, 0);
end if;
-- если второй новый для сети
if netId2 is null then
-- добавляем его в эту подсеть
insert into __TableNets values(curStepNetId, t2, 1);
else
update __TableNets set parent_count=parent_count + 1
where net_id = netId2 and t_name=t2;
end if;
end loop;
close cur1;
-- добавляем отдельно стоящие таблицы как отдельные подсети
open cur11;
set done = false;
add_standalone_vertices: loop
begin
declare continue handler for not found set done = true;
fetch cur11 into t1;
end;
if done then
leave add_standalone_vertices;
end if;
set curNetId = curNetId + 1;
-- вставляем таблицу, если она отсутствует
if t1 != "__Traversal" and t1 != "__TableNets" then
insert into __TableNets(net_id, t_name, parent_count)
select * from (select curNetId, t1, 0) AS ttmp
where not exists (
select t_name from __TableNets where t_name = t1) limit 1;
end if;
end loop;
close cur11;
-- таблица результатов: максимальные длины обхода для выбранного "корня"
drop table if exists Results;
create temporary table if not exists Results (
id mediumint not null auto_increment,
depth mediumint not null,
root char(64),
primary key(id));
open cur2;
set done = false;
-- для каждой таблицы в базе данных обходим считая её корневой, родительской всю подсетью
-- находя все возможные глубины обхода
all_tables: loop
begin
declare continue handler for not found set done = true;
fetch cur2 into curNetId, t1;
end;
if done then
leave all_tables;
end if;
set t = t1;
set d = 0;
set cur_crossroad_depth = 0;
set cur_traversal_id = 1;
set cur_branch_id = 0;
-- таблица в которой отражаются все обходы для текущей выбранной "корневой" таблицы
drop table if exists __Traversal;
create table if not exists __Traversal (
id mediumint not null auto_increment,
depth mediumint not null,
t_name char(64) not null,
traversal_id mediumint not null,
traversal_depth mediumint,
last_crossroad_depth mediumint not null,
branch_id mediumint not null,
primary key(id));
insert into __Traversal (`depth`, `t_name`, `traversal_id`, `traversal_depth`, `last_crossroad_depth`, `branch_id`)
values(-1, t, cur_traversal_id, 1, -1, 0);
-- находим все возможные обходы и глубины этих обходов для текущей выбранной корневой таблицы.
net_traversal: loop
set t_next = null;
-- выбираем ребёнка текущей таблицы, который ещё не пройден в текущем проходе
-- или который не был пройден как такой же шаг у которого предок = текущей вершине
select count(distinct `referenced_table_name`) into child_count
from `information_schema`.`key_column_usage`
where `table_schema` = for_schema_name and `table_name`=t
and `referenced_table_name` not in
(select `t_name`
from __Traversal
where traversal_id=cur_traversal_id
or id in (select id+1 from __Traversal where `branch_id`=(
select `branch_id`
from __Traversal
order by id desc
limit 1)));
select distinct `referenced_table_name` into t_next
from `information_schema`.`key_column_usage`
where `table_schema` = for_schema_name and `table_name`=t
and `referenced_table_name` not in
(select `t_name`
from __Traversal
where traversal_id=cur_traversal_id
or id in (select id+1 from __Traversal where `branch_id`=(
select `branch_id`
from __Traversal
order by id desc
limit 1)))
limit 1;
-- следующая "таблица-потомок" не найдена
if t_next is null then
update __Traversal set traversal_depth = d where traversal_id=cur_traversal_id;
-- выбираем таблицу перекрёсток для текущей таблицы
select `last_crossroad_depth` into d
from __Traversal
order by id desc
limit 1;
if d = -1 then
leave net_traversal;
end if;
-- следующей таблицей будет таблица перекрёсток
select `t_name` into t
from __Traversal
where traversal_id=cur_traversal_id
and depth=d;
set cur_traversal_id = cur_traversal_id + 1;
-- восстанавливаем в __Traversal весь путь до этого перекрёстка
insert into __Traversal (`depth`, `t_name`, `traversal_id`, `last_crossroad_depth`, `branch_id`)
select `depth`, `t_name`, cur_traversal_id, `last_crossroad_depth`, `branch_id` from __Traversal
where traversal_id=cur_traversal_id - 1 and depth
Для анализа метрических характеристик было использовано CASE-средство SQLDetective 4.3. Данное инструментальное средство позволяет получать метрики только для PL/SQL кода, поэтому для анализа кода процедуры был применен онлай конвертор из MySQL в PL/SQL - SQLine (http://www.sqlines.com/online).
Метрические характеристики для хранимой процедуры GetDBTablesDepth() приведены в таблице 2.
Таблица 2. Метрики хранимой процедуры GetDBTablesDepth
Метрика |
Значение метрики |
|
Цикломатическая сложность (Cyclomatic Complexity) |
28 |
|
Комплексный показатель качества кода (Maintainability Index) |
4 |
|
Количество строк программы (LOC) |
284 |
|
Процент комментариев (Comment Pct.) |
13 |
|
Объем программы по Холстеду (Halstead Volume) |
2118 |
|
Длинна программы (Program Length) |
336 |
|
Словарь программы (Program Vocabulary) |
79 |
|
Сложность программы (Difficulty) |
39 |
|
Усилия при разработке (Effort) |
82605 |
|
Сложность интерфейса (Interface Complexity) |
5 |
|
Входящие параметры (Input parameters) |
5 |
|
Обязательные входящие параметры (Required Input parameters) |
5 |
|
Точки возврата (Return Points) |
0 |
|
Функциональная сложность (Functional Complexity) |
33 |
|
Пустые строки (Blank Lines) |
175 |
|
Строки комментариев (Comment Lines) |
71 |
|
Эффективные строки кода (eLOC) |
238 |
|
Логические операторы кода (lsLOC) |
81 |
|
Строки псевдокода (Pseudocode Lines) |
0 |
Блок схема хранимой процедуры, сгенерированная с помощью SQLDetective 4.3, представлена на рис. 2-6.
Рис.2. Блок схема процедуры GetDBTablesDepth: фрагмент 1
Рис.3. Блок схема процедуры GetDBTablesDepth: фрагмент 2
Рис.4. Блок схема процедуры GetDBTablesDepth: фрагмент 3
Рис.5. Блок схема процедуры GetDBTablesDepth: фрагмент 4
Рис.6. Блок схема процедуры GetDBTablesDepth: фрагмент 5
Значение цикломатической сложности хранимой процедуры GetDBTablesDepth попадает в интервал [21; 50] - при таком значении цикломатической сложности существует 30% вероятность возникновения проблем поиске ошибок в процессе тестирования процедуры. Комплексный показатель качества кода хранимой процедуры GetDBTablesDepth попадает в интервал [0; 9], что свидетельствует о сложности дальнейшего преобразования программного кода. Объем хранимой процедуры GetDBTablesDepth по Холстеду равен 2118, что превышает рекомендуемое значение 1000 для функций и процедур. Данные метрики в данном случае результат говорит о необходимости дальнейшей модификации программного кода хранимой процедуры. Не было цели создать оптимизированную процедуру. Полученная процедура полностью удовлетворяет требованиям к ней.
Представленный подход получения метрических характеристик для физической схемы MySQL-базы данных, основанный на метаинформации information_schema и реализации хранимых процедур, с последующей оценкой их качества с помощью SQLDetective 4.3, может использоваться для создания библиотеки хранимых процедур оценки метрик физических баз данных.
Список литературы
1. Азаров А.В., Рыбанов А.А. Автоматизированная система расчета метрических характеристик физической схемы базы данных с целью оценки трудоемкости процесса проектирования // Современная техника и технологии. 2014. № 5 (33). С. 39.
2. Кузьмин А.А., Рыбанов А.А. Исследование методов количественной оценки схем реляционных баз данных // Успехи современного естествознания. 2011. № 7. С. 137-138.
3. Морозов А.О., Рыбанов А.А. Подходы к измерению количественных метрик физических схем баз данных [Электронный ресурс] // Студенческий научный форум 2014: докл. VI междунар. студ. электрон. науч. конф., 15 февр. - 31 марта 2014 г. Направл.: Технические науки / РАЕ. - М., 2014. - C. 1-8. - Режим доступа: http://www.scienceforum.ru/2014/pdf/143.pdf.
4. Рыбанов А.А. Оценка сложности физической схемы реляционной базы данных // Cовременная техника и технологии. 2014. № 9 (37). С. 26-30.
5. Рыбанов А.А. Анализ базовых возможностей программных продуктов для исследования метрических характеристик баз данных // NovaInfo.Ru. 2015. Т. 2. № 33. С. 20-28.
6. Макушкина Л.А., Рыбанов А.А., Приходько Е.А. Электронный учебник как знаковое средство построения и организации обучения // Известия Волгоградского государственного технического университета. 2009. Т. 6. № 10 (58). С. 98-100.
7. Рыбанов А.А., Морозов А.О. Автоматизация расчета метрических характеристик физических схем баз данных на основе концептуальных графов // Молодой ученый. 2014. № 9 (68). С. 26-30.
8. Рыбанов А.А., Усмонов М.С.О., Попов Ф.А., Ануфриева Н.Ю., Бубарева О.А. Информационные системы и технологии / Научный ред. И. А. Рудакова / Центр научной мысли (г. Таганрог). Москва, 2013. Том Часть 4. - 90 с.
9. Рыбанов А.А., Коростелев Р.А., Киселев В.В. IDEF1X-модель базы данных web-ориентированной информационной системы оценки семантического качества меню пользователя // Молодой ученый. 2013. № 5. С. 170-172.
10. Свид. о гос. регистрации базы данных № 2013620276 от 13 февраля 2013 г. РФ, МПК (нет). База данных web-ориентированной информационной системы «Кафедра» / Рыбанов А.А.; ВолгГТУ. - 2013.
11. Утицких И.А., Рыбанов А.А. Анализ физических схем реляционных баз данных [Электронный ресурс]: доклад // Студенческий научный форум 2013: V междунар. студ. электрон. науч. конф., 15 февр. - 31 марта 2013 г. Направл. / Рос. акад. естествознания. - М., 2013. - С. 1-4. - Режим доступа:http://www.scienceforum.ru/2013/pdf/4553.pdf.
12. Утицких И.А., Рыбанов А.А. Исследование метрических характеристик физических схем реляционных баз данных // Девятнадцатая межвузовская научно-практическая конференция молодых учёных и студентов, г. Волжский, 27-31 мая 2013 г. : тез. докл. / Филиал МЭИ в г. Волжском. - Волжский, 2013. - C. 39-41.
13. Черняев А.О., Рыбанов А.А. Разработка и исследование алгоритмов автоматизированного проектирования логических схем реляционных баз данных // В мире научных открытий. 2010. № 4-11. С. 128-129.
Размещено на Allbest.ru
Подобные документы
Разработка структуры базы данных библиотеки для улучшения качества обслуживания, создания информационной базы и упрощения работы персонала. Создание объектов базы на языке sql-запросов. Создание хранимой процедуры с курсором, демонстрация процедуры.
курсовая работа [1,3 M], добавлен 28.12.2012Анализ предметной области. Перечень хранимой информации: таблицы, поля, типы. Выделение сущностей, атрибутов, ключей, связей. Начальное заполнение данными БД. Создание и запуск базовых запросов. Проектирование базы данных в среде Enterprise Architect.
курсовая работа [1,6 M], добавлен 16.02.2016Реляционная модель базы данных в текстовом виде. Код, с помощью которого были созданы и заполнены таблицы. Разработка схемы базы данных справочника селекционера. Создание запросов, их основные виды. Процедуры на выбор данных, добавление и удаление.
методичка [1,1 M], добавлен 20.05.2014Анализ предметной области - магазин "Канцелярские товары". Проектирование и реализация базы данных в MS SQL Server. Перечень хранимой информации: таблицы, поля, типы. Моделирование предметной области. Выделение сущностей, атрибутов, ключей, связей.
курсовая работа [2,2 M], добавлен 05.02.2015Разработка базы данных в ErWIn. Сущности, логическая и физическая структуры базы данных "Работа деканата в вузе". Разработка и проверка хранимой процедуры. Создание пользовательской функции по формированию текстовой строки и триггеров к таблице "Студент".
контрольная работа [3,2 M], добавлен 30.11.2015Разработка хранимой процедуры, предназначенной для изменения поля "Цена" в таблице "Заказ" с учетом увеличения стоимости товара. Проектирование реляционной базы данных, триггеров, клиентского приложения. Анализ результатов внедрения программного продукта.
курсовая работа [1,8 M], добавлен 25.06.2011Анализ предметной области - магазин "Канцелярские товары". Проектирование и реализация учебной базы данных магазина. Перечень хранимой информации: таблицы, поля, типы. Выделение сущностей, атрибутов, ключей, связей. Создание и запуск базовых запросов SQL.
курсовая работа [2,4 M], добавлен 09.08.2015Описание процедуры выбора структуры хранения данных. Программная реализация одномерного неоднородного массива. Представление бинарного дерева в виде динамической структуры данных. Изучение способов поиска в упорядоченном дереве. Содержание базы данных.
практическая работа [850,0 K], добавлен 16.04.2015Разработка базы данных для спортивной школы с целью ведения учета, контроля и получения информации о нужном студенте. Создание диалогового окна входа в приложение. Составление схемы и структуры базы данных. Разработка пользовательского интерфейса.
курсовая работа [3,4 M], добавлен 08.09.2015Понятия основных компонентов базы данных Access. Таблицы, отчеты, макросы и модули, форма, запросы к базе и их виды. Типы данных. Создание базы данных "Кадры". Создание таблицы в режиме конструктора. Использование мастера подстановок для создания связей.
курсовая работа [818,0 K], добавлен 10.03.2016