За что отвечает ядро субд. Основные функции субд

Организация типичной СУБД и состав ее компонентов соответ­ствует набору функций. Логически в современной СУБД можно выделить внутреннюю часть - ядро СУБД (Data Base Engine), ком­пилятор языка БД (обычно SQL), подсистему поддержки времени выполнения, набор утилит.

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

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

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



В отдельные утилиты обычно выделяют такие процедуры, кото­рые слишком накладно выполнять с использованием языка БД, на­пример загрузка БД, сбор статистики, глобальная проверка целост­ности. Утилиты программируются с использованием ядра СУБД, а иногда с проникновением внутрь ядра.

Языковые средства систем управления

Базами данных

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

Реализация языковых средств интерфейсов может быть осуще­ствлена различными способами:

для высококвалифицированных пользователей языковые сред­ства представляются в их явной синтаксической форме;

в других случаях функции языков могут быть доступны косвен­ным образом, когда они реализуются в форме различного рода меню, диалоговых сценариев или заполняемых пользователем таблиц. По таким входным данным интерфейсные средства формируют адекват­ные синтаксические конструкции языка интерфейса и передают их на исполнение или включают в генерируемый код языка приложе­ния. Интерфейсы с неявным использованием языка широко исполь­зуются в СУБД для персональных ЭВМ. В этом случае используется (для реляционных СУБД), например, табличный язык Query-By-Example (QBE), разработанный М.Злуфом.

Языковые средства используются для выполнения двух основ­ных функций:

для описания представления базы данных на управляемых уров­нях архитектуры системы;

для инициирования выполнения операций манипулирования данными.

Первая из этих функций обеспечивается языком описания данных (ЯОД, Shema Definision Language), Его часто называют языком опре­деления данных. Описание данных средствами ЯОД называют схе­мой базы данных. Оно включает описание логической структуры данных и налагаемых на нее ограничений целостности в рамках тех правил, которые регламентированы моделью данных используемой СУБД. Помимо указанных функций, ЯОД некоторых СУБД обеспе­чивает возможности задания ограничения доступа к данным или пол­номочий пользователей.

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

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

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

Язык манипулирования данными (ЯМД, Shema Manipulation Language) позволяет запрашивать предусмотренные в системе опера­ции над данными из базы данных, т.е. содержит набор операторов манипулирования данными, позволяющий заносить данные, удалять, модифицировать или выбирать их. Аналогично ЯОД, ЯМД не обяза­тельно выступает в качестве синтаксически самостоятельного языка СУБД.

В настоящее время имеются многочисленные примеры языков СУБД, объединяющих возможности описания данных и манипули­рования данными в единых синтаксических рамках. Более того, в современных СУБД обычно поддерживается единый интегрированный язык, содержащий все необходимые средства для работы с ба­зой данных, начиная от"ее создания, и обеспечивающий базовый пользовательский интерфейс с базами данных. Наиболее популяр­ным и стандартным для реляционных СУБД является язык SQL (Structured Query Language), разработанный фирмой IBM и реализо­ванный в реляционной СУБД System R, а впоследствии и в коммер­ческой системе DB2. Другим примером языков этого класса могут служить: язык Quel системы Ingres, созданный Калифорнийским университетом, языковые средства большинства СУБД для персо­нальных ЭВМ, например язык dBase семейства СУБД фирмы Asthon-Tate и многочисленных совместимых с ним систем, язык СУБД: R:Base фирмы Microrim.

Некоторые СУБД располагают такими языками, которые не только реализуют функции определения и манипулирования данны­ми, но и обладают управляющими структурами и другими средства­ми, свойственными традиционным языкам программирования. Бла­годаря этому они могут использоваться как функционально полное средство для создания прикладных программ и для.формулировки запросов пользователей к БД. Такие языки называют автономными (язык запросов). В качестве примера приведем ранее упоминавшийся язык dBase, построенный в стиле структурного программирования.

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

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

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

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

Изучение простейших возможностей языков конечных пользо­вателей не требует больших затрат времени. Такой уровень подготов­ки (обычно 1-3 дня) позволит пользователю разрабатывать неслож­ные приложения.

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

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

Язык QBE

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

