Теория СУБД

КЛИЕНТ-СЕРВЕР

clip_image003

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

В технологии клиент-сервер драй­вер уже изменил свое назначение, и теперь он уже должен только знать, как подключится к серверу и пере­дать ему запрос. Остальное перек­ладывается на плечи сервера. Такая технология намного сокращает тра­фик, особенно при хорошем прог­раммировании. Допустим, пользова­телю нужно увидеть все данные, в которых имя определенной колонки содержит слова на букву "А". Клиен ту достаточно направить серверу всего лишь такой текст:

SELECT *

FROM Имя таблицы

WHERE Колонка LIKE ‘А%’

Я думаю, не надо даже считать, сколько кило занимает этот текст и как долго он будет отправляться по сети. Даже через медный провод с железом на 2400бод все произойдет практически мгновенно.

Сервер базы данных, получив зап­рос, разбирает его и придумывает для себя оптимальный план выполнения, в данном случае — поиска нужных строк.

Получив нужные данные, сервер возвращает только их и ничего больше. Таким образом, клиент в любой момент может запросить у сервера нужные данные и не будет необходимости гонять по сети всю базу данных. При хорошо построен­ном приложении и оптимальных запросах клиент сможет работать с базой данных любого размера даже через модем в 56 Кбит/с. Неплохо? Главное — запрашивать только то, что нужно, и маленькими кусками.

ОСОБЕННОСТИ КЛИЕНТ-СЕРВЕРА

Возможности клиент-серверных баз данных зависят от производите­ля. Самые простые возможности пре­доставляют такие базы, как MySQL. В них сервер имеет встроенный движок обработки запросов и основные воз­можности по обеспечению безопас­ности и распределению прав.

В более солидных клиент-серверных базах (MS SQL Server, Oracle и т.д.)

есть следующие дополнительные возможности:

1. вьюшки — более подробно обсу­Дим в статье по безопасности;

2. триггеры — функции, которые мо­гут вызываться на определенные со­бытия (вставка, изменение и удале­ние данных), в этих функциях может производиться какая-то логика по обеспечению целостности данных;

3. репликация — объединение баз данных (допустим, у фирмы есть два офиса и в каждом из них своя база; настроив репликацию, обе базы могут автоматически сливаться в одну в главном офисе или обмениваться из­менениями по расписанию);

хранимые процедуры и функции, которые выполняются на сервере по мизерному запросу клиента и могут содержать целые подпрограммы с ло­гикой, которые будут выполнять какие-либо действия; для написания та­ких программ используется уже не просто язык SQL, а его расширение — Transact-SQL (для MS баз) и PL/SQL (для Oracle и др.).

Список возможностей зависит от конкретной базы данных, ее наворо-ченности и может быть больше или меньше.

ИНДЕКСЫ НА СЕРВЕРЕ

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

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

В локальных базах данных индексы хранятся линейно. Это как колонка из упорядоченных данных, и для строк это то же самое, что выстроить все слова по алфавиту. Конечно же, та­кой индекс упрощает поиск. Когда происходит сканирование по индексу и когда программа видит, что уже пошло слово больше, чем задано в условии поиска, сканирование может прекращаться и не придется просмат­ривать всю базу данных. Например, поищем слово "Абажур". Оно будет где-то в начале, и чтобы его найти, нужно просканировать всего лишь начало таблицы, не дальше, чем все слова на букву А. За счет того, что данные упорядочены, мы можем быть уверенными, что все остальные слова будут на буквы Б, В и т.д.

В случае с серверной базой индексы чаще всего (в зависимости от базы и типа индекса) хранятся немного подругому — в виде дерева. Сколько слов надо проверить для поиска сло­ва "якорь" в базе данных при линей­ном индексе? По сути, практически все. При древовидном хранении ин­декса — не более чем для слова "Аба­жур". Для пояснения древообразного индекса рассмотрим классическую за­дачу (в реальности все немного слож­нее, но идея такая же). В самом верху дерева хранится алфавит. Программа находит букву А и спускается на уро­вень ниже. Здесь она находит все слова на буквы А, Б и двигается еще ниже. И так — пока не найдется нужное слово

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