Глава №7.
Другие
СУБД среднего масштаба
Когда mSQL
впервые вышла на сцену, это была единственная СУБД среднего масштаба с поддержкой
SQL. Но она недолго оставалась в одиночестве. Конечно, вы уже знаете о другой
такой базе данных: MySQL. За годы, прошедшие после появления mSQL, появилось
и несколько СУБД среднего класса. Мы сосредоточились в этой книге на MySQL и
mSQL из-за их очень большого сходства и громадной популярности. Было бы, однако,
несправедливо не упомянуть о других базах данных.
Базы данных
используются в столь многочисленных задачах, что трудно в одном пакете соединить
все функции для всех возможных применений. Тем не менее крупные поставщики баз
данных пытаются достичь этой цели. Они расплачиваются за это производительностью,
а вы расплачиваетесь своими деньгами. С другой стороны, базы данных низшего
класса настолько узко специализированы, что возможности их использования на
малых предприятиях, в некоммерческих организациях и других местах с нетривиальными
потребностями весьма ограниченны. Базы данных среднего класса заполняют важный
пробел между двумя этими крайностями. До сего времени мы рассматривали лишь
два очень схожих подхода к удовлетворению потребности в базе данных среднего
класса. Определенно, они не являются единственными решениями. Если, скажем,
ваша компания невелика, это не значит, что вам не может потребоваться поддержка
транзакций. Некоторым пользователям среднего звена могут потребоваться также
триггеры, вложенные запросы, хранимые процедуры, поддержка объектно-ориентированного
программирования и многое другое - но не все эти возможности одновременно. Таким
образом, различные базы данных среднего класса могут иметь необходимые возможности,
отсутствующие в MySQL или mSQL.
Иногда можно
слышать, как MySQL и mSQL называют «бесплатными» (free) продуктами.
Когда сравнивают MySQL и mSQL, иногда даже говорят, что MySQL «более бесплатна»,
чем mSQL. Здравый смысл противится выражению «более бесплатный».
Однако в мире программного обеспечения действительно изобретены «степени
бесплатности».
До сих пор
мы сознательно избегали обсуждения «бесплатности» MySQL и mSQL,
поскольку термин «бесплатный» неоднозначен в мире программного обеспечения.
На самом деле, лицензия как на один, так и на другой продукт может оказаться
для вас не бесплатной, в зависимости от того, кем вы являетесь. По правилам,
действовавшим в момент написания книги, университет не был обязан платить за
лицензию ни на тот, ни на другой продукт. А коммерческий пользователь mSQL-
обязан. Когда говорят, что MySQL «более бесплатна», чем mSQL, имеют
в виду, что MySQL бесплатна для большего числа пользователей, чем mSQL.
Другая сторона
понятия «бесплатный» для программ не имеет отношения к цене, а связана
с возможностью изучать и модифицировать исходный код. В этом смысле тот и другой
продукт совершенно бесплатны. Вы можете зайти на их веб-страницы и загрузить
исходный код. Даже если вы принадлежите к пользователям MySQL или mSQL, которые
обязаны платить за их использование, тратиться дополнительно на исходный код
не нужно.
В мире программирования
возник новый термин, предназначенный для избавления от неоднозначности понятия
«бесплатный». Он называется Open Source- Открытый код. Фактически,
термин «Open Source» стал торговой маркой, обозначающей программный
продукт, исходный код которого открыт вне зависимости от взимаемой за его использование
платы. Linux, Netscape, FreeBSD, Perl, Apache, все продукты GNU и многие продукты,
упоминаемые в этой книге, такие как MySQL, mSQL, mm.mysql.jdbc и mSQL-JDBC (мы
перечислили лишь немногие), - все они являются Open Source-продуктами.
Другие базы
данных, о которых мы говорим в этой главе, также относятся к Open Source. Open
source имеет очень большое значение в мире пользователей среднего класса, поскольку
«большие парни» склонны рассматривать этот рынок как не заслуживающий
их внимания из-за ограниченности, а разработчики малого класса считают эти продукты
слишком сложными для себя.
Слово «недостает»
выбрано за неимением лучшего. Как уже отмечалось, 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 включит
в себя многие изменения, касающиеся поддержки объектов.
В РСУБД все
данные хранятся в виде таблиц, представляющих собой просто списки записей, в
свою очередь, являющихся собранием битов, представляющих текст, числа и другие
типы данных. В объектно-ориентированной системе управления базами данных (ООСУБД)
базовой единицей хранения данных является объект. Объект может содержать не
только данные тех же типов, что встречаются в реляционных базах данных, но также
и другие объекты или многомерные данные, скажем, массивы, или даже выполняемые
функции, в мире объектно-ориентированного программирования обычно называемые
методами.
Существующая
в настоящее время реализация объектно-реляционной СУБД Postgres известна как
PostgreSQL (или Postgres 6). Хотя Post-gres поддерживает SQL в течение всего
трех лет, самой системе уже более десяти лет. В начале 1980-х д-р Майкл Стоунбрейкер
(Michael Sto-nebreaker) из Калифорнийского Университета в Беркли разработал
систему баз данных, которая предвосхитила многие концепции, реализованные в
современных системах управления базами данных. Эта СУБД получила название Ingres
(позднее University Ingres). Ingres была некоммерческим проектом, финансируемым
университетом; проектом, быстро обретшим последователей среди специалистов по
компьютерам во всем мире.
Одна из фирм
обратила внимание на коммерческий потенциал этого академического продукта и,
зарегистрировав торговую марку Ingres, сделала коммерческий продукт. Исходная
некоммерческая версия Ingres была переименована в University Ingres, и ее развитие
продолжилось независимо от коммерческой версии.
Через некоторое
время д-р Стоунбреикер пошел в своих исследованиях дальше того, что предполагалось
в начальных целях проекта Ingres. Он решил, что настало время разработать совершенно
новую систему баз данных, развивавшую идеи, заложенные в Ingres, и отправился
осваивать новую территорию. Эта система баз данных стала известна как Postgres,
то есть после-Ingres.
Postgres,
как и Ingres, была открытым для общественности проектом, который финансировался
университетом. И так же, как в случае Ingres, коммерческий сектор обратил внимание
и на Postgres, в результате чего появился коммерческий проект Illustra*. Бесплатная
Postgres продолжила свое существование и сейчас соперничает в популярности с
MySQL и mSQL среди серверов баз данных среднего масштаба.
В 1995 г.
произошли два события, повлиявшие на судьбу Postgres. Во-первых, два студента
д-ра Стоунбрейкера - Эндрю Ю (Andrew Yu) и Джолли Чен (Jolly Chen) - разработали
SQL-интерфейс для Postgres.
Таким образом,
через несколько лет после того, как Дэвид Хьюз впервые разработал MiniSQL для
использования SQL в работе с Postgres, у последней появился настоящий SQL-интерфейс.
Поддержка SQL вызвала рост популярности. Как и в случае с mSQL и MySQL, рост
популярности привел к росту потребности в новых функциях. В результате появилась
объектно-ориентированная СУБД среднего масштаба с поддержкой транзакций, триггеров
и вложенных запросов. Подробнее узнать о PostgreSQL можно на http://www.postgresql.org.
Проект GNU
для многих программистов является символом свободы. Официальная лицензия на
продукты GNU гарантирует свободный доступ и полную свободу модификации исходного
кода. Почти для всякой утилиты среды Unix можно найти версию GNU - включая редактор
(Emacs), командный процессор (bash) и ядро операционной системы (Hurd). До недавнего
времени зияющим пробелом было отсутствие СУБД.
Институт
системного программирования Российской Академии наук работает над тем, чтобы
изменить это положение. Пару лет назад он выпустил первую открытую бета-версию
GNU SQL - полностью функциональную РСУБД с поддержкой SQL и лицензией GNU Public
License (GPL). Ко времени печати этой книги текущая версия GNU SQL имела номер
0.7beta.
Когда задумывалась
GNU SQL, спецификация SQL 2 была еще не окончательной, поэтому первые версии
GNU SQL обеспечивали поддержку только функций SQL89, а возможности SQL2 добавлялись
постепенно.
В настоящее
время GNU SQL поддерживает многие развитые возможности - транзакции, вложенные
запросы и курсоры. Поскольку это бета-версия, мы не рекомендовали бы ее для
промышленного использования. По мере своего становления она, конечно, будет
достойна внимания. Подробнее узнать о GNU SQL можно на http://www.ispras.ru/-kml/gss/index.html
Beagle является
бесплатным ядром баз данных SQL, разработанным и реализованным Робертом Клейном
(Robert Klein). Как и GNU SQL, Beagle задуман как полностью SQL-совместимый
сервер со всеми необходимыми функциями, включая объектно-реляционные расширения,
впервые появившиеся в PostgreSQL. Как и GNU SQL, Beagle во многом не завершен.
Ко времени печати этой книги он достиг того уровня развития,
когда он надежен и может использоваться для тестирования и разработки. Для промышленного
пользования этот продукт еще не готов.
Одной из
наиболее интересных особенностей Beagle является то, что автор с самого начала
проекта вел журнал разработки. Изучая этот журнал, вы можете проследить развитие
SQL-сервера от простого тестового приложения, использующего TCP и архитектуру
клиент/сервер, до почти полностью функционального SQL-сервера, каким он является
сегодня. Домашняя страница Beagle расположена на http://
www.beaglesql.org.
Как и многие
приложения, MySQL обладает набором тестов для проверки того, что заново откомпилированная
система действительно поддерживает все возможности, которыми предположительно
должна обладать. Для MySQL этот набор называется «crash-me», поскольку
одной из его задач является попытка «завалить» сервер баз данных.
В какой-то
момент обратили внимание на то, что «crash-me» является переносимой
программой. Она может работать не только в различных операционных системах,
но и использоваться для тестирования разных СУБД. С тех пор «crash-me»
превратилась из простого набора тестов в программу, позволяющую производить
сравнение характеристик. Тесты включают в себя стандартный SQL, а также расширения,
предлагаемые многими серверами. Кроме того, программа проверяет надежность сервера
при интенсивной нагрузке. Полный прогон тестов дает исчерпывающую характеристику
возможностей сервера баз данных.
Можно использовать «crash-me» для сравнения двух или более серверов баз данных в активном режиме. Домашняя страница «crash-me» находится на http://www.mysql.com/crash-me-choose.htmy.