Для пользователя решение основных задач производится через таблицу-шаблон, связанную с реальной БД.

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

Язык SQL

Сами по себе данные в компьютерной форме не представляют интерес для пользователя, если отсутствуют средства доступа к ним. Доступ осуществляется в виде запросов, которые формулируются на стандартном языке запросов. Сегодня для большинства СУБД таким языком является SQL.

Его появление и развитие как средства описания доступа к БД связано с созданием теории реляционных БД. Прообраз языка воз­ник в 1970 г. в лаборатории Санта-Тереза фирмы IBM в рамках научно-исследовательского проекта System/R. Сегодня - это фактичес­кий стандарт интерфейса с современными СУБД. Популярность его настолько велика, что разработчики нереляционных СУБД (напри­мер, ADABAS), снабжают свои системы SQL-интерфейсом.

Язык SQL имеет официальный стандарт - ANSI/ISO. Большин­ство разработчиков придерживаются этого стандарта, однако часто расширяют его для реализации новых возможностей обработки дан­ных.

SQL не является языком программирования в традиционном представлении. На нем пишутся не программы, а запросы к базе данных. Поэтому это язык декларативный. Это означает, что с его помощью можно сформулировать, что необходимо получить, однако нельзя указать, как это следует сделать. В частности, в отличие от процедурных языков программирования (Си, Паскаль), в языке SQL отсутствуют такие операторы, как if/then/else.

Запрос в языке SQL состоит из одного или нескольких операто­ров, следующих один за другим и разделенных точкой с запятой. Наиболее важные выделены в стандарте ANSI/ISO SQL.

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

Повторяем, что SQL - это язык запросов, поэтому на нем невоз­можно написать достаточно сложные прикладные программы, кото­рые работают с базой данных. Для этой цели в современных СУБД используют язык четвертого поколения (FGL - Forth Generation Language), обладающий основными возможностями процедурных языков третьего поколения (Си, Паскаль), возможностью встроить текст программы оператора SQL, и средствами управления интер­фейсом пользователя (формами, меню, вводом пользователя и т.д.). Сегодня - FGL - это один из фактических стандартов разработки приложений, работающих с БД.

Первый стандарт этого языка появился в 1989 г. - SQL-89 - и поддерживался практически всеми коммерческими реляционными СУБД. Он имел весьма общий характер и допускал широкое толко­вание. Достоинствами SQL-89 можно считать стандартизацию син­таксиса и семантики операторов выборки и манипулирования дан­ными, а также фиксацию средств ограничения целостности базы данных. Однако в нем отсутствовали такие важные разделы, как ма­нипулирование схемой БД и динамический SQL.

Неполнота стандарта SQL-89 привела к появлению в 1992 г. сле­дующей версии языка SQL. SQL-92 охватывает практически все не­обходимые проблемы: манипулирование схемой базы данных, управ­ление транзакциями и сессиями, динамический SQL. В стандарте существуют три уровня: базовый, промежуточный и полный. Только в. последнее" время СУБД ведущих производителей обеспечивается совместимость с полным вариантом языка.

Появление новых требований пользователей к СУБД и обраба­тываемым данным привели к тому, что в настоящее время ведется работа по разработке SQL 3. Эта версия языка, видимо, будет иметь в своем составе механизм триггеров, определение произвольного типа данных, серьезные объекты расширения. Пока же крупнейшие производители СУБД затягивают разработку этого стандарта, совер­шенствуя и расширяя собственные версии языка SQL.

Естественно, организация типичной СУБД и состав ее компонентов соответствует рассмотренному нами набору функций. Напомним, что мы выделили следующие основные функции СУБД:

  • управление данными во внешней памяти;
  • управление буферами оперативной памяти;
  • управление транзакциями;
  • журнализация и восстановление БД после сбоев;
  • поддержание языков БД.

Логически в современной реляционной СУБД можно выделить наиболее внутреннюю часть - ядро СУБД (часто его называют Data Base Engine), компилятор языка БД (обычно SQL), подсистему поддержки времени выполнения, набор утилит. В некоторых системах эти части выделяются явно, в других - нет, но логически такое разделение можно провести во всех СУБД.

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

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



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

Пример: System R

Основными целями разработчиков System R являлись следующие:

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

