Лекции ПрБД, 2 курс 3 семестр (для ИВТ и т.п.) / Проектирование БД_уч пособие v02
.pdf
Значение |
Значение указателя- |
Блоки записей |
|||
ключа |
адресный номер блока |
|
данных |
||
|
|
|
|
|
|
А |
1000 |
2 |
|
B |
5000 |
А |
1001 |
3 |
1 |
|
… |
|
… |
… |
|
B |
5001 |
А |
1999 |
3 |
|
|
|
|
|
|
|||
В |
5000 |
1 |
|
|
|
|
B |
5900 |
|||
|
… |
… |
|
||
|
2 |
|
… |
||
В |
5999 |
1 |
|
||
|
A |
1000 |
|||
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A |
1999 |
|
|
|
3 |
|
… |
|
|
|
|
A |
1001 |
|
|
|
|
|
|
Рис. 46. Пример организации индексного файла
виндексно-произвольном методе доступа к данным
Кгруппе индексных методов доступа относится метод «Бинарное дерево». Запись бинарного дерева состоит из поля ключа записи и двух полей для указателей. Один из указателей хранит адрес на левое поддерево, второй указатель – на правое поддерево. Листовые указатели записи бинарного дерева содержат указатели на блоки файла основных записей (файла данных). Записи бинарного дерева содержат только одно поле данных – информационное, являющееся значением ключа. На Рис. 47 показан пример организации индексного файла в виде бинарного дерева.
|
|
|
|
|
|
|
|
|
|
K4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
K2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
K6 |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
K1 |
|
|
|
|
|
K3 |
|
|
|
|
|
|
K5 |
|
|
|
|
|
K7 |
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
з1(К1) |
|
|
|
|
з3(К3) |
|
|
|
|
з5(К5) |
|
|
|
|
|
з7(К7) |
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
з2(К2) |
|
|
з4(К4) |
|
|
|
|
з6(К6) |
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 47. Пример организации индексного файла в виде бинарного дерева
171
Существуют эффективные алгоритмы работы с древовидными структурами, включая добавление, удаление, изменение узлов дерева. К индексным методам доступа относятся и метод доступа двусвязное дерево, и мультисписковый метод доступа, название которых раскрывает способ организации индексных файлов. Особое место среди индексных методов доступа занимает инвертированный метод доступа, с помощью которого осуществляется реализация поиска по вторичному ключу и не реализуются алгоритмы ведения данных.
Винвертированном методе доступа используется три файла – индекс вторичного ключа, инвертированный файл и основной файл базы данных. Индекс вторичного ключа содержит значения вторичных ключей, упорядоченных по возрастанию или убыванию, и адрес блока в инвертированном файле.
Винвертированном файле содержатся значения первичных ключей
сданным значением вторичного ключа и адреса записей в основном файле, соответствующие значениям первичного ключа. На Рис. 48 показан пример организации инвертированного метода доступа.
|
|
|
Инвертированный |
|
|
|
|||
|
|
|
индекс для курса |
|
Файл данных |
||||
|
|
|
Блок 1 |
|
|
адрес |
|
|
|
|
|
|
|
|
Фамилия студента |
Номер курса |
|||
|
Индекс |
ИВТ01 |
102 |
|
101 |
|
|
||
Алешин |
ПИ01 |
||||||||
инвертированного |
|
112 |
|
||||||
|
|
102 |
|
|
|||||
|
|
|
|||||||
|
индекса |
|
|
|
Александров |
ИВТ01 |
|||
Блок 2 |
|
|
|||||||
|
|
|
|
|
103 |
|
|
||
|
|
|
|
|
Борисов |
ПИ01 |
|||
|
|
|
|
|
|
||||
|
ИВТ01 |
|
ИВТ02 |
104 |
|
104 |
|
|
|
|
|
Волков |
ИВТ02 |
||||||
|
|
|
105 |
|
|||||
|
ИВТ02 |
|
|
109 |
|
105 |
|
|
|
|
|
Иванов |
ИВТ02 |
||||||
|
ИВТ03 |
|
|
|
|||||
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
||
|
ПИ01 |
|
Блок 3 |
|
|
106 |
Петров |
ПИ01 |
|
|
РПИС01 |
|
|
|
|||||
|
|
|
ИВТ03 |
107 |
|
107 |
Сидоров |
ИВТ03 |
|
|
|
|
|
111 |
|
108 |
|
|
|
|
|
|
|
Морковкин |
РПИС01 |
||||
|
|
|
|
|
|
||||
|
|
|
|
|
|
||||
|
|
|
|
|
|
109 |
|
|
|
|
|
|
Блок 4 |
|
|
Гаврилов |
ИВТ02 |
||
|
|
|
ПИ01 |
101 |
|
110 |
Дмитриев |
РПИС01 |
|
|
|
|
|
103 |
|
111 |
|
|
|
|
|
|
|
|
Козырев |
ИВТ03 |
|||
|
|
|
|
106 |
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Блок 4 |
|
|
112 |
Смирнов |
ИВТ01 |
|
|
|
|
РПИС01 |
108 |
|
|
|
|
|
|
|
|
|
110 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 48. Пример организации инвертированного метода доступа
С учетом особенностей организации индексно-последовательный метод поиска используют для организации первичных ключей, индексно-
172
произвольный метод поиска реализует альтернативные или потенциальные ключи, инвертированный метод доступа реализует инверсионные входы.
Вгруппе произвольных методов доступа используются основной файл базы данных и функция, преобразующая ключ в адрес, по которому хранится в основном файле запись с соответствующим значением ключа. К произвольным методам доступа относятся прямой метод доступа и метод хеширования идентификатора.
Впрямом методе доступа каждой записи соответствует одно значение адреса. Если проектировщик базы данных может предусмотреть в памяти для каждой записи место, определяемое уникальным значением ее первичного ключа, тогда можно построить первичную функцию преобразования ключа в адрес, обеспечивающую запоминание и выборку каждой записи в точности за один произвольный доступ к блоку. С этой целью каждой совокупности ключевых значений записей, расположенных в одном и том же физическом блоке, можно присвоить относительный номер блока (относительный физический адрес). На самом деле данные хранятся
всоответствии с порядком ключей, но при этом неявно им последовательно присвоены относительные номера блоков.
Например, компания имеет 30 отделений (с номерами от 1 до 30). В каждом блоке хранится 5 записей данных об отделениях, следовательно, нужно 6 блоков.
Функция преобразования ключа в адрес:
|
номер отделения |
||
относительный адрес блока = |
|
. |
|
5 |
|||
|
|
||
Например, запись данных об отделениях располагается по адресу с относительным номером 3. Такое абсолютное соответствие между ключом и относительным адресом блока является основной отличительной чертой прямого метода доступа. В случае реальных данных не всегда возможно такое соответствие значения ключа ровно одному адресу, поэтому часто приходится строить более сложные функции.
Метод хеширования идентификатора или метод рандомизации
(random – произвольный доступ; hash – размешивание) – это метод быстрой выборки и обновления записей, относящийся к группе произвольных методов доступа. В этом методе используется следующая терминология. Идентификатор – атрибут, уникально определяющий каждый экземпляр некоторой сущности предметной области. В контексте файла и базы дан-
173
ных идентификатор – это первичный ключ. Хеширование – метод доступа, обеспечивающий адресацию данных путем преобразования значения ключа в относительный или абсолютный физический адрес. Функция преобразования ключа – функция хеширования или функция рандомизации. В прямом методе доступа имеет место отображение 1:1, в методе хеширования – М : 1, то есть возможно преобразование двух или более значений ключа в один и тот же физический адрес, так называемый собственный адрес. Такие ключи называют синонимами, а случай преобразования ключа в уже занятый собственный адрес – коллизией.
Для прямого метода доступа характерна «неуправляемость ключа», то есть по значению ключа один раз вычисляются адреса и размещаются в памяти, это требует неоправданно больших служебных издержек памяти.
Хеширование обеспечивает эффективную выборку и обновление отдельных записей по заданному значению первичного ключа. Плата за эффективность – нарушение упорядоченности файла и потеря возможности выполнить пакетную обработку или генерацию отчетов, основанную на упорядоченности записей по первичному ключу. Один из способов организации хеширования – это когда все адресное пространство, непосредственно доступное функции хеширования, делится на несколько областей фиксированного размера, называемых бакетами. В качестве бакета можно использовать цилиндр, дорожку, блок и так далее, то есть любой участок памяти, адресуемый как единое целое. Бакет может состоять из более мелких физических единиц данных (дорожка, хранимая запись и другие). Наименьшая составная единица бакета, используемая при анализе метода хеширования, называется фрагментом (хранимой) записи данных или секцией. Пример организации метода хеширования идентификатора показан на Рис. 49.
Процесс разрешения коллизий синонимов состоит из двух шагов: на первом шаге выполняется просмотр бакета с целью выявления в нем свободного пространства для новой записи. При наличии пространства просмотр прекращается. В противном случае, переходим на выполнение второго шага, который состоит в обработке переполнения.
В случае заполнения области переполнения и попытке размещения очередной записи в занятый бакет происходит либо реорганизация файла (освобождается область переполнения, выделяется большее число бакетов
174
либо размер бакетов увеличивается), либо выбирается другая функция хе- |
|||
ширования. |
|
|
|
|
|
Первичная |
Область |
Ключ |
|
область |
переполнения |
|
|
|
|
|
B1 |
|
|
Функция |
B2 |
|
|
|
|
|
|
хеширования |
|
|
|
(рандомизация) |
|
|
|
|
BN-1 |
|
|
|
BN |
|
|
фрагмент записи |
бакет |
средства |
|
|
|
организации |
|
|
|
|
|
|
|
|
переполнения |
Рис. 49. Пример организации метода хеширования идентификатора |
|||
Наилучшей функцией хеширования является функция, отображающая NR значений ключа в NR собственных адресов без синонимов. Теоретически будет NR! способов такого идеального отображения. Но если учесть, что существует NRNR способов присвоения NR ключами NR собственных адресов, то вероятность этого идеального отображения ничтожна.
Рассмотрим пример. Пусть необходимо построить хеш-функцию, ставящую в соответствие каждому значению ключа адрес для последовательности чисел 36, 16, 13, 5, 85 и для адресного пространства из 10 бакетов, причём построить функцию хеширования, не приводящую к коллизиям:
а) fхеш = значение ключа (mod 10) + 1. Значения 36 и 16 синонимы и они отображаются в бакет 7, а также 5 и 85, которые отображаются в бакете 6, то есть имеется четыре коллизии;
б) fхеш = сумма цифр значения ключа (mod 10) + 1. Тогда получим такое размещение значений ключа по адресам:
3 + 6 = 9; 9 mod 10 + 1 = 10 fхеш(16) = (1 + 6) mod 10 + 1 = 8 fхеш(13) = (1 + 3) mod 10 + 1 = 5
175
fхеш(5) = 5 mod 10 + 1 = 6 fхеш(85) = 13 mod 10 + 1 = 4
То есть, для данной комбинации цифр здесь нет коллизий. Метод деления является наиболее часто применяемым методом при построении функций хеширования.
Вопросы для самопроверки
1)Что такое хранимая запись?
2)Какие виды форматов хранимых записей Вы знаете?
3)Перечислите методы доступа к данным.
4)Что относится к группе последовательных методов? Дайте их краткую характеристику.
5)Что относится к группе индексных методов? Дайте их краткую характеристику.
6)Что относится к произвольным методам?
7)В чем заключается метод хеширования идентификатора?
8)Что такое коллизия?
11 Транзакции и целостность баз данных
Понятие «транзакция» не входит в реляционную модель данных, т.к. транзакции рассматриваются не только в реляционных СУБД, но и в СУБД других типов, а также и в других типах информационных систем. Под транзакцией часто принято понимать неделимую с точки зрения воздействия на БД последовательность операторов манипулирования данными (чтения, удаления, вставки, модификации) такую, что либо результаты всех операторов, входящих в транзакцию, отображаются в БД, либо воздействие всех этих операторов полностью отсутствует.
Для пользователя транзакция выполняется по принципу «все или ничего», т.е. либо транзакция выполняется целиком и переводит базу данных из одного целостного состояния в другое целостное состояние (оператор COMMIT, смысл слова commit – «зафиксировать» результаты транзакции), либо, если по каким-либо причинам, одно из действий транзакции невыполнимо, или произошло какое-либо нарушение работы системы, база данных возвращается в исходное состояние, которое было до начала транзакции (происходит откат транзакции, оператор ROLLBACK, (смысл слова rollback – ликвидировать результаты транзакции).
176
С этой точки зрения, транзакции важны как в многопользовательских, так и в однопользовательских системах. В однопользовательских системах транзакции – это логические единицы работы, после выполнения которых база данных остается в целостном состоянии. Транзакции также являются единицами восстановления данных после сбоев – восстанавливаясь, система ликвидирует следы транзакций, не успевших успешно завершиться в результате программного или аппаратного сбоя. Эти два свойства транзакций определяют атомарность (неделимость) транзакции. В многопользовательских системах, кроме того, транзакции служат для обеспечения изолированной работы отдельных пользователей – пользователям, одновременно работающим с одной БД, кажется, что они работают как бы в однопользовательской системе и не мешают друг другу.
Для иллюстрации возможного нарушения целостности базы данных рассмотрим следующий пример:
Пример 1 Пусть имеется система, в которой хранятся данные о подразделениях и работающих в них сотрудниках. Список подразделений хранится в таблице DEPART(Dep_Id, Dep_Name, Dept_Kol), где Dept_Id – идентификатор подразделения, Dept_Name – наименование подразделения, Dept_Kol – количество сотрудников в подразделении. Список сотрудников хранится в таблице PERSON(Pers_Id, Pers_Name, Dept_Id), где Pers_Id – идентификатор сотрудника, Pers_Name - имя сотрудника, Dept_Id – идентификатор подразделения, в котором работает сотрудник:
DEPART
Dept_Id |
Dept_Name |
Dept_Kol |
1 |
Кафедра алгебры |
3 |
2 |
Кафедра программи- |
2 |
|
рования |
|
PERSON
Pers_Id |
Pers_Name |
Dept_Id |
1 |
Иванов |
1 |
2 |
Петров |
2 |
|
|
|
3 |
Сидоров |
1 |
4 |
Пушников |
2 |
5 |
Шарипов |
1 |
Ограничение целостности этой базы данных состоит в том, что поле Dept_Kol не может заполняться произвольными значениями - это поле должно содержать количество сотрудников, реально числящихся в подразделении.
С учетом этого ограничения можно заключить, что вставка нового сотрудника в таблицу не может быть выполнена одной операцией. При
177
вставке нового сотрудника необходимо одновременно увеличить значение поля Dept_Kol:
−Шаг 1. Вставить сотрудника в таблицу PERSON: INSERT INTO PERSON (6, Муфтахов, 1)
−Шаг 2. Увеличить значение поля Dept_Kol:
UPDATE DEPART SET Dept=Dept+1 WHERE Dept_Id=1 Если после выполнения первой операции и до выполнения второй
произойдет сбой системы, то реально будет выполнена только первая операция и база данных остается в нецелостном состоянии.
11.1 Понятие транзакции
последовательность операторов манипулирования данны-
ТРАНЗАКЦИЯ
ми, выполняющаяся как единое целое и переводящая базу данных из одного целостного состояния в другое целостное состояние
Существуют различные модели транзакций, которые могут быть классифицированы на основании различных свойств, включающих структуру транзакции, параллельность внутри транзакции, продолжительность и т.д.
В настоящий момент выделяют следующие типы транзакций:
−плоские или классические транзакции;
−цепочечные транзакции;
−вложенные транзакции.
Чаще всего имеют в виду традиционные транзакции, характеризуемые четырьмя классическими свойствами: атомарности, согласованности, изолированности, долговечности (прочности) – ACID (Atomicity, Consistency, Isolation, Durability). Иногда традиционные транзакции называют ACID-транзакциями. Упомянутые выше свойства означают следующее.
Транзакция обладает четырьмя важными свойствами, известными как свойства ACID АСИД [10]:
−(А) Atomicity, атомарность. Транзакция выполняется как атомарная операция - либо выполняется вся транзакция целиком, либо она целиком не выполняется.
−(С) Consistency, согласованность. Транзакция переводит базу данных из одного согласованного (целостного) состояния в другое согла-
178
сованное (целостное) состояние. Внутри транзакции согласованность базы данных может нарушаться.
−(И) Isolation, изоляция. Конкурирующие за доступ к базе данных транзакции физически обрабатываются последовательно, изолированно друг от друга, но для пользователей это выглядит так, как будто они выполняются параллельно.
−(Д) Durability, долговечность. Если транзакция выполнена, то результаты ее работы должны сохраниться в базе данных, даже если в следующий момент произойдет сбой системы.
Свойства АСИД транзакций не всегда выполняются в полном объеме. Особенно это относится к свойству И (изоляция). В идеале, транзакции разных пользователей не должны мешать друг другу, т.е. они должны выполняться так, чтобы у пользователя создавалась иллюзия, что он в системе один. Простейший способ обеспечить абсолютную изолированность состоит в том, чтобы выстроить транзакции в очередь и выполнять их строго одну за другой. Очевидно, при этом теряется эффективность работы системы. Поэтому реально одновременно выполняется несколько транзакций (смесь транзакций). Различается несколько уровней изоляции транзакций. На низшем уровне изоляции транзакции могут реально мешать друг другу, на высшем они полностью изолированы. За большую изоляцию транзакций приходится платить большими накладными расходами системы и замедлением работы. Пользователи или администратор системы могут по своему усмотрению задавать различные уровни всех или отдельных транзакций.
Свойство Д (долговечность) также не является абсолютными свойством, т.к. некоторые системы допускают вложенные транзакции. Если транзакция Б запущена внутри транзакции А, и для транзакции Б подана команда COMMIT WORK, то фиксация данных транзакции Б является условной, т.к. внешняя транзакция А может откатиться. Результаты работы внутренней транзакции Б будут окончательно зафиксированы только если будет зафиксирована внешняя транзакция А.
11.2 Ограничения целостности
Свойство (С) – согласованность транзакций – определяется наличием понятия согласованности базы данных. Ограничение целостности –
179
это некоторое утверждение, которое может быть истинным или ложным в зависимости от состояния базы данных. Примерами ограничений целостности могут служить следующие утверждения:
Пример 2 Возраст сотрудника не может быть меньше 18 и больше 65 лет.
Пример 3 Каждый сотрудник имеет уникальный табельный номер.
Пример 4 Сотрудник обязан числиться в одном отделе.
Пример 5 Сумма накладной обязана равняться сумме произведений цен товаров на количество товаров для всех товаров, входящих в накладную.
Как видно из этих примеров, некоторые из ограничений целостности являются ограничениями реляционной модели данных. Пример 3 представляет ограничение, реализующее целостность сущности. Пример 4 представляет ограничение, реализующее ссылочную целостность. Другие ограничения являются достаточно произвольными утверждениями (примеры 2 и 5). Любое ограничение целостности является семантическим понятием, т.е. появляется как следствие определенных свойств объектов предметной области и/или их взаимосвязей.
БД находится в согласованном (целостном) состоянии, если выполнены (удовлетворены) все ограничения целостности, определенные для базы данных.
Вместе с понятием целостности базы данных возникает понятие реакции системы на попытку нарушения целостности. Система должна не только проверять, не нарушаются ли ограничения в ходе выполнения различных операций, но и должным образом реагировать, если операция приводит к нарушению целостности. Имеется два типа реакции на попытку нарушения целостности:
−отказ выполнить «незаконную» операцию;
−выполнение компенсирующих действий.
Например, если система знает, что в поле «Возраст_Сотрудника» должны быть целые числа в диапазоне от 18 до 65, то система отвергает попытку ввести значение возраста 66. При этом может генерироваться ка- кое-нибудь сообщение для пользователя.
В противоположность этому, в примере 1 система допускает вставку записи о новом сотруднике (что приводит к нарушению целостности базы данных), но автоматически производит компенсирующие действия, изменяя значение поля Dept_Kol в таблице DEPART.
180
