- •Основы современных баз данных
- •1.1. Файловые системы
- •1.1.1. Структуры файлов
- •1.1.2. Именование файлов
- •1.1.3. Защита файлов
- •1.1.4. Режим многопользовательского доступа
- •1.2. Области применения файлов
- •1.3. Потребности информационных систем
- •2.1. Основные функции субд
- •2.1.1. Непосредственное управление данными во внешней памяти
- •2.1.2. Управление буферами оперативной памяти
- •2.1.3. Управление транзакциями
- •2.1.4. Журнализация
- •2.1.5. Поддержка языков бд
- •2.2. Типовая организация современной субд
- •2.3. Пример: System r
- •3.1. Основные особенности систем, основанных на инвертированных списках
- •3.1.1. Структуры данных
- •3.1.2. Манипулирование данными
- •3.1.3. Ограничения целостности
- •3.2. Иерархические системы
- •3.2.1. Иерархические структуры данных
- •3.2.2. Манипулирование данными
- •3.2.3. Ограничения целостности
- •3.3. Сетевые системы
- •3.3.1. Сетевые структуры данных
- •3.3.2. Манипулирование данными
- •3.3.3. Ограничения целостности
- •3.4. Достоинства и недостатки
- •4.1. Базовые понятия реляционных баз данных
- •4.1.1. Тип данных
- •4.1.2. Домен
- •4.1.3. Схема отношения, схема базы данных
- •4.1.4. Кортеж, отношение
- •4.2. Фундаментальные свойства отношений
- •4.2.1. Отсутствие кортежей-дубликатов
- •4.2.2. Отсутствие упорядоченности кортежей
- •4.2.3. Отсутствие упорядоченности атрибутов
- •4.2.4. Атомарность значений атрибутов
- •4.3. Реляционная модель данных
- •4.3.1. Общая характеристика
- •4.3.2. Целостность сущности и ссылок
- •5.1. Реляционная алгебра
- •5.1.1. Общая интерпретация реляционных операций
- •5.1.2. Замкнутость реляционной алгебры и операция переименования
- •5.1.3. Особенности теоретико-множественных операций реляционной алгебры
- •5.1.4. Специальные реляционные операции
- •5.2. Реляционное исчисление
- •5.2.1. Кортежные переменные и правильно построенные формулы
- •5.2.2. Целевые списки и выражения реляционного исчисления
- •5.2.3. Реляционное исчисление доменов
- •6.1. Проектирование реляционных баз данных с использованием нормализации
- •6.1.1. Вторая нормальная форма
- •6.1.2. Третья нормальная форма
- •6.1.3. Нормальная форма Бойса-Кодда
- •6.1.4. Четвертая нормальная форма
- •6.1.5. Пятая нормальная форма
- •6.2. Семантическое моделирование данных, er-диаграммы
- •6.2.1. Семантические модели данных
- •6.2.2. Основные понятия модели Entity-Relationship (Сущность-Связи)
- •6.2.3. Нормальные формы er-схем
- •6.2.4. Более сложные элементы er-модели
- •6.2.5. Получение реляционной схемы из er-схемы
- •7.1. Используемая терминология
- •7.2. Основные цели System r и их связь с архитектурой системы
- •7.3. Организация внешней памяти в базах данных System r
- •7.4. Интерфейс rss
- •7.5. Синхронизация в System r
- •7.6. Журнализация и восстановление в System r
- •8.1. История субд Ingres
- •8.2. Ingres как unix-ориентированная субд. Динамическая структура системы: набор процессов
- •8.3. Структуры данных, методы доступа, интерфейсы доступа к данным
- •8.4. Общая характеристика языка quel. Язык программирования equel
- •8.5. Общий подход к организации представлений, ограничениям целостности и контролю доступа
- •9.1. Хранение отношений
- •9.2. Индексы
- •9.2.1. B-деревья
- •9.2.2. Хэширование
- •9.3. Журнальная информация
- •9.4. Служебная информация
- •10.1. Транзакции и целостность баз данных
- •10.2. Изолированность пользователей
- •10.3. Сериализация транзакций
- •11.1. Синхронизационные захваты
- •11.1.1. Гранулированные синхронизационные захваты
- •11.1.2. Предикатные синхронизационные захваты
- •11.1.3. Тупики, распознавание и разрушение
- •11.2. Метод временных меток
- •12.1. Журнализация и буферизация
- •12.2. Индивидуальный откат транзакции
- •12.3. Восстановление после мягкого сбоя
- •12.4. Физическая согласованность базы данных
- •12.5. Восстановление после жесткого сбоя
- •13.1. Sequel/sql субд System r
- •13.1.1. Запросы и операторы манипулирования данными
- •13.1.2. Операторы определения и манипулирования схемой бд
- •13.1.3. Определения ограничений целостности и триггеров
- •13.1.4. Представления базы данных
- •13.1.5. Определение управляющих структур
- •13.1.6. Авторизация доступа к отношениям и их полям
- •13.1.7. Точки сохранения и откаты транзакции
- •13.1.8. Встроенный sql
- •13.1.9. Динамический sql
- •13.2. Язык sql в коммерческих реализациях
- •13.3. Стандартизация sql
- •14.1. Типы данных
- •14.2. Средства определения схемы
- •14.2.1. Оператор определения схемы
- •14.2.2. Определение таблицы
- •14.2.3. Определение столбца
- •14.2.4. Определение ограничений целостности таблицы
- •14.2.5. Определение представлений
- •14.2.6. Определение привилегий
- •15.1. Структура запросов
- •15.1.1. Спецификация курсора
- •15.1.2. Оператор выборки
- •15.1.3. Подзапрос
- •15.2. Табличное выражение
- •15.2.1. Раздел from
- •15.2.2. Раздел where
- •15.2.3. Раздел group by
- •15.2.4. Раздел having
- •15.3. Агрегатные функции и результаты запросов
- •15.3.1. Семантика агрегатных функций
- •15.3.2. Результаты запросов
- •16.1. Язык модулей или встроенный sql?
- •16.2. Язык модулей
- •16.2.1. Определение процедуры
- •16.3. Встроенный sql
- •16.4. Набор операторов манипулирования данными
- •16.4.1. Операторы, связанные с курсором
- •16.4.2. Одиночные операторы манипулирования данными
- •16.5. Динамический sql в Oracle V.6
- •16.5.1. Оператор подготовки
- •16.5.2. Оператор получения описания подготовленного оператора
- •16.5.3. Оператор выполнения подготовленного оператора
- •16.5.4. Работа с динамическими операторами sql через курсоры
- •17.1. Оператор выделения памяти под дескриптор
- •17.2. Оператор освобождения памяти из-под дескриптора
- •17.3. Оператор получения информации из области дескриптора sql
- •17.4. Оператор установки дескриптора
- •17.5. Оператор подготовки
- •17.6. Оператор отказа от подготовленного оператора
- •17.7. Оператор запроса описания подготовленного оператора
- •17.8. Оператор выполнения подготовленного оператора
- •17.9. Оператор подготовки с немедленным выполнением
- •17.10. Оператор объявления курсора над динамически подготовленным оператором выборки
- •17.11. Оператор определения курсора над динамически подготовленным оператором выборки
- •17.12. Оператор открытия курсора, связанного с динамически подготовленным оператором выборки
- •17.18. Подготавливаемый оператор позиционной модификации
- •17.19. Сводка новых возможностей sql-3
- •17.19.1. Типы данных
- •17.19.2. Некоторые другие свойства sql-3
- •18.1. Общая схема обработки запроса
- •18.2. Синтаксическая оптимизация запросов
- •18.2.1. Простые логические преобразования запросов
- •18.2.2 Преобразования запросов с изменением порядка реляционных операций
- •18.2.3 Приведение запросов со вложенными подзапросами к запросам с соединениями
- •18.3. Семантическая оптимизация запросов
- •18.3.1. Преобразования запросов на основе семантической информации
- •18.3.2. Использование семантической информации при оптимизации запросов
- •18.4. Выбор и оценка альтернативных планов выполнения запросов
- •18.4.1. Генерация планов
- •18.4.2. Оценка стоимости плана запроса
- •18.4.3. Более точные оценки
- •19.1. Открытые системы
- •19.2. Клиенты и серверы локальных сетей
- •19.3. Системная архитектура "клиент-сервер"
- •19.4. Серверы баз данных
- •19.4.1. Принципы взаимодействия между клиентскими и серверными частями
- •19.4.2. Преимущества протоколов удаленного вызова процедур
- •19.4.3. Типичное разделение функций между клиентами и серверами
- •19.4.4. Требования к аппаратным возможностям и базовому программному обеспечению клиентов и серверов
- •20.1. Разновидности распределенных систем
- •20.2. Распределенная система управления базами данных System r*
- •20.2.1. Именование объектов и организация распределенного каталога
- •20.2.2. Распределенная компиляция запросов
- •20.2.3. Управление транзакциями и синхронизация
- •20.3. Интегрированные или федеративные системы и мультибазы данных
- •21.1. Ориентация на расширенную реляционную модель
- •21.2. Абстрактные типы данных
- •21.3. Генерация систем баз данных, ориентированных на приложения
- •21.4. Оптимизация запросов, управляемая правилами
- •21.5. Поддержка исторической информации и темпоральных запросов
- •22.1. Связь объектно-ориентированных субд с общими понятиями объектно-ориентированного подхода
- •22.2. Объектно-ориентированные модели данных
- •22.3. Языки программирования объектно-ориентированных баз данных
- •22.3.1. Потеря соответствия между языками программирования и языками запросов в реляционных субд
- •22.3.2. Языки программирования ообд как объектно-ориентированные языки с поддержкой стабильных (persistent) объектов
- •22.3.3. Примеры языков программирования ообд
- •22.4. Языки запросов объектно-ориентированных баз данных
- •22.4.1. Явная навигация как следствие преодоления потери соответствия
- •22.4.2. Ненавигационные языки запросов
- •22.4.3. Проблемы оптимизации запросов
- •22.5. Примеры объектно-ориентированных субд
- •22.5.1. Проект orion
- •22.5.2. Проект o2
- •23.1. Экстенсиональная и интенсиональная части базы данных
- •23.2. Активные базы данных
- •23.3. Дедуктивные базы данных
1.2. Области применения файлов
После этого краткого экскурса в историю файловых систем рассмотрим возможные области их применения. Прежде всего, конечно, файлы применяются для хранения текстовых данных: документов, текстов программ и т.д. Такие файлы обычно образуются и модифицируются с помощью различных текстовых редакторов. Структура текстовых файлов обычно очень проста: это либо последовательность записей, содержащих строки текста, либо последовательность байтов, среди которых встречаются специальные символы (например, символы конца строки).
Файлы с текстами программ используются как входные тексты компиляторов, которые в свою очередь формируют файлы, содержащие объектные модули. С точки зрения файловой системы, объектные файлы также обладают очень простой структурой - последовательность записей или байтов. Система программирования накладывает на эту структуру более сложную и специфичную для этой системы структуру объектного модуля. Подчеркнем, что логическая структура объектного модуля неизвестна файловой системе, эта структура поддерживается программами системы программирования.
Аналогично обстоит дело с файлами, формируемыми редакторами связей и содержащими образы выполняемых программ. Логическая структура таких файлов остается известной только редактору связей и загрузчику - программе операционной системы. Примерно такая же ситуация с файлами, содержащими графическую и звуковую информацию.
Одним словом, файловые системы обычно обеспечивают хранение слабо структурированной информации, оставляя дальнейшую структуризацию прикладным программам. В перечисленных выше случаях использования файлов это даже хорошо, потому что при разработке любой новой прикладной системы опираясь на простые, стандартные и сравнительно дешевые средства файловой системы можно реализовать те структуры хранения, которые наиболее естественно соответствуют специфике данной прикладной области.
1.3. Потребности информационных систем
Однако ситуация коренным образом отличается для упоминавшихся в начале лекции информационных систем. Эти системы главным образом ориентированы на хранение, выбор и модификацию постоянно существующей информации. Структура информации зачастую очень сложна, и хотя структуры данных различны в разных информационных системах, между ними часто бывает много общего. На начальном этапе использования вычислительной техники для управления информацией проблемы структуризации данных решались индивидуально в каждой информационной системе. Производились необходимые надстройки над файловыми системами (библиотеки программ), подобно тому, как это делается в компиляторах, редакторах и т.д.
Но поскольку информационные системы требуют сложных структур данных, эти дополнительные индивидуальные средства управления данными являлись существенной частью информационных систем и практически повторялись от одной системы к другой. Стремление выделить и обобщить общую часть информационных систем, ответственную за управление сложно структурированными данными, явилось, на наш взгляд, первой побудительной причиной создания СУБД. Очень скоро стало понятно, что невозможно обойтись общей библиотекой программ, реализующей над стандартной базовой файловой системой более сложные методы хранения данных.
Покажем это на примере. Предположим, что мы хотим реализовать простую информационную систему, поддерживающую учет сотрудников некоторой организации. Система должна выполнять следующие действия: выдавать списки сотрудников по отделам, поддерживать возможность перевода сотрудника из одного отдела в другой, приема на работу новых сотрудников и увольнения работающих. Для каждого отдела должна поддерживаться возможность получения имени руководителя этого отдела, общей численности отдела, общей суммы выплаченной в последний раз зарплаты и т.д. Для каждого сотрудника должна поддерживаться возможность выдачи номера удостоверения по полному имени сотрудника, выдачи полного имени по номеру удостоверения, получения информации о текущем соответствии занимаемой должности сотрудника и о размере его зарплаты.
Предположим, что мы решили основывать эту информационную систему на файловой системе и пользоваться при этом одним файлом, расширив базовые возможности файловой системы за счет специальной библиотеки функций. Поскольку минимальной информационной единицей в нашем случае является сотрудник, естественно потребовать, чтобы в этом файле содержалась одна запись для каждого сотрудника. Какие поля должна содержать такая запись? Полное имя сотрудника (СОТР_ИМЯ), номер его удостоверения (СОТР_НОМЕР), информацию о его соответствии занимаемой должности (для простоты, "да" или "нет") (СОТР_СТАТ), размер зарплаты (СОТР_ЗАРП), номер отдела (СОТР_ОТД_НОМЕР). Поскольку мы хотим ограничиться одним файлом, та же запись должна содержать имя руководителя отдела (СОТР_ОТД_РУК).
Функции нашей информационной системы требуют, чтобы обеспечивалась возможность многоключевого доступа к этому файлу по уникальным ключам (недублируемым в разных записях) СОТР_ИМЯ и СОТР_НОМЕР. Кроме того, должна обеспечиваться возможность выбора всех записей с общем значением СОТР_ОТД_НОМЕР, то есть доступ по неуникальному ключу. Для того, чтобы получить численность отдела или общий размер зарплаты, каждый раз при выполнении такой функции информационная система должна будет выбрать все записи о сотрудниках отдела и посчитать соответствующие общие значения.
Таким образом мы видим, что даже для такой простой системы ее реализация на базе файловой системы, во-первых, требует создания достаточно сложной надстройки для многоключевого доступа к файлам, и, во-вторых, вызывает требование существенной избыточности хранения (для каждого сотрудника одного отдела повторяется имя руководителя) и выполнение массовой выборки и вычислений для получения суммарной информации об отделах. Кроме того, если в ходе эксплуатации системы нам захочется, например, выдавать списки сотрудников, получающих заданную зарплату, то придется либо полностью просматривать файл, либо реструктуризовывать его, объявляя ключевым поле СОТР_ЗАРП.
Первое, что приходит на ум, - это поддерживать два многоключевых файла: СОТРУДНИКИ и ОТДЕЛЫ. Первый файл должен содержать поля СОТР_ИМЯ, СОТР_НОМЕР, СОТР_СТАТ, СОТР_ЗАРП и СОТР_ОТД_НОМЕР, а второй - ОТД_НОМЕР, ОТД_РУК, ОТД_СОТР_ЗАРП (общий размер зарплаты) и ОТД_РАЗМЕР (общее число сотрудников в отделе). Большинство неудобств, перечисленных в предыдущем абзаце, будут преодолены. Каждый из файлов будет содержать только недублируемую информацию, необходимости в динамических вычислениях суммарной информации не возникает. Но заметим, что при таком переходе наша информационная система должна обладать некоторыми новыми особенностями, сближающими ее с СУБД.
Прежде всего, система должна теперь знать, что она работает с двумя информационно связанными файлами (это шаг в сторону схемы базы данных), должна знать структуру и смысл каждого поля (например, что СОТР_ОТД_НОМЕР в файле СОТРУДНИКИ и ОТД_НОМЕР в файле ОТДЕЛЫ означают одно и то же), а также понимать, что в ряде случаев изменение информации в одном файле должно автоматически вызывать модификацию во втором файле, чтобы их общее содержимое было согласованным. Например, если на работу принимается новый сотрудник, то необходимо добавить запись в файл СОТРУДНИКИ, а также соответствующим образом изменить поля ОТД_ЗАРП и ОТД_РАЗМЕР в записи файла ОТДЕЛЫ, описывающей отдел этого сотрудника.
Понятие согласованности данныхявляется ключевым понятием баз данных. Фактически, если информационная система (даже такая простая, как в нашем примере) поддерживает согласованное хранение информации в нескольких файлах, можно говорить о том, что она поддерживает базу данных. Если же некоторая вспомогательная система управления данными позволяет работать с несколькими файлами, обеспечивая их согласованность, можно назвать ее системой управления базами данных. Уже только требование поддержания согласованности данных в нескольких файлах не позволяет обойтись библиотекой функций: такая система должна иметь некоторые собственные данные (метаданные) и даже знания, определяющие целостность данных.
Но это еще не все, что обычно требуют от СУБД. Во-первых, даже в нашем примере неудобно реализовывать такие запросы как "выдать общую численность отдела, в котором работает Петр Иванович Сидоров". Было бы гораздо проще, если бы СУБД позволяла сформулировать такой запрос на близком пользователям языке. Такие языки называются языками запросов к базам данных. Например, на языке SQL наш запрос можно было бы выразить в форме:
SELECT ОТД_РАЗМЕР
FROM СОТРУДНИКИ, ОТДЕЛЫ
WHERE СОТР_ИМЯ = "ПЕТР ИВАНОВИЧ СИДОРОВ"
AND СОТР_ОТД_НОМЕР = ОТД_НОМЕР
Таким образом, при формулировании запроса СУБД позволит не задумываться о том, как будет выполняться этот запрос. Среди ее метаданных будет содержаться информация о том, что поле СОТР_ИМЯ является ключевым для файла СОТРУДНИКИ, а ОТД_НОМЕР - для файла ОТДЕЛЫ, и система сама воспользуется этим. Если же возникнет потребность в получении списка сотрудников, не соответствующих занимаемой должности, то достаточно предъявить системе запрос
SELECT СОТР_ИМЯ, СОТР_НОМЕР
FROM СОТРУДНИКИ
WHERE СОТР_СТАТ = "НЕТ",
и система сама выполнит необходимый полный просмотр файла СОТРУДНИКИ, поскольку поле СОТР_СТАТ не является ключевым.
Далее, представьте себе, что в нашей первоначальной реализации информационной системы, основанной на использовании библиотек расширенных методов доступа к файлам, обрабатывается операция регистрации нового сотрудника. Следуя требованиям согласованного изменения файлов, информационная система вставила новую запись в файл СОТРУДНИКИ и собиралась модифицировать запись файла ОТДЕЛЫ, но именно в этот момент произошло аварийное выключение питания. Очевидно, что после перезапуска системы ее база данных будет находиться в рассогласованном состоянии. Потребуется выяснить это (а для этого нужно явно проверить соответствие информации с файлах СОТРУДНИКИ и ОТДЕЛЫ) и привести информацию в согласованное состояние. Настоящие СУБД берут такую работу на себя. Прикладная система не обязана заботиться о корректности состояния базы данных.
Наконец, представим себе, что мы хотим обеспечить параллельную (например, многотерминальную) работу с базой данных сотрудников. Если опираться только на использование файлов, то для обеспечения корректности на все время модификации любого из двух файлов доступ других пользователей к этому файлу будет блокирован (вспомните возможности файловых систем для синхронизации параллельного доступа). Таким образом, зачисление на работу Петра Ивановича Сидорова существенно затормозит получение информации о сотруднике Иване Сидоровиче Петрове, даже если они будут работать в разных отделах. Настоящие СУБД обеспечивают гораздо более тонкую синхронизацию параллельного доступа к данным.
Таким образом, СУБД решают множество проблем, которые затруднительно или вообще невозможно решить при использовании файловых систем. При этом существуют приложения, для которых вполне достаточно файлов; приложения, для которых необходимо решать, какой уровень работы с данными во внешней памяти для них требуется, и приложения, для которых безусловно нужны базы данных.
Лекция 2. Функции СУБД. Типовая организация СУБД. Примеры
Как было показано в первой лекции, традиционных возможностей файловых систем оказывается недостаточно для построения даже простых информационных систем. Мы выявили несколько потребностей, которые не покрываются возможностями систем управления файлами: поддержание логически согласованного набора файлов; обеспечение языка манипулирования данными; восстановление информации после разного рода сбоев; реально параллельная работа нескольких пользователей. Можно считать, что если прикладная информационная система опирается на некоторую систему управления данными, обладающую этими свойствами, то эта система управления данными является системой управления базами данных (СУБД).