Структурная организация System R вполне согласуется с поставленными при ее разработке целями. Основными структурными компонентами System R являются система управления реляционной памятью (Relational Storage System - RSS) и компилятор запросов языка SQL. RSS обеспечивает интерфейс довольно низкого, но достаточного для реализации SQL уровня для доступа к хранимым в базе данным. Синхронизация транзакций, журнализация изменений и восстановление баз данных после сбоев также относятся к числу функций RSS. Компилятор запросов использует интерфейс RSS для доступа к разнообразной справочной информации (каталогам отношений, индексов, прав доступа, условий целостности, условных воздействий и т.д.) и производит рабочие программы, выполняемые в дальнейшем также с использованием интерфейса RSS. Таким образом, система естественно разделяется на два уровня - уровень управления памятью и синхронизацией, фактически, не зависящий от базового языка запросов системы, и языковой уровень (уровень SQL), на котором решается большинство проблем System R. Заметим, что эта независимость скорее условная, чем абсолютная: язык SQL можно заменить на другой язык, но он должен обладать примерно такой же семантикой.

Вспомогательные службы

Поддержка независимости от данных

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

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

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

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

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

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

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

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

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

Естественно, организация типичной СУБД и состав ее компонентов соответствует рассмотренному нами набору функций. Напомним, что мы выделили следующие основные функции СУБД:

  • управление данными во внешней памяти;
  • управление буферами оперативной памяти;
  • управление транзакциями;
  • журнализация и восстановление БД после сбоев;
  • поддержание языков БД.

Логически в современной реляционной СУБД можно выделить наиболее внутреннюю часть - ядро СУБД (часто его называют Data Base Engine), компилятор языка БД (обычно SQL), подсистему поддержки времени выполнения, набор утилит. В некоторых системах эти части выделяются явно, в других - нет, но логически такое разделение можно провести во всех СУБД.



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

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

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

2.3. «Компоненты среды СУБД» стр.(51)

Типовая организация современной СУБД

Системы управления БД

Файловые системы.

Первые АИС появились в 60е гг. В основе лежали файловые системы.Файловые системы – набор программ, предназначенных для решения той или иной задачи. Со временем стали очевидны следующие недостатки файловых систем:

1) Разделение и изоляция данных. Данные изолированы в отдельных файлах, что требует значительных трудозатрат при извлечении информации, часто - выполнения синхронной обработки нескольких файлов.

2) Дублирование данных. Файлы разных систем могли пересекаться, т.е. содержать одни и те же данные. Это приводило к неэкономному использованию дисковой памяти или к нарушению целостности данных (например, сведения о сотруднике организации, формируемые в отделе кадров и в бухгалтерии могут стать противоречивыми).

3) Зависимость от данных. Программы на алгоритмическом языке содержат описание данных, то при изменении их структуры приходилось изменять исходные тексты программ

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

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

История развития.

Разработчики (и пользователи) поняли, что использовать только файлы очень накладно для производства, и стали искать пути решения появившихся проблем. Для этого была разработана сначала иерархическая модель данных. В середине 60-х годов корпорация IBM совместно с фирмой NAA (North American Aviation , в настоящее время -Rockwell International) разработали первую СУБД - иерархическую систему IMS (Information Management System). Суть иерархической системы заключалась в следующем: есть узел – совокупность данных, которые описывают какой-либо объект, все узлы связаны между собой строго в иерархическом порядке. У системы были свои преимущества (простота описания) и недостатки (дублирование данных).

Затем появилась сетевая модель данных. Основные понятия те же. Но появились более разнообразные связи.

В 1970 году британский ученый Эдгар Кодд выпустил работу «A Relational Model of Data for Large Shared Data Banks». Данная работа считается первым трудом по реляционному хранению данных. После ее выпуска начинаются активные работы по разработке данной системы хранения информации. В данное время активно разрабатываются Объектно-Ориентированные базы данных.

Функции СУБД

Непосредственное управление данными во внешней памяти.

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

Управление буферами оперативной памяти.

