Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

default

.pdf
Скачиваний:
7
Добавлен:
08.02.2015
Размер:
1.15 Mб
Скачать

Представления

“Представление (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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]