Прикладная информатика

Можно считать, что если
прикладная информационная система опирается на некоторую систему управления
данными, обладающую этими свойствами, то эта система управления данными является
Непосредственное управление данными во внешней памяти. Эта функция
включает обеспечение необходимых структур внешней памяти как для хранения
данных, непосредственно входящих в БД, так и для служебных целей, например, для
убыстрения доступа к данным в некоторых случаях (обычно для этого используются
индексы). Управление буферами оперативной памяти. СУБД обычно работают с БД
значительного размера; по крайней мере этот размер обычно существенно больше
доступного объема оперативной памяти. Понятно, что если при обращении к любому
элементу данных будет производиться обмен с внешней памятью, то вся система
будет работать со скоростью устройства внешней памяти. Практически единственным
способом реального увеличения этой скорости является буферизация данных в
оперативной памяти. Поэтому в развитых СУБД поддерживается собственный набор
буферов оперативной памяти с собственной дисциплиной замены
буферов. Управление транзакциями. Транзакция - это последовательность операций
над БД, рассматриваемых СУБД как единое целое. Либо транзакция успешно
выполняется, и СУБД фиксирует (COMMIT) изменения БД, произведенные этой
транзакцией, во внешней памяти, либо ни одно из этих изменений никак не
отражается на состоянии БД. Понятие транзакции необходимо для поддержания
логической целостности БД. Журнализация. Одним из основных требований к СУБД
является надежность хранения данных во внешней памяти. Под надежностью хранения
понимается то, что СУБД должна быть в состоянии восстановить последнее
согласованное состояние БД после любого аппаратного или программного сбоя.
Обычно рассматриваются два возможных вида аппаратных сбоев: так называемые
мягкие сбои, которые можно трактовать как внезапную остановку работы компьютера
(например, аварийное выключение питания), и жесткие сбои, характеризуемые
потерей информации на носителях внешней памяти. Поддержание надежности хранения
данных в БД требует избыточности хранения данных, причем та часть данных,
которая используется для восстановления, должна храниться особо надежно.
Наиболее распространенным методом поддержания такой избыточной информации
является ведение журнала изменений БД. Журнал - это особая часть БД, недоступная
пользователям СУБД и поддерживаемая с особой тщательностью (иногда
поддерживаются две копии журнала, располагаемые на разных физических дисках), в
которую поступают записи обо всех изменениях основной части БД. Во всех случаях
придерживаются стратегии "упреждающей" записи в журнал (так называемого
протокола Write Ahead Log - WAL). Самая простая ситуация восстановления -
индивидуальный откат транзакции. языками баз
данных . В современных СУБД обычно поддерживается единый интегрированный
язык, содержащий все необходимые средства для работы с БД, начиная от ее
создания, и обеспечивающий базовый пользовательский интерфейс с базами данных.
Стандартным языком наиболее распространенных в настоящее время реляционных СУБД
является язык SQL (Structured Query Language). Логически в современной реляционной СУБД можно выделить
наиболее внутреннюю часть - ядро СУБД (часто его называют Data Base Engine),
компилятор языка БД (обычно SQL), подсистему поддержки времени выполнения, набор
утилит. В некоторых системах эти части выделяются явно, в других - нет, но
логически такое разделение можно провести во всех СУБД. Ядро СУБД -
отвечает за управление данными во внешней памяти, управление буферами
оперативной памяти, управление транзакциями и журнализацию. Соответственно,
можно выделить такие компоненты ядра (по крайней мере, логически, хотя в
некоторых системах эти компоненты выделяются явно), как менеджер данных,
менеджер буферов, менеджер транзакций и менеджер журнала. Ядро СУБД обладает
собственным интерфейсом, не доступным пользователям напрямую и используемым в
программах, производимых компилятором SQL (или в подсистеме поддержки выполнения
таких программ) и утилитах БД. Ядро СУБД является основной резидентной частью
СУБД. При использовании архитектуры "клиент-сервер" ядро является основной
составляющей серверной части системы. В
отдельные утилиты БД обычно выделяют такие процедуры, которые слишком накладно
выполнять с использованием языка БД, например, загрузка и выгрузка БД, сбор
статистики, глобальная проверка целостности БД и т.д. Утилиты программируются с
использованием интерфейса ядра СУБД, а иногда даже с проникновением внутрь
ядра. Основная задача систем управления
распределенными базами данных состоит в обеспечении средства интеграции
локальных баз данных, располагающихся в некоторых узлах вычислительной сети, с
тем, чтобы пользователь, работающий в любом узле сети, имел доступ ко всем этим
базам данных как к единой базе данных. возможности
автономного функционирования при нарушениях связности сети или при
административных потребностях; Возможны
однородные и неоднородные распределенные базы данных. В однородном случае каждая
локальная база данных управляется одной и той же СУБД. В неоднородной системе
локальные базы данных могут относиться даже к разным моделям данных. Сетевая
интеграция неоднородных баз данных - это актуальная, но очень сложная проблема.
Многие решения известны на теоретическом уровне, но пока не удается справитьсяс
главной проблемой - недостаточной эффективностью интегрированных систем.
Легкость
использования системы достигается за счет того, что пользователи БД
(разработчики прикладных программ и конечные пользователи) работают в среде
определенного языка БД (например, SQL). Система автоматически обнаруживает
текущее местоположение упоминаемых в запросе пользователя объектов данных; одна
и та же прикладная программа, включающая предложения SQL, может быть выполнена в
разных узлах сети. При этом в каждом узле сети на этапе компиляции запроса
выбирается наиболее оптимальный план выполнения запроса в соответствии с
расположением данных в распределенной системе. Обеспечение автономности узлов
сети достигается за счет того, что каждая локальная база данных администрируется
независимо от других. Возможны автономное подключение новых пользователей, смена
версии автономной части системы и т.д. Система спроектирована таким образом, что
в ней не требуются централизованные службы именования объектов или обнаружения
тупиков. В индивидуальных узлах не требуется наличие глобального знания об
операциях, выполняющихся в других узлах сети; работа с доступными базами данных
может продолжаться при выходе из строя отдельных узлов сети или линий
связи. Возможность
перемещения удаленных отношений в локальную базу данных. На использовании разновидностей ER-модели основано большинство
современных подходов к проектированию баз данных (главным образом, реляционных).
Модель была предложена Ченом (Chen) в 1976 г. Моделирование предметной области
базируется на использовании графических диаграмм, включающих небольшое число
разнородных компонентов. В связи с наглядностью представления концептуальных
схем баз данных ER-модели получили широкое распространение в системах CASE,
поддерживающих автоматизированное проектирование реляционных баз данных.
Основными понятиями ER-модели являются Сущность - это реальный или представляемый объект, информация о котором
должна сохраняться и быть доступна. В диаграммах ER-модели сущность
представляется в виде прямоугольника, содержащего имя сущности. При этом имя
сущности - это имя типа, а не некоторого конкретного экземпляра этого типа. Для
большей выразительности и лучшего понимания имя сущности может сопровождаться
примерами конкретных объектов этого типа. Каждый экземпляр сущности должен быть
отличим от любого другого экземпляра той же сущности. Связь - это
графически изображаемая ассоциация, устанавливаемая между двумя сущностями. Эта
ассоциация всегда является бинарной и может существовать между двумя разными
сущностями или между сущностью и ей же самой (рекурсивная связь). В любой связи
выделяются два конца (в соответствии с существующей парой связываемых
сущностей), на каждом из которых указывается имя конца связи, степень конца
связи (сколько экземпляров данной сущности связывается), обязательность связи
(т.е. любой ли экземпляр данной сущности должен участвовать в данной связи).
Связь представляется в виде линии, связывающей две сущности или ведущей от
сущности к ней же самой. При это в месте "стыковки" связи с сущностью
используются трех точечный вход в прямоугольник сущности, если для этой сущности
в связи могут использоваться много (many) экземпляров сущности, и одноточечный
вход, если в связи может участвовать только один экземпляр сущности.
Обязательный конец связи изображается сплошной линией, а необязательный -
прерывистой линией. Атрибутом сущности является любая деталь, которая
служит для уточнения, идентификации, классификации, числовой характеристики или
выражения состояния сущности. Имена атрибутов заносятся в прямоугольник,
изображающий сущность, под именем сущности и изображаются малыми буквами,
возможно, с примерами. форме ER-схемы устраняются повторяющиеся атрибуты или группы
атрибутов, т.е. производится выявление неявных сущностей, "замаскированных" под
атрибуты. форме устраняются атрибуты,
зависящие только от части уникального идентификатора. Эта часть уникального
идентификатора определяет отдельную сущность.
форме устраняются атрибуты, зависящие от атрибутов, не входящих в уникальный
идентификатор. Эти атрибуты являются основой отдельной сущности. сущностей. Как в языках
программирования с развитыми типовыми системами вводится возможность
наследования типа сущности, исходя из одного или нескольких супертипов. Иногда бывает необходимо связывать сущности таким
образом, что с обоих концов связи могут присутствовать несколько экземпляров
сущности. связи. Иногда бывает полезно определить
возможное количество экземпляров сущности, участвующих в данной связи (например,
служащему разрешается участвовать не более, чем в трех проектах одновременно).
Для выражения этого семантического ограничения разрешается указывать на конце
связи ее максимальную или обязательную степень.
экземпляров сущностей. Некоторые связи бывают настолько сильными (конечно, в
случае связи "один-ко-многим"), что при удалении опорного экземпляра сущности
(соответствующего концу связи "один") нужно удалить и все экземпляры сущности,
соответствующие концу связи "многие". . Как и в случае
реляционной модели данных бывает, полезна возможность определения потенциально
допустимого множества значений атрибута сущности (домена). Каждая простая сущность превращается в таблицу.
Простая сущность - сущность, не являющаяся подтипом и не имеющая подтипов. Имя
сущности становится именем таблицы. Каждый атрибут становится возможным
столбцом с тем же именем; может выбираться более точный формат. Столбцы,
соответствующие необязательным атрибутам, могут содержать неопределенные
значения; столбцы, соответствующие обязательным атрибутам, - не
могут. Компоненты уникального идентификатора сущности превращаются в первичный
ключ таблицы. Если имеется несколько возможных уникальных идентификатора,
выбирается наиболее используемый. Если в состав уникального идентификатора
входят связи, к числу столбцов первичного ключа добавляется копия уникального
идентификатора сущности, находящейся на дальнем конце связи (этот процесс может
продолжаться рекурсивно). Для именования этих столбцов используются имена концов
связей и/или имена сущностей. Связи многие-к-одному (и один-к-одному)
становятся внешними ключами. Т.е. делается копия уникального идентификатора с
конца связи "один", и соответствующие столбцы составляют внешний ключ.
Необязательные связи соответствуют столбцам, допускающим неопределенные
значения; обязательные связи - столбцам, не допускающим неопределенные
значения. Индексы создаются для первичного ключа (уникальный индекс), внешних
ключей и тех атрибутов, на которых предполагается в основном базировать
запросы. (а) или (б). При применении способа (а) таблица создается для
наиболее внешнего супертипа, а для подтипов могут создаваться представления. В
таблицу добавляется, по крайней мере, один столбец, содержащий код ТИПА; он
становится частью первичного ключа. При использовании метода (б) для каждого
подтипа первого уровня (для более нижних - представления) супертип воссоздается
с помощью представления UNION (из всех таблиц подтипов выбираются общие столбцы
- столбцы супертипа). (б). Если остающиеся
внешние ключи все в одном домене, т.е. имеют общий формат (способ (а)), то
создаются два столбца: идентификатор связи и идентификатор сущности. Столбец
идентификатора связи используется для различения связей, покрываемых дугой
исключения. Столбец идентификатора сущности используется для хранения значений
уникального идентификатора сущности на дальнем конце соответствующей связи. Если
результирующие внешние ключи не относятся к одному домену, то для каждой связи,
покрываемой дугой исключения, создаются явные столбцы внешних ключей; все эти
столбцы могут содержать неопределенные значения. Типичным представителем (наиболее известным и распространенным)
является Information Management System (IMS) фирмы IBM. Первая версия появилась
в 1968 г. До сих пор поддерживается много баз данных, что создает существенные
проблемы с переходом, как на новую технологию БД, так и на новую
технику. Иерархическая БД состоит из упорядоченного набора деревьев; более
точно, из упорядоченного набора нескольких экземпляров одного типа дерева. Тип
дерева состоит из одного "корневого" типа записи и упорядоченного набора из нуля
или более типов поддеревьев (каждое из которых является некоторым типом дерева).
Тип дерева в целом представляет собой иерархически организованный набор типов
записи. В IMS использовалась оригинальная и нестандартная терминология:
"сегмент" вместо "запись", а под "записью БД" понималось все дерево
сегментов. Все экземпляры данного типа потомка с общим экземпляром типа предка
называются близнецами. Для БД определен полный порядок обхода - сверху вниз,
слева направо. Перейти от одного дерева к другому; Перейти от одной записи к другой в порядке обхода иерархии;
Автоматически поддерживается целостность
ссылок между предками и потомками. Заметим, что аналогичное поддержание
целостности по ссылкам между записями, не входящими в одну иерархию, не
поддерживается 9,10.Сетевые
системы. Типичным представителем является Integrated Database Management
System (IDMS) компании Cullinet Software, Inc., предназначенная для
использования на машинах основного класса фирмы IBM под управлением большинства
операционных систем. Архитектура системы основана на предложениях Data Base Task
Group (DBTG) Комитета по языкам программирования Conference on Data Systems
Languages (CODASYL), организации, ответственной за определение языка
программирования Кобол. Отчет DBTG был опубликован в 1971 г., а в 70-х годах
появилось несколько систем, среди которых IDMS. Сетевой подход к
организации данных является расширением иерархического. В иерархических
структурах запись-потомок должна иметь в точности одного предка; в сетевой
структуре данных потомок может иметь любое число предков. Сетевая БД состоит из
набора записей и набора связей между этими записями, а если говорить более
точно, из набора экземпляров каждого типа из заданного в схеме БД набора типов
записи и набора экземпляров каждого типа из заданного набора типов связи. Тип
связи определяется для двух типов записи: предка и потомка. Экземпляр типа связи
состоит из одного экземпляра типа записи предка и упорядоченного набора
экземпляров типа записи потомка. Для данного типа связи L с типом записи предка
P и типом записи потомка C должны выполняться следующие два условия: Каждый
экземпляр C является потомком не более, чем в одном экземпляре L. Тип записи потомка в одном типе связи L1 может
быть типом записи предка в другом типе связи L2 (как в иерархии). Данный тип
записи P может быть типом записи потомка в любом числе типов связи. Может
существовать любое число типов связи с одним и тем же типом записи предка и
одним и тем же типом записи потомка; и если L1 и L2 - два типа связи с одним и
тем же типом записи предка P и одним и тем же типом записи потомка C, то
правила, по которым образуется родство, в разных связях могут
различаться. Предок и потомок могут быть одного типа
записи. Перейти от предка к первому потомку
по некоторой связи (к первому сотруднику отдела 310); Перейти от потомка к
предку по некоторой связи (найти отдел Сидорова); Исключить из связи; В принципе их поддержание не требуется, но иногда требуют
целостности по ссылкам (как в иерархической модели). Основными понятиями реляционных баз
данных являются тип данных, домен, атрибут, кортеж, первичный ключ и
отношение. в
реляционной модели данных полностью адекватно понятию типа данных в языках
программирования. Обычно в современных реляционных БД допускается хранение
символьных, числовых данных, битовых строк, специализированных числовых данных
(таких как "деньги"), а также специальных "темпоральных" данных (дата, время,
временной интервал). Достаточно активно развивается подход к расширению
возможностей реляционных систем абстрактными типами
данных. более специфично для баз
данных, хотя и имеет некоторые аналогии с подтипами в некоторых языках
программирования. В самом общем виде домен определяется заданием некоторого
базового типа данных, к которому относятся элементы домена, и произвольного
логического выражения, применяемого к элементу типа данных. Если вычисление
этого логического выражения дает результат "истина", то элемент данных является
элементом домена. Наиболее правильной интуитивной трактовкой понятия домена
является понимание домена как допустимого потенциального множества значений
данного типа. Схема отношения
- это именованное множество пар {имя атрибута, имя домена (или типа, если
понятие домена не поддерживается)}. Степень или "арность" схемы отношения -
мощность этого множества. Схема БД (в структурном смысле) - это набор
именованных схем отношений. ,
соответствующий данной схеме отношения, - это множество пар {имя атрибута,
значение}, которое содержит одно вхождение каждого имени атрибута,
принадлежащего схеме отношения. "Значение" является допустимым значением домена
данного атрибута (или типа данных, если понятие домена не поддерживается). Тем
самым, степень или "арность" кортежа, т.е. число элементов в нем, совпадает с
"арностью" соответствующей схемы отношения. Попросту говоря, кортеж - это набор
именованных значений заданного типа. - это множество кортежей,
соответствующих одной схеме отношения. Иногда, чтобы не путаться, говорят
"отношение-схема" и "отношение-экземпляр", иногда, схему, отношения называют
заголовком отношения, а отношение как набор кортежей - телом
отношения. Наиболее распространенная
трактовка реляционной модели данных, по-видимому, принадлежит Дейту, который
воспроизводит ее (с различными уточнениями) практически во всех своих книгах.
Согласно Дейту реляционная модель состоит из трех частей, описывающих разные
аспекты реляционного подхода: структурной части, манипуляционной части и
целостной части. В структурной части модели фиксируется, что единственной
структурой данных, используемой в реляционных БД, является нормализованное n-
арное отношение. По сути дела, в предыдущих двух разделах этой лекции мы
рассматривали именно понятия и свойства структурной составляющей реляционной
модели. В манипуляционной части модели утверждаются два фундаментальных
механизма манипулирования реляционными БД - реляционная алгебра и реляционное
исчисление. Первый механизм базируется в основном на классической теории
множеств (с некоторыми уточнениями), а второй - на классическом логическом
аппарате исчисления предикатов первого порядка. Мы рассмотрим эти механизмы
более подробно на следующей лекции, а пока лишь заметим, что основной функцией
манипуляционной части реляционной модели является обеспечение меры реляционности
любого конкретного языка реляционных БД: язык называется реляционным, если он
обладает не меньшей выразительностью и мощностью, чем реляционная алгебра или
реляционное исчисление. В целостной
части реляционной модели данных фиксируются два базовых требования целостности,
которые должны поддерживаться в любой реляционной СУБД. Первое требование
называется . Объекту или сущности
реального мира в реляционных БД соответствуют кортежи отношений. Конкретно
требование состоит в том, что любой кортеж любого отношения отличим от любого
другого кортежа этого отношения, т.е. другими словами, любое отношение должно
обладать первичным ключом. . При соблюдении нормализованности отношений сложные
сущности реального мира представляются в реляционной БД в виде нескольких
кортежей нескольких отношений. Атрибут называется , его
значения однозначно характеризуют сущности, представленные кортежами некоторого
другого отношения (т.е. задают значения их первичного ключа). Говорят, что
отношение, в котором определен внешний ключ, ссылается на соответствующее
отношение, в котором такой же атрибут является первичным ключом. Требование
целостности по ссылкам, или требование внешнего ключа состоит в том, что для
каждого значения внешнего ключа, появляющегося в ссылающемся отношении, в
отношении, на которое ведет ссылка, должен найтись кортеж с таким же значением
первичного ключа, либо значение внешнего ключа должно быть неопределенным (т.е.
ни на что не указывать). Ограничения целостности сущности и по ссылкам
должны поддерживаться СУБД. Для соблюдения целостности сущности достаточно
гарантировать отсутствие в любом отношении кортежей с одним и тем же значением
первичного ключа. Существуют три подхода, каждый из которых поддерживает
целостность по ссылкам. Первый подход заключается в том, что запрещается
производить удаление кортежа, на который существуют ссылки (т.е. сначала нужно
либо удалить ссылающиеся кортежи, либо соответствующим образом изменить значения
их внешнего ключа). При втором подходе при удалении кортежа, на который имеются
ссылки, во всех ссылающихся кортежах значение внешнего ключа автоматически
становится неопределенным. Наконец, третий подход (каскадное удаление) состоит в
том, что при удалении кортежа из отношения, на которое ведет ссылка, из
ссылающегося отношения автоматически удаляются все ссылающиеся
кортежи. Видимо, наиболее популярным подходом к
организации индексов в базах данных является использование техники B-деревьев. С
точки зрения внешнего логического представления B-дерево - это сбалансированное
сильно ветвистое дерево во внешней памяти. Сбалансированность означает, что
длина пути от корня дерева к любому его листу одна и та же. Ветвистость дерева -
это свойство каждого узла дерева ссылаться, но большое число узлов-потомков. С
точки зрения физической организации B-дерево представляется как мультисписочная
структура страниц внешней памяти, т.е. каждому узлу дерева соответствует блок
внешней памяти (страница). Внутренние и листовые страницы обычно имеют разную
структуру. в странице дерева Nm находятся ключи k со
значениями ключ(m) <= k <= ключ(m+1). сп(r) -
упорядоченный список идентификаторов кортежей (tid), включающих значение
ключ(r); Поиск в B-дереве - это прохождение от корня к листу в соответствии с
заданным значением ключа. Заметим, что поскольку деревья сильно ветвистые и
сбалансированные, то для выполнения поиска по любому значению ключа потребуется
одно и то же (и обычно небольшое) число обменов с внешней памятью. Более точно,
в сбалансированном дереве, где длины всех путей от корня к листу одни и те же,
если во внутренней странице помещается n ключей, то при хранении m записей
требуется дерево глубиной log вычисляет
логарифм по основанию n. Если n достаточно велико (обычный случай), то глубина
дерева невелика, и производится быстрый поиск. Основной "изюминкой" B-деревьев
является автоматическое поддержание свойства сбалансированности. Рассмотрим, как
это делается при выполнении операций занесения и удаления записей. Поиск листовой страницы. Фактически,
производится обычный поиск по ключу. Если в B-дереве не содержится ключ с
заданным значением, то будет получен номер страницы, в которой ему надлежит
содержаться, и соответствующие координаты внутри страницы. Помещение записи
на место. Естественно, что вся работа производится в буферах оперативной памяти.
Листовая страница, в которую требуется занести запись, считывается в буфер, и в
нем выполняется операция вставки. Размер буфера должен превышать размер страницы
внешней памяти. Если после выполнения вставки новой записи размер
используемой части буфера не превосходит размера страницы, то на этом выполнение
операции занесения записи заканчивается. Буфер может быть немедленно вытолкнут
во внешнюю память, или временно сохранен в оперативной памяти в зависимости от
политики управления буферами. Если же возникло переполнение буфера (т.е.
размер его используемой части превосходит размер страницы), то выполняется
расщепление страницы. Для этого запрашивается новая страница внешней памяти,
используемая часть буфера разбивается, грубо говоря, пополам (так, чтобы вторая
половина также начиналась с ключа), и вторая половина записывается во вновь
выделенную страницу, а в старой странице модифицируется значение размера
свободной памяти. Естественно, модифицируются ссылки по списку листовых страниц.
Чтобы обеспечить доступ от корня дерева к заново заведенной страницы,
необходимо соответствующим образом модифицировать внутреннюю страницу,
являющуюся предком ранее существовавшей листовой страницы, т.е. вставить в нее
соответствующее значение ключа и ссылку на новую страницу. При выполнении этого
действия может снова произойти переполнение теперь уже внутренней страницы, и
она будет расщеплена на две. В результате потребуется вставить значение ключа и
ссылку на новую страницу во внутреннюю страницу-предка выше по иерархии и т.д.
Предельным случаем является переполнение корневой страницы B-дерева. В этом
случае она тоже расщепляется на две, и заводится новая корневая страница дерева,
т.е. его глубина, увеличивается на единицу. Поиск записи по ключу. Если запись не
найдена, то значит удалять ничего не нужно. Если после
выполнения этой подоперации размер занятой в буфере области оказывается таковым,
что его сумма с размером занятой области в листовых страницах, являющихся левым
или правым братом данной страницы, больше, чем размер страницы, операция
завершается. Иначе производится слияние с правым или левым братом, т.е. в
буфере производится новый образ страницы, содержащей общую информацию из данной
страницы и ее левого или правого брата. Ставшая ненужной листовая страница
заносится в список свободных страниц. Соответствующим образом корректируется
список листовых страниц. Чтобы устранить возможность доступа от корня к
освобожденной странице, нужно удалить соответствующее значение ключа и ссылку на
освобожденную страницу из внутренней страницы - ее предка. При этом может
возникнуть потребность в слиянии этой страницы с ее левым или правыми братьями и
т.д. Предельным случаем является полное опустошение корневой страницы дерева,
которое возможно после слияния последних двух потомков корня. В этом случае
корневая страница освобождается, а глубина дерева уменьшается на
единицу. Проблемой является то, что при выполнении операций модификации
слишком часто могут возникать расщепления и слияния. Чтобы добиться эффективного
использования внешней памяти с минимизацией числа расщеплении и слияний,
применяются более сложные приемы, в том числе: упреждающие
расщепления, т.е. расщепления страницы не при ее переполнении, а несколько
раньше, когда степень заполненности страницы достигает некоторого уровня;
слияния 3-в-2, т.е. порождение двух листовых страниц на
основе содержимого трех соседних.
Альтернативным и все более популярным
подходом к организации индексов является использование техники хеширования. Это
очень обширная тема, которая заслуживает отдельного рассмотрения. Мы ограничимся
лишь несколькими замечаниями. Общей идеей методов хеширования является
применение к значению ключа некоторой функции свертки (хэш-функции),
вырабатывающей значение меньшего размера. Свертка значения ключа затем
используется для доступа к записи. В самом простом, классическом случае,
свертка ключа используется как адрес в таблице, содержащей ключи и записи.
Основным требованием к хэш-функции является равномерное распределение значение
свертки. При возникновении коллизий (одна и та же свертка для нескольких
значений ключа) образуются цепочки переполнения. Главным ограничением этого
метода является фиксированный размер таблицы. Если таблица заполнена слишком
сильно или переполнена, но возникнет слишком много цепочек переполнения, и
главное преимущество хеширования - доступ к записи почти всегда за одно
обращение к таблице - будет утрачено. Расширение таблицы требует ее такие действия являются абсолютно неприемлемыми.
Поэтому обычно вводят промежуточные таблицы-справочники, содержащие значения
ключей и адреса записей, а сами записи хранятся отдельно. Тогда при переполнении
справочника требуется только его переделка, что вызывает меньше накладных
расходов. Чтобы избежать потребности в полной переделки справочников, при
их организации часто используют технику B-деревьев с расщеплениями и слияниями.
Хэш-функция при этом меняется динамически, в зависимости от глубины B-дерева.
Путем дополнительных технических ухищрений удается добиться сохранения порядка
записей в соответствии со значениями ключа. В целом методы B-деревьев и
хеширования все более сближаются. Основная идея реляционной алгебры состоит в том, что коль скоро
отношения являются множествами, то средства манипулирования отношениями могут
базироваться на традиционных теоретико-множественных операциях, дополненных
некоторыми специальными операциями, специфичными для баз
данных. Используется немного расширенный начальный вариант алгебры, который
был предложен Коддом. В этом варианте набор основных алгебраических операций
состоит из восьми операций, которые делятся на два класса - теоретико-
множественные операции и специальные реляционные операции. В состав
пересечения отношений; реляционные операции
включают: деление отношений.
Кроме того, в состав алгебры включается операция присваивания,
позволяющая сохранить в базе данных результаты вычисления алгебраических
выражений, и операция переименования атрибутов, дающая возможность корректно
сформировать заголовок (схему) результирующего отношения. При выполнении операции объединения
двух отношений производится отношение, включающее все кортежи, входящие хотя бы
в одно из отношений-операндов. Операция пересечения двух отношений производит
отношение, включающее все кортежи, входящие в оба отношения-операнда.
Отношение, являющееся разностью двух отношений включает все кортежи, входящие
в отношение - первый операнд, такие, что ни один из них не входит в отношение,
являющееся вторым операндом. При выполнении прямого произведения двух
отношений производится отношение, кортежи которого являются конкатенацией
(сцеплением) кортежей первого и второго операндов. Результатом ограничения
отношения по некоторому условию является отношение, включающее кортежи
отношения-операнда, удовлетворяющее этому условию. При выполнении проекции
отношения на заданный набор его атрибутов производится отношение, кортежи
которого производятся путем взятия соответствующих значений из кортежей
отношения-операнда. При соединении двух отношений по некоторому условию
образуется результирующее отношение, кортежи которого являются конкатенацией
кортежей первого и второго отношений и удовлетворяют этому условию. У
операции реляционного деления два операнда - бинарное и унарное отношения.
Результирующее отношение состоит из одно-атрибутных кортежей, включающих
значения первого атрибута кортежей первого операнда таких, что множество
значений второго атрибута (при фиксированном значении первого атрибута)
совпадает со множеством значений второго операнда. Операция переименования
производит отношение, тело которого совпадает с телом операнда, но имена
атрибутов изменены. Операция присваивания позволяет сохранить результат
вычисления реляционного выражения в существующем отношении БД. Поскольку
результатом любой реляционной операции (кроме операции присваивания) является
некоторое отношение, можно образовывать реляционные выражения, в которых вместо
отношения-операнда некоторой реляционной операции находится вложенное
реляционное выражение. Каждое отношение характеризуется схемой (или заголовком) и
набором кортежей (или телом). Поэтому, если действительно желать иметь алгебру,
операции которой замкнуты относительно понятия отношения, то каждая операция
должна производить отношение в полном смысле, т.е. оно должно обладать и телом,
и заголовком. Только в этом случае будет действительно возможно строить
вложенные выражения. Заголовок отношения представляет собой множество пар
<имя-атрибута, имя-домена>. Если посмотреть на общий обзор реляционных
операций, приведенный в предыдущем подразделе, то видно, что домены атрибутов
результирующего отношения однозначно определяются доменами отношений-
операндов. Смысл операции объединения в реляционной алгебре в целом остается
теоретико-множественным. Но если в теории множеств операция объединения
осмысленна для любых двух множеств-операндов, то в случае реляционной алгебры
результатом операции объединения должно являться отношение. Если допустить в
реляционной алгебре возможность теоретико-множественного объединения
произвольных двух отношений (с разными схемами), то, конечно, результатом
операции будет множество, но множество разнотипных кортежей, т.е. не отношение.
Если исходить из требования замкнутости реляционной алгебры относительно понятия
отношения, то такая операция объединения является бессмысленной. : два отношения совместимы по объединению в том и только в том
случае, когда обладают одинаковыми заголовками. Более точно, это означает, что в
заголовках обоих отношений содержится один и тот же набор имен атрибутов, и
одноименные атрибуты определены на одном и том же домене. Если два
отношения совместимы по объединению, то при обычном выполнении над ними операций
объединения, пересечения и взятия разности результатом операции является
отношение с корректно определенным заголовком, совпадающим с заголовком каждого
из отношений-операндов. Заметим, что включение в состав операций
реляционной алгебры трех операций объединения, пересечения и взятия разности
является, очевидно, избыточным, поскольку известно, что любая из этих операций
выражается через две других. Тем не менее, Кодд в свое время решил включить все
три операции, исходя из интуитивных потребностей потенциального пользователя
системы реляционных БД, далекого от математики. Другие проблемы связаны с
операцией взятия прямого произведения двух отношений. В теории множеств прямое
произведение может быть получено для любых двух множеств, и элементами
результирующего множества являются пары, составленные из элементов первого и
второго множеств. Поскольку отношения являются множествами, то и для любых двух
отношений возможно получение прямого произведения. Но результат не будет
отношением! Элементами результата будут являться не кортежи, а пары кортежей.
Поэтому в реляционной алгебре используется специализированная форма
операции взятия прямого произведения - расширенное прямое произведение
отношений. При взятии расширенного прямого произведения двух отношений элементом
результирующего отношения является кортеж, являющийся конкатенацией (или
слиянием) одного кортежа первого отношения и одного кортежа второго
отношения. . Два отношения совместимы по взятию прямого произведения в том
и только в том случае, если множества имен атрибутов этих отношений не
пересекаются. Любые два отношения могут быть сделаны совместимыми по взятию
прямого произведения путем применения операции переименования к одному из этих
отношений. По поводу теоретико-множественных операций реляционной алгебры
следует еще заметить, что все четыре операции являются ассоциативными. Т. е.,
если обозначить через OP любую из четырех операций, то (A OP B) OP C = A (B OP
C), и следовательно, без введения двусмысленности можно писать A OP B OP C (A, B
и C - отношения, обладающие свойствами, требуемыми для корректного выполнения
соответствующей операции). Все операции, кроме взятия разности, являются
коммутативными, т.е. A OP B = B OP A. Операция ограничения требует наличия двух операндов:
ограничиваемого отношения и простого условия ограничения. Простое условие
ограничения может иметь либо вид (a comp-opb), где а и b - имена атрибутов
ограничиваемого отношения, для которых осмысленна операция сравнения comp-op,
либо вид (a comp-op const), где a - имя атрибута ограничиваемого отношения, а
const - литерально заданная константа. Операция взятия проекции также
требует наличия двух операндов - проецируемого отношения A и списка имен
атрибутов, входящих в заголовок отношения A. является
отношение, с заголовком, определяемым множеством атрибутов a , a 1 n .
Тем самым, при выполнении операции проекции выделяется "вертикальная" вырезка
отношения-операнда с естественным уничтожением потенциально возникающих
кортежей-дубликатов. Общая операция соединения (называемая также
соединением по условию) требует наличия двух операндов - соединяемых отношений и
третьего операнда - простого условия. Пусть соединяются отношения A и B. Как и в
случае операции ограничения, условие соединения comp имеет вид либо (a comp-op
b), либо (a comp-op const), где a и b - имена атрибутов отношений A и B, const -
литерально заданная константа, а comp-op - допустимая в данном контексте
операция сравнения. Тогда по определению результатом операции сравнения
является отношение, получаемое путем выполнения операции ограничения по условию
comp прямого произведения отношений A и B. Операция деления отношений. Эта
операция наименее очевидна из всех операций реляционной алгебры и поэтому
нуждается в более подробном объяснении. Пусть заданы два отношения - A с
заголовком {a } и B с заголовком {b
отношения A и атрибут b Назовем множество
атрибутов {a } - составным атрибутом b. После этого будем говорить о
реляционном делении бинарного отношения A(a,b) на унарное отношение B(b).
Результатом деления A на B является унарное отношение C(a), состоящее из
кортежей v таких, что в отношении A имеются кортежи <v, w такие, что
множество значений {w} включает множество значений атрибута b в отношении B.
Предположим, что мы работаем с
базой данных, обладающей схемой СОТРУДНИКИ (СОТР_НОМ, СОТР_ИМЯ, СОТР_ЗАРП,
ОТД_НОМ) и ОТДЕЛЫ (ОТД_НОМ, ОТД_КОЛ, ОТД_НАЧ), и хотим узнать имена и номера
сотрудников, являющихся начальниками отделов с количеством сотрудников больше
50. Если бы для формулировки такого запроса использовалась реляционная
алгебра, то мы получили бы алгебраическое выражение, которое читалось бы,
например, следующим образом: ограничить полученное отношение по
условию ОТД_КОЛ 50; Мы четко сформулировали последовательность шагов
выполнения запроса, каждый из которых соответствует одной реляционной операции.
Если же сформулировать тот же запрос с использованием реляционного исчисления,
которому посвящается этот раздел, то мы получили бы формулу, которую можно было
бы прочитать, например, следующим образом: Выдать СОТР_ИМЯ и СОТР_НОМ для
сотрудников таких, что существует отдел с таким же значением ОТД_НАЧ и значением
ОТД_КОЛ большим 50. Во второй формулировке мы указали лишь характеристики
результирующего отношения, но ничего не сказали о способе его формирования. В
этом случае система должна сама решить, какие операции и в каком порядке нужно
выполнить над отношениями СОТРУДНИКИ и ОТДЕЛЫ. Обычно говорят, что
алгебраическая формулировка является процедурной, т.е. задающей правила
выполнения запроса, а логическая - описательной (или декларативной), поскольку
она всего лишь описывает свойства желаемого результата. Как мы указывали в
начале лекции, на самом деле эти два механизма эквивалентны и существуют не
очень сложные правила преобразования одного формализма в другой. Реляционное исчисление
является прикладной ветвью формального механизма исчисления предикатов первого
порядка. Базисными понятиями исчисления являются понятие переменной с
определенной для нее областью допустимых значений и понятие правильно
построенной формулы, опирающейся на переменные, предикаты и кванторы. В
зависимости от того, что является областью определения переменной, различаются
исчисление кортежей и исчисление доменов. В исчислении кортежей областями
определения переменных являются отношения базы данных, т.е. допустимым значением
каждой переменной является кортеж некоторого отношения. В исчислении доменов
областями определения переменных являются домены, на которых определены атрибуты
отношений базы данных, т.е. допустимым значением каждой переменной является
значение некоторого домена. Мы рассмотрим более подробно исчисление кортежей, а
в конце лекции коротко опишем особенности исчисления доменов. В отличие от
раздела, посвященного реляционной алгебре, в этом разделе нам не удастся
избежать использования некоторого конкретного синтаксиса, который мы, тем не
менее, формально определять не будем. Необходимые синтаксические конструкции
будут вводиться по мере необходимости. В совокупности, используемый синтаксис
близок, но не полностью совпадает с синтаксисом языка баз данных QUEL, который
долгое время являлся основным языком СУБД Ingres. Для определения
кортежной переменной используется оператор RANGE. Например, для того, чтобы
определить переменную СОТРУДНИК, областью определения которой является отношение
СОТРУДНИКИ, нужно употребить конструкцию Как
мы уже говорили, из этого определения следует, что в любой момент времени
переменная СОТРУДНИК представляет некоторый кортеж отношения СОТРУДНИКИ. При
использовании кортежных переменных в формулах можно ссылаться на значение
атрибута переменной (это аналогично тому, как, например, при программировании на
языке Си можно сослаться на значение поля структурной переменной). Например, для
того, чтобы сослаться на значение атрибута СОТР_ИМЯ переменной СОТРУДНИК, нужно
употребить конструкцию СОТРУДНИК.СОТР_ИМЯ. Правильно построенные формулы (WFF
- Well-Formed Formula) служат для выражения условий, накладываемых на кортежные
переменные. Основой WFF являются простые сравнения (comparison), представляющие
собой операции сравнения скалярных значений (значений атрибутов переменных или
литерально заданных констант). Например, конструкция "СОТРУДНИК.СОТР_НОМ = 140"
является простым сравнением. По определению, простое сравнение является WFF, а
WFF, заключенная в круглые скобки, является простым сравнением. Более сложные
варианты WFF строятся с помощью логических связок NOT, AND, OR и IF ... THEN.
Так, если form - WFF, а comp - простое сравнение, то NOT form, comp AND form,
comp OR form и IF comp THEN form являются WFF. Наконец, допускается
построение WFF с помощью кванторов. Если form - это WFF, в которой участвует
переменная var, то конструкции EXISTS var (form) и FORALL var (form)
представляют wff. Переменные, входящие в WFF, могут быть свободными или
связанными. Все переменные, входящие в WFF, при построении которой не
использовались кванторы, являются свободными. Фактически, это означает, что если
для какого-то наборазначений свободных кортежных переменных при вычислении WFF
получено значение true, то эти значения кортежных переменных могут входить в
результирующее отношение. Если же имя переменной использовано сразу после
квантора при построении WFF вида EXISTS var (form) или FORALL var (form), то в
этой WFF и во всех WFF, построенных с ее участием, var - это связанная
переменная. Это означает, что такая переменная не видна за пределами минимальной
WFF, связавшей эту переменную. При вычислении значения такой WFF используется не
одно значение связанной переменной, а вся ее область определения. Пусть СОТР1
и СОТР2 - две кортежные переменные, определенные на отношении СОТРУДНИКИ. Тогда,
WFF EXISTS СОТР2 (СОТР1.СОТР_ЗАРП СОТР2.СОТР_ЗАРП) для текущего кортежа
переменной СОТР1 принимает значение true в том и только в том случае, если во
всем отношении СОТРУДНИКИ найдется кортеж (связанный с переменной СОТР2) такой,
что значение его атрибута СОТР_ЗАРП удовлетворяет внутреннему условию сравнения.
WFF FORALL СОТР2 (СОТР1.СОТР_ЗАРП СОТР2.СОТР_ЗАРП) для текущего кортежа
переменной СОТР1 принимает значение true в том и только в том случае, если для
всех кортежей отношения СОТРУДНИКИ (связанных с переменной СОТР2) значения
атрибута СОТР_ЗАРП удовлетворяют условию сравнения. На самом деле, правильнее
говорить не о свободных и связанных переменных, а о свободных и связанных
вхождениях переменных. Легко видеть, что если переменная var является связанной
в WFF form, то во всех WFF, включающих данную, может использоваться имя
переменной var, которая может быть свободной или связанной, но в любом случае не
имеет никакого отношения к вхождению переменной var в WFF form. Вот пример: Здесь мы имеем два связанных вхождения
переменной СОТР2 с совершенно разным смыслом. Итак, WFF обеспечиваютсредства формулировки
условия выборки из отношений БД. Чтобы можно было использовать исчисление для
реальной работы с БД, требуется еще один компонент, который определяет набор и
имена столбцов результирующего отношения. Этот компонент называется целевым
списком (target_list). var.attr, где var - имя свободной
переменной соответствующей WFF, а attr - имя атрибута отношения, на котором
определена переменная var; var, что эквивалентно наличию подсписка var.attr1,
var.attr2, ..., var.attrn, где attr1, attr2, ..., attrn включает имена всех
атрибутов определяющего отношения; Последний вариант
требуется в тех случаях, когда в WFF используются несколько свободных переменных
с одинаковой областью определения. Выражением реляционного исчисления
кортежей называется конструкция вида target_list WHERE wff. Значением выражения
является отношение, тело которого определяется WFF, а набор атрибутов и их имена
- целевым списком. В исчислении
доменов областью определения переменных являются не отношения, а домены.
Применительно к базе данных СОТРУДНИКИ-ОТДЕЛЫ можно говорить, например, о
доменных переменных ИМЯ (значения - допустимые имена) или НОСОТР (значения -
допустимые номера сотрудников). Основным формальным отличием исчисления
доменов от исчисления кортежей является наличие дополнительного набора
предикатов, позволяющих выражать так называемые условия членства. Если R - это
n-арное отношение с атрибутами a R (ai1:vi1, ai2:vi2, ..., aim:vim) (m <=
n), - это либо литерально задаваемая константа, либо имя
кортежной переменной. Условие членства принимает значение true в том и только в
том случае, если в отношении R существует кортеж, содержащий указанные значения
указанных атрибутов. Если v задается жесткое условие, не зависящее от текущих значений
доменных переменных; если же v - имя доменной переменной, то
условие членства может принимать разные значения при разных значениях этой
переменной. Во всех остальных отношениях формулы и выражения исчисления
доменов выглядят похожими на формулы и выражения исчисления кортежей. В
частности, конечно, различаются свободные и связанные вхождения доменных
переменных. Для примера сформулируем с использованием исчисления доменов
запрос "Выдать номера и имена сотрудников, не получающих минимальную заработную
плату" (будем считать для простоты, что мы определили доменные переменные, имена
которых совпадают с именами атрибутов отношения СОТРУДНИКИ, а в случае, когда
требуется несколько доменных переменных, определенных на одном домене, мы будем
добавлять в конце имени цифры): СОТРУДНИКИ (СОТР_НОМ,
СОТР_ИМЯ, СОТР_ЗАРП) AND Реляционное исчисление
доменов является основой большинства языков запросов, основанных на
использовании форм. В частности, на этом исчислении базировался известный язык
Query-by-Example, который был первым (и наиболее интересным) языком в семействе
языков, основанных на табличных формах.