СУБД обычно работают с БД значительного размера; по крайней мере этот размер обычно существенно больше доступного объема оперативной памяти. Понятно, что если при обращении к любому элементу данных будет производиться обмен с внешней памятью, то вся система будет работать со скоростью устройства внешней памяти. Практически единственным способом реального увеличения этой скорости является буферизация данных в оперативной памяти. При этом, даже если операционная система производит общесистемную буферизацию (как в случае ОС UNIX), этого недостаточно для целей СУБД, которая располагает гораздо большей информацией о полезности буферизации той или иной части БД. Поэтому в развитых СУБД поддерживается собственный набор буферов оперативной памяти с собственной дисциплиной замены буферов. Заметим, что существует отдельное направление СУБД, которое ориентировано на постоянное присутствие в оперативной памяти всей БД. Это направление основывается на предположении, что в будущем объем оперативной памяти компьютеров будет настолько велик, что позволит не беспокоиться о буферизации. Пока эти работы находятся в стадии исследований.

Управление транзакциями.

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



Журнализация.

Одним из основных требований к СУБД является надежность хранения данных во внешней памяти. Под надежностью хранения понимается то, что СУБД должна быть в состоянии восстановить последнее согласованное состояние БД после любого аппаратного или программного сбоя. Обычно рассматриваются два возможных вида аппаратных сбоев: так называемые мягкие сбои, которые можно трактовать как внезапную остановку работы компьютера (например, аварийное выключение питания), и жесткие сбои, характеризуемые потерей информации на носителях внешней памяти. Примерами программных сбоев могут быть: аварийное завершение работы СУБД (по причине ошибки в программе или в результате некоторого аппаратного сбоя) или аварийное завершение пользовательской программы, в результате чего некоторая транзакция остается незавершенной. Первую ситуацию можно рассматривать как особый вид мягкого аппаратного сбоя; при возникновении последней требуется ликвидировать последствия только одной транзакции. Понятно, что в любом случае для восстановления БД нужно располагать некоторой дополнительной информацией. Другими словами, поддержание надежности хранения данных в БД требует избыточности хранения данных, причем та часть данных, которая используется для восстановления, должна храниться особо надежно. Наиболее распространенным методом поддержания такой избыточной информации является ведение журнала изменений БД. Журнал - это особая часть БД, недоступная пользователям СУБД и поддерживаемая с особой тщательностью (иногда поддерживаются две копии журнала, располагаемые на разных физических дисках), в которую поступают записи обо всех изменениях основной части БД. В разных СУБД изменения БД журнализуются на разных уровнях: иногда запись в журнале соответствует некоторой логической операции изменения БД (например, операции удаления строки из таблицы реляционной БД), иногда - минимальной внутренней операции модификации страницы внешней памяти; в некоторых системах одновременно используются оба подхода. Во всех случаях придерживаются стратегии "упреждающей" записи в журнал (так называемого протокола Write Ahead Log - WAL). Грубо говоря, эта стратегия заключается в том, что запись об изменении любого объекта БД должна попасть во внешнюю память журнала раньше, чем измененный объект попадет во внешнюю память основной части БД. Известно, что если в СУБД корректно соблюдается протокол WAL, то с помощью журнала можно решить все проблемы восстановления БД после любого сбоя. Самая простая ситуация восстановления - индивидуальный откат транзакции. Строго говоря, для этого не требуется общесистемный журнал изменений БД. Достаточно для каждой транзакции поддерживать локальный журнал операций модификации БД, выполненных в этой транзакции, и производить откат транзакции путем выполнения обратных операций, следуя от конца локального журнала. В некоторых СУБД так и делают, но в большинстве систем локальные журналы не поддерживают, а индивидуальный откат транзакции выполняют по общесистемному журналу, для чего все записи от одной транзакции связывают обратным списком (от конца к началу). При мягком сбое во внешней памяти основной части БД могут находиться объекты, модифицированные транзакциями, не закончившимися к моменту сбоя, и могут отсутствовать объекты, модифицированные транзакциями, которые к моменту сбоя успешно завершились (по причине использования буферов оперативной памяти, содержимое которых при мягком сбое пропадает). При соблюдении протокола WAL во внешней памяти журнала должны гарантированно находиться записи, относящиеся к операциям модификации обоих видов объектов. Целью процесса восстановления после мягкого сбоя является состояние внешней памяти основной части БД, которое возникло бы при фиксации во внешней памяти изменений всех завершившихся транзакций и которое не содержало бы никаких следов незаконченных транзакций. Для того, чтобы этого добиться, сначала производят откат незавершенных транзакций (undo), а потом повторно воспроизводят (redo) те операции завершенных транзакций, результаты которых не отображены во внешней памяти. Этот процесс содержит много тонкостей, связанных с общей организацией управления буферами и журналом. Более подробно мы рассмотрим это в соответствующей лекции. Для восстановления БД после жесткого сбоя используют журнал и архивную копию БД. Грубо говоря, архивная копия - это полная копия БД к моменту начала заполнения журнала (имеется много вариантов более гибкой трактовки смысла архивной копии). Конечно, для нормального восстановления БД после жесткого сбоя необходимо, чтобы журнал не пропал. Как уже отмечалось, к сохранности журнала во внешней памяти в СУБД предъявляются особо повышенные требования. Тогда восстановление БД состоит в том, что исходя из архивной копии по журналу воспроизводится работа всех транзакций, которые закончились к моменту сбоя. В принципе, можно даже воспроизвести работу незавершенных транзакций и продолжить их работу после завершения восстановления. Однако в реальных системах это обычно не делается, поскольку процесс восстановления после жесткого сбоя является достаточно длительным.

