2008 г.
Базы данных. Вводный курс
Сергей Кузнецов
Назад Содержание Вперёд
12.2. Основные понятия, цели и общая организация System R
Поскольку
обсуждение принципов внутренней организации реляционных (точнее,
SQL-ориентированных)
СУБД в этой книге проводится в контексте System
R,
начнем с рассмотрения основных понятий этой системы.
12.2.1. Используемая терминология
Несмотря
на то, что при реализации System
R
использовался подход, несколько отличающийся от реляционного подхода
Кодда (отсюда и пошли расхождения между реляционной моделью данных и
моделью данных SQL),
мы будем активно пользоваться терминами реляционной модели. К таким
терминам относятся названия реляционных операций –
ограничение, проекция, соединение; названия теоретико-множественных
операций – объединение, пересечение, взятие разности и т.д.
В
тех случаях, когда терминология System R расходится с реляционной
терминологией, предпочтение будет отдаваться терминологии System R.
В частности, это касается использования термина «поле таблицы»
вместо термина «атрибут отношения». В самой System R при
переходе к коммерческим системам также произошла некоторая смена
терминологии. В частности, появилась тенденция к употреблению
терминов, более привычных в среде пользователей IBM: файл, запись и
т.д. Здесь будут использоваться термины System R, более близкие
реляционным системам. Опишем некоторые основные термины System R,
опираясь в
основном не на теоретические соображения, а на практические аспекты
соответствующих понятий.
Базовым
понятием System R является понятие таблицы
(приближенный к реализации аналог основного понятия реляционного
подхода отношения;
иногда, в зависимости от контекста, мы будем использовать и этот
термин). Таблица – это регулярная структура данных, состоящая
из конечного набора однотипных записей – кортежей. Каждый
кортеж одной таблицы состоит из конечного (и одинакового) числа
полей кортежа, причем i-тое
поле каждого кортежа одной таблицы может содержать данные только
одного типа, и набор допустимых типов данных в System R
предопределен и фиксирован.
В
силу регулярности структуры таблицы понятие поля кортежа расширяется
до понятия поля таблицы. Тогда i-тое
поле таблицы можно трактовать как набор одноместных кортежей,
полученных выборкой i-тых
полей из каждого кортежа этой таблицы, т.е. в общепринятой
терминологии как проекцию таблицы на i-тый
атрибут. В терминологию System R не входит понятие домена, оно
заменяется здесь понятием типа поля, т.е. типом данных, хранение
которых в данном поле допускается (это не вполне эквивалентная
замена, но такова реальность System R).
Таблицы,
составляющие базу данных System R, могут физически храниться в одном
или нескольких сегментах, каждому из которых соответствует отдельный
файл внешней памяти. Сегменты разбиваются на страницы, в которых
располагаются кортежи таблиц и вспомогательные служебные структуры
данных – индексы. Соответственно, каждый сегмент содержит две
группы страниц – страницы данных и страницы индексной
информации. Страницы каждой группы имеют фиксированный размер, но
страницы с индексной информацией меньше по размеру, чем страницы
данных. В страницах данных могут располагаться кортежи более чем
одной таблицы (это очень важное свойство физической организации баз
данных System R; следующие из этой организации преимущества
разъясним позже).
Этим, конечно, не
исчерпывается набор понятий System R, но остальные термины мы будем
пояснять по ходу изложения, поскольку для этого требуется
соответствующий понятийный контекст.
12.2.2. Цели System R и их связь с общей организацией системы
При
выполнении проекта System
R
преследовались следующие основные цели:
- обеспечить
ненавигационный интерфейс высокого уровня пользователя с системой,
позволяющий достичь независимости данных и дать возможность
пользователям работать максимально эффективно;
- обеспечить
многообразие допустимых способов использования СУБД, включая
программируемые транзакции, диалоговые транзакции и генерацию
отчетов;
- поддерживать
динамически изменяемую среду баз данных, в которой таблицы, индексы,
представления, транзакции и другие объекты могут легко добавляться и
уничтожаться без приостановки нормального функционирования системы;
- обеспечить
возможность параллельной работы с одной базой данных многих
пользователей, допуская параллельную модификацию объектов базы
данных при наличии необходимых средств защиты целостности базы
данных;
- обеспечить
средства восстановления согласованного состояния баз данных после
разного рода сбоев аппаратуры или программного обеспечения;
- обеспечить
гибкий механизм, позволяющий определять различные представления
хранимых данных и ограничивать этими представлениями доступ
пользователей к базе данных по выборке и модификации на основе
механизма авторизации;
- обеспечить
производительность системы при выполнении упомянутых функций,
сопоставимую с производительностью существующих СУБД низкого уровня.
Прежде всего,
отметим, что при разработке System R поставленные цели в основном
были достигнуты. Рассмотрим теперь, какими средствами удалось
достичь этих целей, и как можно более точно интерпретировать их в
контексте System R.
Основой
System R является «реляционный» язык SEQUEL (который
достаточно быстро был переименован в SQL). Заметим, что разработчики
System
R
искренне считали созданный ими язык реляционным; однако, как
отмечалось в предыдущих
лекциях
и будет более детально показано в заключительных
лекциях,
в этом языке в действительности нарушаются многие важные принципы
реляционной модели данных. Иногда его называют языком запросов или
языком манипулирования данными, но на самом деле возможности SQL
гораздо шире. Средствами SQL (с соответствующей системной
поддержкой) решаются многие из поставленных целей. Язык SQL включает
средства динамической компиляции запросов, на основе чего возможно
построение диалоговых систем обработки запросов. Допускается
динамическая параметризация статически откомпилированных запросов, в
результате чего возможно построение эффективных (не требующих
динамической компиляции) диалоговых систем со стандартными наборами
(параметризуемых) запросов. Средствами SQL определяются все
доступные пользователю объекты баз данных: таблицы, индексы,
представления. Имеются средства уничтожения любого такого объекта.
Соответствующие операторы языка могут выполняться в любой момент, и
возможность выполнения операции данным пользователем зависит от
ранее предоставленных ему прав.
Что
касается целостности баз данных, то в System R под целостным
состоянием базы данных понимается состояние, удовлетворяющее набору
сохраняемых при базе данных предикатов целостности. Эти предикаты,
называемые в System R утверждениями
целостности
(assertion), также задаются средствами языка SQL. Любой оператор
языка выполняется в границах некоторой транзакции
– последовательности операторов языка, неделимой в смысле
состояния базы данных. Неделимость означает, что все изменения базы
данных, произведенные в пределах одной транзакции, либо целиком
отображаются в состоянии базы данных, либо полностью в нем
отсутствуют. Последняя возможность возникает при откате
транзакции, который может произойти по инициативе пользователя (при
выполнении соответствующего оператора SQL) или по инициативе
системы.
Одной
из причин отката транзакции по инициативе системы является как раз
нарушение целостности базы данных в результате действий данной
транзакции (другие возможные условия отката транзакции по инициативе
системы мы рассмотрим позже). Язык SQL System R (так мы будем
называть вариант языка SQL,
разработанный в проекте System
R,
чтобы отличать его от более поздних, «стандартных»
вариантов этого языка) содержит средство установки так называемых
точек
сохранения
(savepoint). При инициируемом пользователем откате транзакции можно
указать номер точки сохранения, выше которого откат не
распространяется. Инициируемый системой откат транзакции
производится до ближайшей точки сохранения, в которой условие,
вызвавшее откат, уже отсутствует. В частности, откат транзакции,
инициированный по причине нарушения условия целостности,
производится до ближайшей точки сохранения, в которой условия
целостности соблюдены.
Естественно,
что для реального выполнения отката транзакции необходимо запоминать
некоторую информацию о выполнении транзакции. В System R для этих и
других целей используется специальный набор данных – журнал,
в который помещаются записи обо всех операциях всех транзакций,
изменяющих состояние базы данных. При откате транзакции происходит
процесс обратного
выполнения
транзакции (undo), в ходе которого в обратном порядке выполняются
все изменения, запомненные в журнале.
В
языке SQL System R имеется средство определения так называемых
триггеров
(trigger), позволяющих автоматически поддерживать целостность базы
данных при модификациях ее объектов. В SQL System R триггер –
это каталогизированная операция модификации, для которой задано
условие ее автоматического выполнения. Особенно существенно наличие
такого механизма в связи с наличием обсуждаемых ниже представлений
базы данных, которыми может быть ограничен доступ к базе данных для
ряда пользователей. Возможна ситуация, когда такие пользователи
просто не могут соблюдать целостность базы данных без
автоматического выполнения условных воздействий, поскольку они
просто «не видят» всей базы данных и, в частности, не
могут представить всех ограничений ее целостности.
Язык SQL содержит
средства определения представлений. Представление – это
каталогизированный именованный запрос на выборку данных (из одной
или нескольких таблиц). Поскольку SQL – это «реляционный»
язык, результатом выполнения любого запроса на выборку является
таблица, и поэтому концептуально можно относиться к любому
представлению как к таблице (при определении представления можно, в
частности, присвоить имена полям этой таблицы). В языке допускается
использование ранее определенных представлений практически везде,
где допускается использование таблиц (с некоторыми ограничениями по
поводу возможностей модификации через представления). Наличие
возможности определять представления в совокупности с развитой
системой авторизации позволяет ограничить доступ некоторых
пользователей к базе данных выделенным набором представлений.
Авторизация
доступа к базе данных также основана на средствах SQL. При создании
любого объекта базы данных пользователь, выполняющий эту операцию,
становится полновластным владельцем этого объекта, т.е. может
выполнять по отношению к этому объекту любую допустимую операцию
SQL.
Далее этот пользователь может выполнить оператор SQL, означающий
передачу всех его прав на этот объект (или их подмножества) любому
другому пользователю. В частности, этому пользователю может быть
передано право на передачу всех переданных ему прав (или их части)
третьему пользователю и т.д. Одним из прав пользователя по отношению
к объекту является право на изъятие у других пользователей всех или
некоторых прав, которые ранее им были переданы. Эта операция
распространяется транзитивно на всех дальнейших наследников этих
прав.
Наличие
в языке средств определения представлений и авторизации в принципе
позволяет обойтись при эксплуатации System R без традиционного
администратора баз данных, поскольку практически все системные
действия производятся на основе средств SQL. Тем не менее, если
организационно администратор баз данных требуется, то его работа
достаточно упрощается за счет унифицированного набора средств
управления. Кроме того, в System R каталоги баз данных
поддерживаются также в виде таблиц, и к ним применены все запросы
языка SQL. Заметим, что в более поздних SQL-ориентированных
СУБД появился ряд дополнительных утилит, не связанных с языком SQL
(например, утилиты сбора статистики или массовой загрузки базы
данных), и в этих системах, видимо, без администратора базы данных
не обойтись.
По части
обеспечения параллельной работы многих пользователей с одной базой
данных, основной подход System R состоит в том, что пользователь не
обязан знать о наличии других пользователей, конкурирующих с ним за
доступ к базе данных, т.е. система ответственна за обеспечение
изолированности пользователей с гарантией отсутствия их взаимного
влияния в пределах транзакций. Из этого следует, во-первых, что в
интерфейсе пользователя с системой (т.е. в языке SQL) не должно быть
средств регулирования взаимодействий с другими пользователями и,
во-вторых, что система должна обеспечить автоматическую сериализацию
набора транзакций, т.е. обеспечить режим выполнения этого набора
транзакций, эквивалентный по конечному результату некоторому
последовательному выполнению этих транзакций. Эта проблема решается
в System R за счет автоматического выполнения синхронизационных
блокировок всех изменяемых объектов базы данных.
Одним
из основных требований к СУБД вообще и к System
R в частности является
обеспечение надежности баз данных по отношению к различного рода
сбоям. К таким сбоям могут относиться программные ошибки прикладного
и системного уровня, сбои процессора, поломки внешних носителей и
т.д. В частности, к одному из видов сбоев можно отнести
упоминавшиеся выше нарушения целостности базы данных и
автоматический инициируемый системой откат транзакции – это
системное средство восстановления базы данных после сбоев такого
рода. Как уже отмечалось, такое восстановление происходит путем
обратного выполнения транзакции на основе информации о внесенных ею
изменениях, запомненной в журнале. На информации журнала также
основано восстановление базы данных и после сбоев другого рода.
Что
касается естественных требований к эффективности системы, то здесь
основные решения связаны со спецификой физической организации баз
данных во
внешней памяти, использованием техники индексированного доступа к
данным, буферизацией используемых страниц базы данных в основной
памяти и развитой техникой оптимизации SQL-запросов,
производимой на стадии их компиляции.
Структурная
организация System R согласуется с поставленными при ее разработке
целями и выбранными решениями. Основными структурными компонентами
System R являются система управления реляционными данными
(Relational
Data
System
– RDS),
состоящая, по существу, из компилятора языка SQL
и подсистемы поддержки откомпилированных операторов, и система
управления реляционной памятью (Relational Storage System –
RSS).
RSS
обеспечивает интерфейс довольно низкого, но достаточного для
реализации SQL уровня для доступа к хранимым в базе данным (этот
внутренний интерфейс System
R
напоминает внешний интерфейс систем, основанных на модели
инвертированных таблиц, см.
лекцию 2;
более подробно он описывается ниже). Синхронизация транзакций,
журнализация изменений и восстановление баз данных после сбоев также
относятся к числу функций RSS.
Компилятор запросов
использует интерфейс RSS для доступа к разнообразной справочной
информации (каталоги таблиц, индексов, прав доступа, условий
целостности, условных воздействий и т.д.) и производит рабочие
программы, выполняемые в дальнейшем также с использованием
интерфейса RSS.
Таким образом,
система естественно разделяется на два уровня – уровень
управления памятью и синхронизацией, фактически, не зависящий от
базового языка запросов системы, и языковый уровень (уровень SQL),
на котором решается большинство проблем System R. Заметим, что эта
независимость скорее условная, чем абсолютная: язык SQL можно в
принципе заменить каким-либо другим языком, но он должен обладать
примерно такой же семантикой.
Назад Содержание Вперёд