MySQL & mSQL

Чего недостает MySQL и mSQL


Слово «недостает» выбрано за неимением лучшего. Как уже отмечалось, MySQL и mSQL сознательно предпочли отказаться от возможностей, которые могли снизить их производительность. Иными словами, в MySQL и mSQL ставка сделана на производительность. Однако некоторые пользователи среднего класса готовы отчасти пожертвовать производительностью ради определенных функций. Для понимания того, что предлагают другие базы данных среднего масштаба, полезно выяснить, что же опущено в MySQL и mSQL.

Разработчики MySQL собираются все-таки включить в свой продукт некоторые из этих функций с возможностью по желанию их отключать. Сейчас, когда книга печатается, мы зна- . ем, что планируется реализовать механизм хранимых процедур и вложенных запросов, а возможно, и транзакций.

Транзакции

Транзакции позволяют сгруппировать вместе несколько команд SQL в качестве единицы работы. Группируя вместе команды, можно быть уверенным, что никто не столкнется с частично измененной базой данных. Кроме того, при невозможности выполнить одну из команд вся единица работы не будет выполнена. Транзакции можно зрительно представить себе как перекресток оживленных дорог. В однопоточной системе с очередью, такой как mSQL, это как остановка перед перекрестком со всех четырех сторон. Все машины проезжают в очередь по одной. Если проезжает колонна из двух машин, существует опасность, что она будет разорвана перед знаком остановки.

В многопоточной системе с блокировкой, такой как MySQL, это больше напоминает перекресток с регулировщиком вместо знаков остановки. Движение происходит в любом порядке и с любой скоростью, а регулировщик следит, чтобы не было столкновений. Если к перекрестку подходят одновременно две машины с пересекающихся направлений, регулировщик приказывает одной из них остановиться и подождать, пока другая преодолеет перекресток.

Транзакции напоминают перекресток со светофором. Подходящий транспорт останавливается перед красным сигналом на то время, пока весь транспорт, следующий в перпендикулярном направлении, не пересечет перекресток.


Практический пример использования транзакций - банковское приложение, в котором перевод средств со сберегательного на чековый счет выполняется в результате изменения остатка на сберегательном счете, а затем изменения остатка на чековом счете. Это можно осуществить с помощью двух команд SQL:

# Снять $100 из $110 на сберегательном счете

UPDATE account

SET balance = 10.00

WHERE id = 1234

# Добавить $100 к $55 на чековом счете



UPDATE account

SET balance = 155.00

WHERE id = 5678

В промежутке между двумя этими изменениями другой клиент мог провести операцию, проверяющую состояние чекового и сберегательного счетов, чтобы узнать, достаточна ли сумма для оплаты чека. Если бы подобное произошло, чек был бы возвращен банком. Еще хуже, если сервер «упадет» в промежутке между двумя изменениями. Клиент просто потеряет $100.

Объединяя эти две команды в транзакцию, вы говорите, что либо обе должны быть успешно выполнены, либо ни одна из них. Если первая команда пройдет, а вторая не сможет выполниться, то можно дать команду, называемую «откат»(«rollback»), которая вернет базу данных в состояние, предшествовавшее началу транзакции. Точно так же никому не разрешается трогать файлы, которые вы модифицируете, пока работа не будет завершена. MySQL частично позволяет эмулировать транзакции, используя команду LOCK TABLES. Блокировки помогают избежать нарушения целостности данных, но не дают возможности осуществления операции отката. В mSQL поддержка транзакций отсутствует.

Триггеры

Триггеры тесно связаны с транзакциями. Продолжая аналогию с дорожным движением, представим себе полицейского инспектора, сверху наблюдающего за перекрестком. Если одна из машин совершает какое-либо нарушение, инспектор выезжает на дорогу и преследует нарушителя.

Триггер — это одна или несколько команд SQL, которые хранятся в базе и выполняются, когда происходит какое-либо определенное событие. Триггеры являются методом автоматизации задач контроля. Если выполняется некоторое условие, триггер может воздействовать на данные или просто сообщить о том, что имело место срабатывание триггера.



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

В простейшем случае хранимые процедуры - это одна или несколько команд SQL, хранимых в базе данных под каким-либо простым именем и в совокупности выполняющих некую функцию. В примере с переводом денежных средств можно было бы просто сохранить эти две команды в одной хранимой процедуре с именем «transfer» (перевод). Ваше приложение передает хранимой процедуре два номера счета и сумму, и она выполняет две команды SQL в одной транзакции.

На более высоком уровне сложности хранимые процедуры могут расширять базовый синтаксис SQL, так что он становится похожим на традиционные языки программирования. Двумя примерами таких расширений являются Oracle PL/SQL и Sybase/ Microsoft Tran-sactSQL. Часто можно слышать, что использование хранимых процедур «помещает бизнес-логику в базу данных».

Вложенные запросы

Обычная команда SQL SELECT осуществляет полный доступ ко всем данным, хранимым в таблице, - если вы знаете, что ищете. Когда вы не стремитесь извлечь содержимое таблицы целиком, SELECT в своем основном виде требует ввести хотя бы часть данных, которые вы хотите извлечь. Например, SELECT name FROM friends WHERE name LIKE 'B%' требует знания хотя бы одной буквы имени, которое вы ищете. Что делать в случае, если вы хотите узнать, чей заработок был выше среднего? Запрос должен выглядеть примерно так:

SELECT name FROM people WHERE salary > ???

Больше чего? Вы понятия не имеете, каков средний заработок, пока не сделаете выборку по заработкам! Необходимо взять значение SELECT AVG(salary) FROM people и вставить его в предыдущий запрос. Вложенный запрос позволяет это сделать:

SELECT name

FROM people

WHERE salary > (SELECT AVG(salary) FROM people)

Объекты

Реляционные базы данных - не конечный пункт эволюции. Имеется много объектно-реляционных и объектно-ориентированных баз данных. На рынке систем большого масштаба идея чисто реляционных баз данных постепенно отступает. Новый стандарт SQL3 включит в себя многие изменения, касающиеся поддержки объектов.

В РСУБД все данные хранятся в виде таблиц, представляющих собой просто списки записей, в свою очередь, являющихся собранием битов, представляющих текст, числа и другие типы данных. В объектно-ориентированной системе управления базами данных (ООСУБД) базовой единицей хранения данных является объект. Объект может содержать не только данные тех же типов, что встречаются в реляционных базах данных, но также и другие объекты или многомерные данные, скажем, массивы, или даже выполняемые функции, в мире объектно-ориентированного программирования обычно называемые методами.




Содержание раздела