Поддержка языков БД.

Для работы с базами данных используются специальные языки, в целом называемые языками баз данных. В ранних СУБД поддерживалось несколько специализированных по своим функциям языков. Чаще всего выделялись два языка - язык определения схемы БД (SDL - Schema Definition Language) и язык манипулирования данными (DML - Data Manipulation Language). SDL служил главным образом для определения логической структуры БД, т.е. той структуры БД, какой она представляется пользователям. DML содержал набор операторов манипулирования данными, т.е. операторов, позволяющих заносить данные в БД, удалять, модифицировать или выбирать существующие данные. В современных СУБД обычно поддерживается единый интегрированный язык, содержащий все необходимые средства для работы с БД, начиная от ее создания, и обеспечивающий базовый пользовательский интерфейс с базами данных. Стандартным языком наиболее распространенных в настоящее время реляционных СУБД является язык SQL (Structured Query Language). Перечислим основные функции реляционной СУБД, поддерживаемые на "языковом" уровне (т.е. функции, поддерживаемые при реализации интерфейса SQL). Прежде всего, язык SQL сочетает средства SDL и DML, т.е. позволяет 25 определять схему реляционной БД и манипулировать данными. При этом именование объектов БД (для реляционной БД - именование таблиц и их столбцов) поддерживается на языковом уровне в том смысле, что компилятор языка SQL производит преобразование имен объектов в их внутренние идентификаторы на основании специально поддерживаемых служебных таблиц-каталогов. Внутренняя часть СУБД (ядро) вообще не работает с именами таблиц и их столбцов. Язык SQL содержит специальные средства определения ограничений целостности БД. Опять же, ограничения целостности хранятся в специальных таблицах-каталогах, и обеспечение контроля целостности БД производится на языковом уровне, т.е. при компиляции операторов модификации БД компилятор SQL на основании имеющихся в БД ограничений целостности генерирует соответствующий программный код. Специальные операторы языка SQL позволяют определять так называемые представления БД, фактически являющиеся хранимыми в БД запросами (результатом любого запроса к реляционной БД является таблица) с именованными столбцами. Для пользователя представление является такой же таблицей, как любая базовая таблица, хранимая в БД, но с помощью представлений можно ограничить или наоборот расширить видимость БД для конкретного пользователя. Поддержание представлений производится также на языковом уровне. Наконец, авторизация доступа к объектам БД производится также на основе специального набора операторов SQL. Идея состоит в том, что для выполнения операторов SQL разного вида пользователь должен обладать различными полномочиями. Пользователь, создавший таблицу БД, обладает полным набором полномочий для работы с этой таблицей. В число этих полномочий входит полномочие на передачу всех или части полномочий другим пользователям, включая полномочие на передачу полномочий. Полномочия пользователей описываются в специальных таблицах-каталогах, контроль полномочий поддерживается на языковом уровне. Более точное описание возможных реализаций этих функций на основе языка SQL будет приведено в разделах, посвященных языку SQL и его реализации.

