default
.pdfПредставления
“Представление (VIEW) — объект базы данных, являющийся результатом
выполнения запроса к базе данных, определенного с помощью оператора SELECT, в
момент обращения к представлению” (1).
В базе содержится 4 представления. Эти представления реализуют типовые запросы в безе данных. Они позволяют получить простым пользователям системы необходимую информацию без написания сложных запросов.
VIEW edge_and_ver – позволяет увидеть все ребра и вершины, которые находятся
на картах в базе данных.
Структура
Id_map Name_map Id_edge Name_edge Id_ver_1 Name_ver_1 Id_ver_2 Name_ver_2
VIEW edge_from_vert – выводит таблицу со всеми ребрами выходящие и точки.
Структура
Id_ver_1 |
Name_ver_1 |
Id_edge |
Name_edge |
Length_edeg |
Id_ver_2 |
Name_ver_2 |
|
|
|
|
|
|
|
VIEW edge_on_maps – Выводит список всех ребер находящиеся на карте
Структура
ID_map |
Name_map |
Id_edge |
Name_edge |
Length |
Name_user_map |
Name_user_edge |
|
|
|
|
|
|
|
VIEW ver_on_maps – Показывает список всех вершин находящиеся на карет
Структура
ID_map Name_map Id_ver Name_ver Axis_x Axis_y Name_user_map User_name_ver
Триггеры
“Триггер — это хранимая процедура, которая не вызывается непосредственно, а
исполняется при наступлении определенного события (вставка, удаление, обновление строки)” (2).
На каждой таблице есть по два триггера, на вставку и на обновление данных. Эти триггеры предназначены для проверки вводимой пользователем информацией на корректность, т.е. реализуют функционал пользовательского домена. Осуществляются следующие проверки:
Для текстовых полей (например, Users.Memo, Edge.Name) – введенная информация проверяется на максимально разрешенную длину для конкретного поля.
11
Для числовых полей (например, Users.Id) – проверятся, что введенное число не должно быть меньше нуля.
Втриггере для обработки ошибки используется функционал MySQL версии 5.5 –
команда SIGNAL. Эта команда позволяет нам, если обнаружена ошибка ввода, прервать выполнение триггера и вывести сообщение об ошибке.
Так же в таблице Egde в триггерах check_edge_date_insert и check_edge_date_update
существует функционал, который реализует проверку целостности данных. В этих триггерах проверяется ребра графа на то, что вершины ребра находятся на одной карте,
если не указанно обратное, то, что ребро является лестницей, и вершины ребра находятся на разных картах.
12
Список литературы
1. retvizan. Представления (VIEW) в MySQL. habrahabr.ru. [В Интернете]
http://habrahabr.ru/post/47031/.
2.Pokoinik. Триггеры в MySQL. habrahabr.ru. [В Интернете]
http://habrahabr.ru/post/37693/.
3. Corporation, Oracle. MySQL Documentation: MySQL Reference Manuals. MySQL.
[В Интернете] http://dev.mysql.com/doc/.
4. MySQL. MySQL. [В Интернете] http://www.mysql.ru/.
13
Приложение
Графы, используемые в базе данных
|
105 |
|
|
101 |
106 |
Карта 1 |
|
103 |
|||
|
|
102
|
104 |
|
205 |
202 |
207 |
203
Карта 2
201
204
206
Dump базы данных
--phpMyAdmin SQL Dump
--version 3.4.10.1deb1
--http://www.phpmyadmin.net
--Хост: localhost
--Время создания: Дек 16 2012 г., 23:39
--Версия сервера: 5.5.28
--Версия PHP: 5.3.10-1ubuntu3.4
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES cp1251 */;
--
--База данных: `Diagrams`
----------------------------------------------------------
--
-- Структура таблицы `edge`
--
14
CREATE TABLE IF NOT EXISTS `edge` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(80) NOT NULL,
`date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `user_id` bigint(20) DEFAULT NULL,
`vertices_id_1` bigint(20) unsigned NOT NULL, `vertices_id_2` bigint(20) unsigned NOT NULL, `length` int(11) DEFAULT NULL,
`memo` varchar(250) DEFAULT NULL,
`edge_type` smallint(6) DEFAULT '0' COMMENT '0 - one map\n1 - different maps', PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `user_id` (`user_id`),
KEY `vertices_id_1` (`vertices_id_1`),
KEY `vertices_id_2` (`vertices_id_2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=37 ;
--
-- Дамп данных таблицы `edge`
--
INSERT INTO `edge` (`id`, `name`, `date_creation`, `user_id`, `vertices_id_1`, `vertices_id_2`, `length`, `memo`, `edge_type`) VALUES
(1, '101-102', '2012-11-06 20:53:40', 2, 50, 51, 10, NULL, 0), (2, '101-103', '2012-11-06 20:53:40', 2, 50, 52, 10, '', 0), (3, '102-104', '2012-11-06 20:53:40', 2, 52, 53, 10, NULL, 0), (4, '103-104', '2012-11-06 20:53:40', 2, 52, 53, 10, NULL, 0), (5, '103-105', '2012-11-06 20:53:40', 2, 52, 54, 10, NULL, 0), (6, '104-106', '2012-11-06 20:53:40', 2, 53, 55, 10, NULL, 0), (25, '105-106', '2012-11-06 20:54:01', 2, 54, 55, 10, NULL, 0), (26, '201-202', '2012-11-06 20:58:01', 2, 56, 57, 10, NULL, 0), (27, '201-204', '2012-11-06 20:58:01', 2, 56, 59, 10, NULL, 0), (28, '202-203', '2012-11-06 20:58:01', 2, 57, 58, 10, NULL, 0), (29, '203-204', '2012-11-06 20:58:01', 2, 58, 59, 10, NULL, 0), (30, '203-205', '2012-11-06 20:58:01', 2, 58, 60, 10, NULL, 0), (31, '203-206', '2012-11-06 20:58:01', 2, 58, 61, 10, NULL, 0), (32, '205-207', '2012-11-06 20:58:01', 2, 60, 62, 10, NULL, 0), (33, '206-207', '2012-11-06 20:58:01', 2, 61, 62, 10, NULL, 0), (35, '106-207', '2012-12-16 19:03:20', 1, 55, 62, 7, NULL, 1), (36, '102-201', '2012-12-16 19:03:20', 2, 52, 56, 5, NULL, 1);
--
--Триггеры `edge`
DROP TRIGGER IF EXISTS `check_edge_date_insert`; DELIMITER //
CREATE TRIGGER `check_edge_date_insert` BEFORE INSERT ON `edge` FOR EACH ROW begin
declare msg varchar(50);
--=======================================================
--Проверка вводимых данные на соответствие типам (домены)
--=======================================================
15
if length(new.name) > 80 then
set msg = concat('Error long Name, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if length(new.memo) > 250 then
set msg = concat('Error long Memo, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if new.vertices_id_1 <= 0 then
set msg = concat('Error vertices_id_1, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if new.vertices_id_2 <= 0 then
set msg = concat('Error vertices_id_2, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if new.length <= 0 then
set msg = concat('Error lenght, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if new.user_id < 0 then
set msg = concat('Error user_id, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
--=======================================================
--Проверка вводимых данные на целостность данных (точки лежат на одной карте)
--=======================================================
if (new.edge_type = 0) then
set @maps_id_1 := -1; set @maps_id_2 := -1;
select v.maps_id into @maps_id_1 from vertices v where v.id = new.vertices_id_1; select v.maps_id into @maps_id_2 from vertices v where v.id = new.vertices_id_2; if @maps_id_1 <> @maps_id_2
then
set msg = concat('Error vertices not on map, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if; end if;
16
end
//
DELIMITER ;
DROP TRIGGER IF EXISTS `check_edge_date_update`;
DELIMITER //
CREATE TRIGGER `check_edge_date_update` BEFORE UPDATE ON `edge`
FOR EACH ROW begin
declare msg varchar(50);
if length(new.name) > 80 then
set msg = concat('Error long Name, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if length(new.memo) > 250 then
set msg = concat('Error long Memo, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if new.vertices_id_1 < 0 then
set msg = concat('Error vertices_id_1, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if new.vertices_id_2 < 0 then
set msg = concat('Error vertices_id_2, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if new.length < 0 then
set msg = concat('Error lenght, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if new.user_id < 0 then
set msg = concat('Error user_id, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if (new.edge_type = 0) then
set @maps_id_1 := -1; set @maps_id_2 := -1;
select v.maps_id into @maps_id_1 from vertices v where v.id = new.vertices_id_1; select v.maps_id into @maps_id_2 from vertices v where v.id = new.vertices_id_2;
17
if @maps_id_1 <> @maps_id_2 then
set msg = concat('Error vertices not on map, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if; end if;
end
//
DELIMITER ;
-- --------------------------------------------------------
--
-- Дублирующая структура для представления `edge_and_ver`
--
CREATE TABLE IF NOT EXISTS `edge_and_ver` ( `edge_id` bigint(20) unsigned
,`edge_name` varchar(80) ,`length` int(11)
,`id` bigint(20) unsigned ,`name_maps` varchar(80) ,`user_maps` varchar(80)
,`maps_user_id` bigint(20) ,`id_ver_1` bigint(20) unsigned ,`name_ver_1` varchar(80) ,`id_ver_2` bigint(20) unsigned ,`name_ver_2` varchar(80)
);
-- --------------------------------------------------------
--
-- Дублирующая структура для представления `edge_from_vert`
--
CREATE TABLE IF NOT EXISTS `edge_from_vert` ( `id_ver_1` bigint(20) unsigned
,`name_ver_1` varchar(80) ,`id_edge` bigint(20) unsigned ,`name_edge` varchar(80) ,`length` int(11)
,`id_ver_2` bigint(20) unsigned ,`name_ver_2` varchar(80)
);
-- --------------------------------------------------------
--
-- Дублирующая структура для представления `edge_on_maps`
--
CREATE TABLE IF NOT EXISTS `edge_on_maps` ( `edge_id` bigint(20) unsigned
,`edge_name` varchar(80) ,`length` int(11)
18
,`maps_id` bigint(20) unsigned ,`name_maps` varchar(80) ,`user_maps` varchar(80) ,`maps_user_id` bigint(20) ,`user_edge` varchar(80) ,`edge_user_id` bigint(20)
);
-- --------------------------------------------------------
--
-- Структура таблицы `maps`
--
CREATE TABLE IF NOT EXISTS `maps` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(80) DEFAULT NULL,
`date_creation` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `user_id` bigint(20) DEFAULT NULL,
`memo` varchar(250) DEFAULT NULL, `plan_path` varchar(80) DEFAULT NULL, PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
--
-- Дамп данных таблицы `maps`
--
INSERT INTO `maps` (`id`, `name`, `date_creation`, `user_id`, `memo`, `plan_path`) VALUES (1, 'maps_paveletskaya', '2012-10-24 19:49:12', 1, '111', NULL),
(2, 'maps_paveletskaya_2_plan', '2012-10-24 19:50:09', 1, NULL, NULL);
--
--Триггеры `maps`
DROP TRIGGER IF EXISTS `check_date_insert`; DELIMITER //
CREATE TRIGGER `check_date_insert` BEFORE INSERT ON `maps` FOR EACH ROW begin
declare msg varchar(50);
--=======================================================
--Проверка вводимых данные на соответствие типам (домены)
--=======================================================
if length(new.name) > 80 then
set msg = 'Error long Name';
signal sqlstate '45000' set message_text = msg; end if;
if length(new.memo) > 250 then
19
set msg = 'Error long Memo';
signal sqlstate '45000' set message_text = msg; end if;
if length(new.plan_path) > 80 then
set msg = 'Error long plan_path';
signal sqlstate '45000' set message_text = msg; end if;
end
//
DELIMITER ;
DROP TRIGGER IF EXISTS `check_date_update`;
DELIMITER //
CREATE TRIGGER `check_date_update` BEFORE UPDATE ON `maps`
FOR EACH ROW begin
declare msg varchar(50);
--=======================================================
--Проверка вводимых данные на соответствие типам (домены)
--=======================================================
if length(new.name) > 80 then
set msg = concat('Error long Name, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if length(new.memo) > 250 then
set msg = concat('Error long Memo, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
if length(new.plan_path) > 80 then
set msg = concat('Error long Name, ID = ', cast(new.id as char)); signal sqlstate '45000' set message_text = msg;
end if;
end
//
DELIMITER ;
-- --------------------------------------------------------
--
-- Структура таблицы `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(80) DEFAULT NULL,
20