- •1 Основные понятия и определения
- •1.1Информационные системы и банки данных
- •1.2Назначение и основные компоненты банка данных
- •1.3Трех уровневая архитектура абстракций базы данных.
- •1.4Физическая и логическая независимость данных
- •1.5Администратор базы данных
- •1.6Системы управления базами данных
- •1.7Схема обмена данными при работе с базой данных
- •1.8Локальные информационные системы
- •1.9Информационные системы в сетях
- •2Модели данных концептуального уровня
- •2.1Иерархическая модель данных
- •2.2Сетевая модель
- •2.3Реляционная модель
- •2.4Постреляционная модель
- •2.5Многомерная модель
- •2.6Объектно-ориентированная модель
- •3Физические модели баз данных
- •3.1Файловые структуры, используемые в базах данных
- •3.2 Хешированные файлы
- •3.2.1Стратегия разрешения коллизий с областью переполнения
- •3.2.2Организация стратегии свободного замещения
- •3.3Индексные файлы
- •3.3.1Файлы с плотным индексом, или индексно-прямые файлы
- •3.3.2Файлы с неплотным индексом, или индексно-последовательные файлы
- •3.3.3Организация индексов в виде b-tree (в-деревьев)
- •3.4Моделирование отношений «один-ко-многим» на файловых структурах
- •3.5Инвертированные списки
- •3.6Модели бесфайловой организации данных
- •4Реляционная модель данных
- •4.1Основные определения
- •4.2Соглашения об отношениях в реляционных системах
- •4.3Классы отношений
- •4.3.1Классы отношений с точки зрения способов создания и хранения
- •4.3.2Классификация отношений с точки зрения их содержания
- •4.4Операции реляционной алгебры
- •4.4.1Основные понятия
- •4.4.2Базовые теоретико-множественные операции
- •4.4.3Специальные операции реляционной алгебры
- •4.4.4Связи между отношениями (таблицами)
- •4.5Реляционное исчисление
- •4.6Язык запросов по образцу qbe
- •4.7Структурированный язык запросов sql
- •4.7.1История развития sql
- •4.7.2Общая характеристика языка
- •4.7.3Структура sql
- •4.7.4Оператор выбора select
- •4.7.5Применение агрегатных функций и группировки
- •4.7.6Раздел order by и ключевое слово top
- •4.7.7Вложенные запросы
- •4.7.8Внутренние и внешние объединения
- •4.7.9Перекрестные запросы
- •4.7.10Операторы манипулирования данными
- •4.7.11Запросы на создание таблиц
- •4.7.12Использование языка определения данных
- •4.8Правила Кодда (требования к реляционным бд)
- •5Проектирование баз данных
- •5.1Этапы проектирования бд
- •5.2Проблемы проектирования реляционных баз данных
- •5.3Нормализация отношений
- •5.4Метод сущность-связь
- •5.5Средства автоматизации проектирования
- •5.5.1Основные определения
- •5.5.2Модели жизненного цикла
- •5.5.3Модели структурного проектирования
- •5.5.4Объектно-ориентированные модели
- •5.5.5 Классификация case-средств
- •6Защита информации в базах данных
- •6.1Общие подходы к обеспечению безопасности данных
- •6.2Назначение и проверка полномочий, проверка подлинности
- •6.3Средства защиты базы данных
- •7Базы данных в сетях
- •7.1Организация базы данных в локальной сети
- •7.2Модели архитектуры клиент-сервер
- •7.3Управление распределенными данными
- •8История развития баз данных
3.3.1Файлы с плотным индексом, или индексно-прямые файлы
В этих файлах основная область содержит последовательность записей одинаковой длины, расположенных в произвольном порядке, а индексные записи состоят из двух полей: значение ключа, номер записи. Значение ключа – это значение первичного ключа, а номер записи – это порядковый номер записи в основной области, которая имеет данное значение первичного ключа.
Если индексные файлы строятся для первичных ключей, однозначно определяющих запись, то в них не может быть двух записей, имеющих одинаковые значения первичного ключа. В индексных файлах с плотным индексом для каждой записи в основной области существует одна запись из индексной области. Все записи в индексной области упорядочены по значению ключа, поэтому можно применить более эффективные способы поиска в упорядоченном пространстве.
Длина доступа к произвольной записи оценивается не в абсолютных значениях, а в количестве обращений к устройству внешней памяти, которым обычно является диск. Обращение к диску является наиболее длительной операцией по сравнению со всеми обработками в оперативной памяти.
Наиболее эффективным алгоритмом поиска на упорядоченном массиве является логарифмический или бинарный поиск. При этом все пространство поиска разбивается пополам, и так как оно строго упорядочено, то определяется сначала, не является ли элемент искомым, а если нет, то в какой половине его надо искать. На следующем шаге выбранную половину вновь делят пополам и проводят аналогичные сравнения до тех пор, пока не обнаружат искомый элемент. Максимальное количество шагов поиска определяется двоичным логарифмом от общего числа элементов в искомом пространстве поиска:
Тn = log2N,
где N – число элементов.
Однако в нашем случае является существенным только число обращений к диску при поиске записи по заданному значению первичного ключа. Поиск происходит в индексной области, где применяется двоичный алгоритм поиска индексной записи, а потом путем прямой адресации мы обращаемся к основной области уже по конкретному номеру записи. Для того, чтобы оценить максимальное время доступа, нам необходимо определить количество обращений к диску для поиска произвольной записи.
На диске записи файлов хранятся в блоках. Размер блока определяется физическими особенностями дискового контроллера и операционной системой. В одном блоке может размещаться несколько записей. Поэтому надо определить количество индексных блоков, которое потребуется для размещения всех индексных записей, а потому максимальное число обращений к диску будет равно двоичному логарифму от заданного числа блоков плюс единица. После поиска номера записи в индексной области необходимо еще обратиться к основной области файла (отсюда появляется 1). Формула вычисления количества обращений к диску следующая:
Tn = log2Nбл.инд. + 1.
Рассмотрим пример, позволяющий сравнить количество обращений к диску при последовательном просмотре и при организации плотного индекса.
Пусть имеются следующие исходные данные:
длина записи файла (LF) – 128байт;
длина первичного ключа (LK) – 12 байт;
количество записей в файле (KZ) – 100 000;
размер блока (LB) – 1024 байта.
Рассчитаем размер индексной записи. Для представления целого числа в пределах 100 000 потребуется 3 байта. Если считать, что допустима только четная адресация, то надо отвести 4 байта для хранения номера записи, тогда длина индексной записи будет равна сумме размера ключа и ссылки на номер записи, то есть:
LI = LK + 4 = 12 + 4 = 16 байт.
Определим количество индексных блоков, которое потребуется для обеспечения ссылок на заданное количество записей. Для этого сначала определим, сколько индексных записей может храниться в одном блоке:
KIZB = LB/LI = 1024 / 16 =64 индексных записи в одном блоке.
Теперь определим необходимое количество индексных блоков:
KIB = KZ / KIZB = 100 000 / 64 = 1563 блока.
Результат округлен в большую сторону, потому что пространство выделяется целыми блоками, и последний блок будет заполнен не полностью.
Максимальное количество обращений к диску при поиске произвольной записи:
Тпоиска = log2KIB + 1 = log21563 + 1 = 11 + 1 = 12 обращений к диску.
Логарифм в вычислениях также округлен.
Следовательно, для поиска произвольной записи по первичному ключу при организации плотного индекса потребуется не более 12 обращений к диску.
При отсутствии индексного пространства для поиска нужной записи необходимо просмотреть все блоки, в которых хранится файл, временем просмотра записей внутри блока пренебрегаем, так как этот процесс происходит в оперативной памяти.
Количество блоков, которое необходимо для хранения 100 000 записей, определяют по следующей формуле:
KBO = KZ / (LB / LZ) = 100 000 / (1024/128) = 12500 блоков.
Выигрыш при использовании файла с плотным индексом очевиден (12 или 12500 обращений к диску).
Рассмотрим, как осуществляются операции добавления и удаления новых записей.
При операции добавления осуществляется запись в конец основной области. В индексной области необходимо произвести занесение информации в конкретное место, чтобы не нарушать упорядоченности. Поэтому вся индексная область файла разбивается на блоки и при начальном заполнении в каждом блоке остается свободная область (область расширения) (рис 3.3).
Ссылка на
Ключ номер записи
|
|
01-30-01 |
5 |
|
|
||||
|---|---|---|---|---|---|---|---|---|---|
|
Блок 1 |
02-40-02 |
2 |
|
|
||||
|
|
05-40-00 |
4 |
|
|
||||
|
|
Свободная область |
Индексная |
||||||
|
|
06-40-00 |
1 |
область |
|
||||
|
Блок 2 |
06-50-01 |
6 |
|
|
||||
|
|
07-35-00 |
3 |
|
|
||||
|
|
Свободная область |
|
|
|||||
1 |
06-40-00 |
Васильев |
|
|
|||||
2 |
02-40-02 |
Лукина |
|
|
|||||
3 |
07-35-00 |
Сидоров |
Основная |
|
|||||
4 |
05-40-00 |
Попова |
область |
|
|||||
5 |
01-30-01 |
Архипова |
|
|
|||||
6 |
06-50-01 |
Павлов |
|
|
|||||
Рис. 3.3. Пример организации файла с плотным индексом
После определения блока, в который должен быть занесен индекс, этот блок копируется в оперативную память, там он модифицируется путем вставки в нужное место новой записи и измененный записывается обратно на диск.
Определим максимальное количество обращений к диску, которое требуется при добавлении записи, - это количество обращений, необходимое для поиска записи плюс одно обращение для занесения измененного индексного блока и плюс одно обращение для занесения записи в основную область.
Тдобавления = log2N + 1 + 1 + 1.
В процессе добавления новых записей область расширения постоянно уменьшается. Когда исчезнет свободная область, возникает переполнение индексной области. В этом случае возможны два решения: либо перестроить заново индексную область, либо организовать область переполнения для индексной области, в которой будут храниться не поместившиеся в основную область записи. Однако первый способ потребует дополнительного времени на перестройку индексной области, а второй увеличит время на доступ к произвольной записи и потребует организации дополнительных ссылок в блоках на область переполнения. Поэтому при проектировании физической базы данных важно заранее как можно точнее определить объемы хранимой информации, спрогнозировать ее рост и предусмотреть соответствующее расширение области хранения.
При удалении записи возникает следующая последовательность действий: запись в основной области помечается как удаленная (отсутствующая), в индексной области соответствующий индекс уничтожается физически, то есть записи, следующие за удаленной записью, перемещаются на ее место и блок, в котором хранился данный индекс, заново записывается на диск. При этом количество обращений к диску для этой операции такое же, как и при добавлении новой записи.