Типовая организация современной СУБД

Естественно, организация типичной СУБД и состав ее компонентов соответствует рассмотренному нами набору функций. Напомним, что мы выделили следующие основные функции СУБД:

· управление данными во внешней памяти;

· управление буферами оперативной памяти;

· управление транзакциями;

· журнализация и восстановление БД после сбоев;

· поддержание языков БД.

Логически в современной реляционной СУБД можно выделить следующие компоненты СУБД:

Ядро СУБД (часто его называют Data Base Engine),

Компилятор языка БД (обычно SQL),

Подсистему поддержки времени выполнения,

Набор утилит.

В некоторых системах эти части выделяются явно, в других - нет, но логически такое разделение можно провести во всех СУБД. Ядро СУБД отвечает за управление данными во внешней памяти, управление буферами оперативной памяти, управление транзакциями и журнализацию. Соответственно, можно выделить такие компоненты ядра (по крайней мере, логически, хотя в некоторых системах эти компоненты выделяются явно), как менеджер данных, менеджер буферов, менеджер транзакций и менеджер журнала. Функции этих компонентов взаимосвязаны, и для обеспечения корректной работы СУБД все эти компоненты должны взаимодействовать по тщательно продуманным и проверенным протоколам. Ядро СУБД обладает собственным интерфейсом, не доступным пользователям напрямую и используемым в программах, производимых компилятором SQL (или в подсистеме поддержки выполнения таких про- грамм) и утилитах БД. Ядро СУБД является основной частью СУБД. При использовании архитектуры "клиент-сервер" ядро является основной составляющей серверной части системы.

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

Организация типичной СУБД и состав ее компонентов соответствует рассмотренному нами набору функций. Мы выделили следующие основные функции СУБД:

управление данными во внешней памяти;

управление буферами оперативной памяти;

управление транзакциями;

журнализация и восстановление БД после сбоев;

поддержание языков БД.

Логически в современной реляционной СУБД можно выделить наиболее внутреннюю часть - ядро СУБД (часто его называют Data Base Engine), компилятор языка БД (обычно SQL), подсистему поддержки времени выполнения, набор утилит. В некоторых системах эти части выделяются явно, в других - нет, но логически такое разделение можно провести во всех СУБД.

Ядро СУБД отвечает за управление данными во внешней памяти, управление буферами оперативной памяти, управление транзакциями и журнализацию. Соответственно можно выделить такие компоненты ядра (по крайней мере, логически, хотя в некоторых системах эти компоненты выделяются явно), как менеджер данных, менеджер буферов, менеджер транзакций и менеджер журнала. Функции этих компонентов взаимосвязаны, и для обеспечения корректной работы СУБД все эти компоненты должны взаимодействовать по тщательно продуманным и проверенным протоколам. Ядро СУБД обладает собственным интерфейсом, не доступным пользователям напрямую и используемым в программах, производимых компилятором SQL (или в подсистеме поддержки выполнения таких программ), и утилитах БД. Ядро СУБД является основной резидентной частью СУБД. При использовании архитектуры "клиент-сервер" ядро является основным составляющим серверной части системы.

Основная функция компилятора языка БД - компиляция операторов языка БД в некоторую выполняемую программу.

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

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

Ранние (дореляционные) субд

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

Мы ограничиваемся рассмотрением только общих подходов к организации двух типов ранних систем, а именно, иерархических и сетевых систем управления базами данных. Наиболее общие характеристики ранних систем:

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

b) Все ранние системы не основывались на каких-либо абстрактных моделях. Понятие модели данных фактически вошло в обиход специалистов в области БД только вместе с реляционным подходом. Абстрактные представления ранних систем появились позже на основе анализа и выявления общих признаков у различных конкретных систем.

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

e) Навигационная природа ранних систем и доступ к данным на уровне записей заставляли производить всю оптимизацию доступа к БД самого пользователя, без какой-либо поддержки системы.

f) После появления реляционных систем большинство ранних систем было оснащено "реляционными" интерфейсами. Однако в большинстве случаев это не сделало их по-настоящему реляционными системами, поскольку оставалась возможность манипулировать данными в естественном для них режиме.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: