SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.05.2007 18:08:36

iCode
Участник
Зарегистрирован: 26.05.2007
Сообщений: 12

Хранимые процедуры

Приветsmile

У меня есть БД, работая с которой, я посылаю запросы на выборку, изменение, и тому подобное...Ну, в общем, как обычно.
Мне тут сказал один человек: Ты бы, говорит, всю логику на СУБД повесил - и клиент бы тоньше стал, и изменять в одном месте только придется, если что!

Дык вот, "всю логику на СУБД повесить" - это как, это я должен насоздавать хранимых процедур для любых операций с базой?..
Тогда я могу ваще закрыть доступ к таблицам, а нараздовать прав на хранимки. Таким образом, я могу управлять доступом не к данным, а к операциям с данными...идея мне понравиласьsmile

Хотелось бы это обсудить.
Целесообразно ли все операции с данными проводить через хранимки?
Есть ли какая-то возможность, структурировать хранимки?
Так ваще кто-нибудь делает? Или так делают все?smile

2администрация: что за ограничение на длину заголовка, хотел понятный заголовок написать - не влез...

Неактивен

 

#2 26.05.2007 19:26:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Хранимые процедуры

Так делают, но не все, естественно.

Причины так поступить:
1. доступ к базе из разных приложений - можно избежать дублирования кода
2. структура и количесвто таблиц меняется со временем
3. обеспечение унифицированного доступа из одного приложения к базам с разной структурой (и возможно не только MySQL)
4. требуется проверка входных, которая не может быть выполнена в триггере и требует дополнительных привелегий

Причины так не поступать:
1. таблицы достаточно простые и не меняются
2. доступ только из одного приложения к одной базе
3. доступ только для одного юзера
4. невозможность позволить себе дополнительное время выполнение на запуск процедуры

Ограничение Вы имеете в виду 70 символов в поле заголовка? Если не хватает, можно увеличить.

Неактивен

 

#3 26.05.2007 19:30:58

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Хранимые процедуры

iCode написал:

Есть ли какая-то возможность, структурировать хранимки?

Что Вы имеете в виду по структурированием? Хранимая процедура имеет имя и принадлежит базе данных. Она может вызывать другие хранимые процедуры.

Неактивен

 

#4 27.05.2007 13:59:25

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Хранимые процедуры

Подобный вопрос недавно на ЛОРе обсуждался (правда в специфичном ракурсе)


http://www.linux.org.ru/view-message.jsp?msgid=1942141

Неактивен

 

#5 27.05.2007 23:04:18

iCode
Участник
Зарегистрирован: 26.05.2007
Сообщений: 12

Re: Хранимые процедуры

rgbeast написал:

4. невозможность позволить себе дополнительное время выполнение на запуск процедуры

Не понял...
Какое дополнительное время? К чему дополнительное?smile

rgbeast написал:

Ограничение Вы имеете в виду 70 символов в поле заголовка? Если не хватает, можно увеличить.

Да, конечно я имел в виду 70 символов...Это мало по-моему...Мне по крайней мере не хватило, чтобы описать в заголовке тему.

rgbeast написал:

Что Вы имеете в виду по структурированием?

Ну, скажем, возможен ли объектно-ориентированный подход при написании бизнес-логики вообще и хранимок, в частности?

Неактивен

 

#6 28.05.2007 00:30:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Хранимые процедуры

Дополнительное время обычно играет роль на очень загруженных серверах.
Это время на получение кода процедуры, проверки прав, обработки и т.п.

ООП подразумевает наследование, инкапсуляцию и прочее. И его, разумеется
ни в каком виде тут нет: процедуры не наследуются, не принадлежат объектам.
Однако, Вы можете придумать какой-нибудь хитрый метод их структуризации,
т.к. они принадлежат базам.
Например, так:
1. Создаете пустую базу obj1
2. Создаете в ней процедуру a
3. Из "реальной" базы запускаете obj1.a

Выглядит как ООП smile
Хотя, если честно, по-моему это некоторое усложнение...

Неактивен

 

#7 28.05.2007 01:13:27

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Хранимые процедуры

Дополнительное время играет роль, если сами запросы выполняются быстро. Например, приложение выполняет много запросов типа select 2+2; В таком случае, если данный запрос включить в процедуру, время вызова процедуры будет сравнимо со временем выполнения запроса. Если же в процедуре выполняются сложные запросы или много запросов, то время вызова процедуры будет пренебрежимо мало.

Ходит байка, что Керниган или Ритчи сказал всем, что нужно использовать функции, где это только возможно, так как их вызов осуществляется очень быстро а языке C. Все поверили и стали использовать, а потом оказалось, что вызовы функций могут занимать до 50% времени выполнения программы. Но было уже поздно smile

Размер поля расширен до 100 символов.

Неактивен

 

#8 30.05.2007 01:40:28

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: Хранимые процедуры

Не хотел начинать новую тему, коль уж разговор зашел о скорости выполнения.
Насколько быстр оператор(команда): USE db_name;
когда при выполнении запросов нужно обращаться к разным DB, так вот думаю сделать разные соединения или делать USE?

Неактивен

 

#9 30.05.2007 09:20:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Хранимые процедуры

Это замена строки в памяти... очень быстро.

Когда надо обращаться к разным БД, можно обойтись одним соединением
и не делать USE. Например, вот так:

Код:

SELECT t1.a, t2.b
FROM db1.table1 t1 JOIN db2.table2 t2 ON t1.c = t2.d

Сервер всегда полностью расшифровывает названия таблиц:

Код:

root@localhost : (none) > use mysql
Database changed
root@localhost : mysql > explain extended select User from user;
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | user  | index | NULL          | PRIMARY | 228     | NULL |    6 | Using index |
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
1 row in set, 1 warning (0,00 sec)

Note (Code 1003): select `mysql`.`user`.`User` AS `User` from `mysql`.`user`

Обратите внимание на последний запрос - это то, что реально выполняется после
прохода парсера.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson