Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Тарасов С. В. СУБД для программиста. Базы данных изнутри

.pdf
Скачиваний:
82
Добавлен:
29.11.2021
Размер:
4.08 Mб
Скачать

образцом которого вполне может служить MS SQL Server Profiler, являет собой утилиту командной строки, запускаемую со своим конфигурационным файлом. Последующую расшифровку полученных результатов надо проводить вручную при помощи регулярных выражений. Есть коммерческие утилиты, предоставляющие более дружественный интерфейс. В версии 2.5 появились возможности накопления статистики в системных таблицах мониторинга вида MON$XXX.

Средством «полной очистки» БД от так называемого мусора до сих пор является процедура резервного копирования и последующего за ним восстановления при помощи утилиты gbak. Однако, подобная процедура означаетотключение пользователей от СУБД на всё время восстановления, делаяпроблематичнойработуврежиме24x7. Файлбазыданныхпонемногу растёт даже при нулевом балансе добавленных и удалённых записей с постоянной фиксацией транзакций, данные дефрагментируются, что может снизить производительность. Ощущается нехватка аналога команды

VACUUM, имеющейся в СУБД PostgreSQL.

Firebird не блокирует используемые файлы. Таким образом файл БД можно скопировать на сервере прямо во время многопользовательской работы. Как оказалось, некоторые клиенты именно так и поступают, называя подобное непотребство «резервным копированием». Проблема заключается в том, что во время копирования нет никакой гарантии нахожденияфайлавцелостномсостоянии, какиотсутствиянезавершённых транзакций. Наверное, все-таки лучше было бы предусмотреть блокирование, как дополнительную защиту «от дурака».

Наличие перечисленных проблем не позволяет поднять усреднённую планку использования выше чем уровень «СУБД рабочих групп и небольших предприятий», означающий для систем транзакционной обработки десятки пользователей при объёмах БД в десятки гигабайт. Но, вполне возможно, что и такого уровня будет достаточно для ваших приложений.

С другой стороны, с точки зрения программиста, Firebird представляет собой удобный СУБД-сервер: простой в установке, нетребовательный к

21

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

Основные модели данных: иерархическая, сетевая, реляционная

Для реализаций универсальных СУБД в течение многих лет и по настоящий момент доминирует реляционная модель. Несмотря на то, что вы, возможно, и не столкнётесь с СУБД иных типов, нелишним будет знать о существовании других миров. Например, чтобы понимать, соответствуют ли реалиям заявления продавцов о «новых подходах и концепциях».

Иерархическая модель

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

ПродуктIMS (Information Management System) фирмыIBM, считающийся первой промышленной СУБД, реализует именно иерархическую модель. Разработанная в 1966 году, эта СУБД до сих пор эксплуатируется на новейших мэйнфреймах серии Z, обеспечивая высокую производительность обработки порядка сотни тысяч транзакций в секунду.

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

22

«движки» и API для манипуляции со структурами, созданными на основе этой технологии с обязательным применением схем определения данных.

Последний пункт важен: без использования XML-схемы (XML schema) или описания типов DTD (Data Type Definition) документ XML относится к неполно структурированным моделям данных, рассматриваемым в следующей главе.

Если взглянуть на структуру XML-документа, то иерархия элементов данных становится видна, что называется, невооружённым глазом.

<?xml version="1.0"?> <sales>

<orders>

<order>

<num>S01</num> <date>2014-02-20</date> <client>

<name>Пирожки ООО</name>

<address>ул. Благодатная 235</address> <phone>322-223-322</phone>

</client>

<items>

<product> <name>Мука</name> <quantity>50</quantity> <units>кг</units> <price>45</price>

</product>

<product> <name>Дрожжи</name> <quantity>300</quantity> <units>г</units> <price>80</price>

</product>

</items>

</order>

<order>

<num>S02</num> <date>2014-02-21</date> <client>

<name>Пирожки ООО</name>

<address>ул. Благодатная 235</address> <phone>322-223-322</phone>

23

</client>

<items>

<product> <name>Мука</name> <quantity>70</quantity> <units>кг</units> <price>40</price>

</product>

<product> <name>Дрожжи</name> <quantity>500</quantity> <units>г</units> <price>75</price>

</product>

</items>

</order>

</orders>

</sales>

В приведённом примере БД описания продаж имеет иерархическую структуру. Все описываемые сущности являются вложенными в сущность более высокого уровня организации, что вызывает определённые неудобства хранения: приходится дублировать информацию.

Преимуществом такой структуры является возможность выполнения поисковых запросов без соединений. Например, чтобы выбрать все заказы клиента «Пирожки ООО», в которых он покупал муку в количестве более 50 кг, язык XPath8 позволяет сделать в программе следующее:

var nodes = xmlDoc.SelectNodes( "/sales/orders/order[client/name='Пирожки ООО' and

items/product[name = 'Мука']/quantity > 50]");

foreach(node in nodes) {

...

}

Однако, с точки зрения расширяемости и поддержки целостности такая структура малопригодна. В рамках реляционной модели мы бы констатировали, что она денормализована, о чем будет сказано позже в разделе, посвящённом проектированию. Например, при добавлении оплат

8

XPath (от англ. XML Path Language) — язык запросов к элементам XML-документа.

 

24

потребуется создавать новый тег описаний <payment> и включать их в составзаказов(orders). Однако, один платёжможетпокрывать более одного заказа и наоборот. Если же у клиента изменился адрес или телефон, то необходимо сделать соответствующие изменения во всех тегах <client>.

Частично, эта проблема решается введением ссылок на элементы XMLдокумента.

<?xml version="1.0"?> <sales>

<clients>

<client>

<id>1</id> <name>Пирожки ООО</name>

<address>ул. Благодатная 235</address> <phone>322-223-322</phone>

</client>

</clients>

<orders>

<order>

<num>S01</num> <date>2014-02-20</date> <id_client>1</id_client> <items>

<item> <id_product>1</id_product> <quantity>50</quantity> <units>кг</units> <price>45</price>

</item>

<item> <id_product>2</id_product> <quantity>300</quantity> <units>г</units> <price>80</price>

</item>

</items>

</order>

<order>

<num>S02</num> <date>2014-02-21</date> <id_client>1</id_client> <items>

<item>

25

<id_product>1</id_product> <quantity>70</quantity> <units>кг</units> <price>40</price>

</item>

<item> <id_product>2</id_product> <quantity>500</quantity> <units>г</units> <price>75</price>

</item>

</items>

</order>

</orders>

<products>

<product>

<id>1</id> <name>Мука</name>

</product>

<product>

<id>2</id> <name>Дрожжи</name>

</product>

</products>

</sales>

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

var nodes = xmlDoc.SelectNodes( "/sales/orders/order[id_client = /sales/clients/client[name

= 'Пирожки ООО']/id and items/item[id_product = /sales/products/product[name = 'Мука']/id and quantity > 50]]");

foreach(node in nodes) {

...

}

На XML-документах небольшого размера с сотнями элементов подобные запросы выполняются быстро, но с ростом объёма данных неизбежно возникает необходимость их индексировать. В СУБД, поддерживающих XML хотя бы на уровне типа данных колонки таблицы, имеется

26

возможность такой индексации. Например, в MS SQL Server вначале строится так называемый первичный XML-индекс, затем несколько вторичных, для которых нужно указывать их специализацию: PATH для запросов типа проверки существования элементов, PROPERTY — для извлечения значений элементов и атрибутов или VALUE — для сквозного поиска элементов по значению. Без достаточного понимания таких особенностей физической организации данных хранилище XML начнёт испытывать проблемы с производительностью уже на небольших объёмах.

Кроме XML и поддерживающих его СУБД существуют и другие реализации. Наиболее известная отечественная разработка — СУБД ИНЕС [16], являвшаяся фактически стандартом на советских ЭВМ серии ЕС. К сожалению, эволюция системы прервалась вместе с прекращением выпуска своих ЭВМ, до наших дней этот продукт не дожил.

К иерархическим также можно отнести СУБД на базе подхода MUMPS9 (в СССР назывался «ДИАМС»), лежащий в основе линейки продуктов

InterSystems: от выпущенной в 1970-х годах СУБД ISM (InterSystem M),

черезOpenM периода1980-хкСУБДCache сконца1990-хипонашевремя, реализующей современные подходы к организации иерархий [22].

Так, например, в MUMPS можно обращаться к значениям полей:

SET ^Автомобиль("Корпус","Дверь","Цвет")="Синий"

Здесь сущность «Автомобиль» представлена в виде дерева, одним из верхних узлов которого является элемент «Корпус», в состав которого, в свою очередь, входит «Дверь», имеющая пока ещё листовой узел «Цвет».

Иерархию несложно динамически расширять как в ширину:

SET ^Автомобиль("Корпус","Крышка капота")=2

так и в глубину:

SET ^Автомобиль ("Корпус","Дверь","Цвет","Отражение")="Матовый"

9MUMPS — Massachusetts General Hospital Utility Multi-Programming System, позднее Multi-User Multi-Programming System, разработка датирована 1966 годом.

27

Общий принцип распознавания лежащей в основе СУБД иерархической модели можно сформулировать так.

Еслиприиспользованиивходногоязыкаи/илиAPI наиболеенизкогоуровня из доступных программисту для доступа к данным (значениям узлов,

переменных, полей и т. д.) требуется указывать некоторый путь, то лежащая в основе СУБД модель базируется на иерархиях.

Иерархическая модель: плюсы и минусы

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

При переходе к сложным многосвязным структурам и произвольным запросам начинают всплывать недостатки модели. Прежде всего, это медленный доступ к данным нижних уровней иерархии, что нетрудно заметить на примерах запросов с XML и в особенностях реализации индексовСУБД, поддерживающихXML вкачестве встроенного типа. Втех же примерах видна и чёткая ориентация структур на определённые типы запросов, чтоисключаетуниверсальностьиспользованияоднойитойжеБД разными типами приложений.

С теоретической точки зрения, используемая иерархическими СУБД модель графов ограничена деревьями, что сужает область её применения. Если структура связей сложна, то попытка втиснуть эту сложность в прокрустово ложе иерархий рождает на свет громоздкие описания, трудные для понимания специалистами и пользователями.

Сетевая модель

Сетевая модель, также относящаяся к теоретико-графовым, явилась развитием подходов, реализованных в модели иерархической. Прежде всего, развитие касается связей между записями, имеющих двунаправленный характер. Сетевую модель можно представить в виде графа с узлами в виде записей, и рёбрами, отображающими наборы. Направление и характер связи в сетевых БД не являются очевидными, как в

28

иерархических БД, поэтому характеристики и направление связей должны указываться явно при описании БД.

В 1975 году конференция CODASYL (Conference of Data System Languages) стандартизовалабазовыепонятияиформальныйязыкописания. Широко известной системой, основанной на сетевой модели данных,

являлась СУБД IDMS (Integrated Database Management System),

использовавшаяся на мэйнфреймах IBM. В настоящее время IDMS принадлежит компании Computer Associates, имеющей неформальный статус «лавки старьёвщика» в мире софтостроения: как правило, все купленные компанией продукты берутся на сопровождение, но не развиваются, доживая до своего естественного конца.

Несмотря на некоторые интересные особенности и преимущества, до наших дней дожило только небольшое число СУБД, реализующих сетевую модель, например американская Raima (бывшая dbVista) и отечественная КроносПро. На их примере также можно проследить эволюцию программных продуктов класса сетевых СУБД.

СУБД Raima изначально использовалась, как встроенная с достаточно низкоуровневым API для языка Си. Постепенно, в систему был добавлен интерфейс доступа на SQL, а сама СУБД получила возможность работы в режиме клиент-сервер. По-прежнему Raima используется для транзакционных приложений каклёгкое (lightweight) кросс-платформенное решение.

Напротив, развитие СУБД Кронос пошло в сторону аналитической обработки. Это та область, где преимущества сетевой модели могут быть использованы полнее, а недостатки обойдены более просто. Для объяснений нам все же придётся кратко познакомиться с основными понятиями сетевой модели.

Термин запись соответствует аналогичному понятию структурного типа в традиционных языках программирования: record в Паскаль-подобных или struct в наследниках Си.

29

Набор данных служит для связывания двух типов записей отношением «один-ко-многим».

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

В СУБД Кронос также реализовано объединение наборов, позволяющее одной записи ссылаться на записи двух и более типов. Такая возможность очень удобна при моделировании. Например, если имеется тип записи «Адрес», который используется записями «Лица» и «Организации», то объединённый набор «Относится к лицу или организации» отобразит все возможные связи.

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

Поясню на упрощённом примере. Связь между двумя таблицами в реляционной модели осуществляется по значениям, соответственно, первичного и внешних ключей. Для выбранной строки подчинённой таблицы берётся значение внешнего ключа, которое затем ищется среди значений первичного ключа главной таблицы. Если таблица отсортирована в физическом порядке следования значений первичного ключа (так называемый кластерный ключ, подробнее см. «Физическая организация памяти»), то строка данных находится в той же области памяти, что и найденное значение. Если нет, то происходит дополнительный поиск связанной со значением первичного ключа строки по её идентификатору

(row id).

30