- •Часть 1
- •Глава 1. Управление базами данных.
- •1.1. Вводный пример
- •1.2. Что такое система баз данных
- •1.3. Что такое база данных
- •Свойства
- •1.4. Почему база данных
- •1.5.Независимость данных
- •1.6. Реляционные и другие системы
- •1.7. Резюме
- •1.5. А)
- •Глава 2.
- •2.1. Цель
- •2.2. Три уровня архитектуры
- •2.3. Внешний уровень
- •2.4. Концептуальный уровень
- •2.5. Внутренний уровень
- •2.6. Отображения
- •2.7. Администратор базы данных
- •2.8. Система управления базой данных
- •2.9. Система управления передачей данных
- •2.10. Архитектура клиент/сервер
- •2.11. Утилиты
- •2.12. Распределенная обработка
- •2.13. Резюме
- •Глава 3.
- •3.1. Введение
- •3.2. Реляционные системы
- •3.3. Замечание относительно терминологии
- •3.4. Реляционная модель
- •3.5. Оптимизация
- •3.6. Каталог
- •3.7. Базовые таблицы и представления
- •3.8. Язык sql
- •3.9. База данных поставщиков и деталей
- •3.10. Резюме
1.5.Независимость данных
Приложения, реализованные на старых системах, в той или иной мере зависят от данных. Это означает, что способ организации данных во вторичной памяти и способ доступа к ним диктуются требованиями приложения; более того, сведения об организации данных и способе доступа встроены в логику и код приложения.
• Пример. Предположим, у нас есть приложение, обрабатывающее файл EMPLOYEE; из соображений эффективности примем, что файл индексирован по определенному полю. В старых системах в этом приложении учитывалось бы, что такой индекс существует, и что последовательность записей в файле определена данным индексом; на этом была бы основана внутренняя структура приложения. В частности, конкретная реализация процедур доступа и обработки исключительных ситуаций в большой степени зависела бы от особенностей интерфейса, обеспечиваемого программами управления данными.
Приложения, подобные описанному в примере, мы называем зависимыми от данных, так как невозможно изменить структуру хранения (т.е. способ физического хранения данных) или метод доступа (т.е. способ осуществления доступа к данным), не изменив самого приложения (возможно, радикально). Например, невозможно заменить индексированный файл в нашем примере на хешированный файл без внесения значительных изменений в приложение. Более того, изменению в таком случае подлежат те части приложения, которые взаимодействуют с программами управления данными, и трудности, возникающие при этом, не имеют никакого отношения к проблеме, для решения которой было написано приложение; это трудности, вызванные структурой интерфейса управления данными.
Однако для системы баз данных крайне нежелательно, чтобы приложение зависело от данных, и тому есть, по меньшей мере, две причины.
1. Для разных приложений требуются разные представления одних и тех же данных. Например, предположим, что до перехода к интегрированной базе данных предприятие имеет два приложения, А и В. Каждое из них имеет свой файл, содержащий поле "баланс заказчика". Предположим также, что приложение А записывает значение этого поля в десятичном формате, а приложение В — в двоичном формате. Эти два файла все еще можно интегрировать, а существующую избыточность устранить, если в СУБД есть возможность выполнить все необходимые преобразования между форматом представления данных(формат представления может быть десятичным, двоичным или любым другим) и форматом, необходимым для приложения. Например, если принято решение сохранять значения поля в десятичном формате, то каждое обращение к приложению В потребует преобразования значений в двоичный формат или из двоичного формата.
Это довольно простой пример тех различий, которые могут существовать в системе баз данных между формой представления данных в приложении и формой их физического хранения. Многие другие возможные различия мы рассмотрим позднее.
2. Администратор базы данных должен иметь возможность при изменившихся требованиях изменять структуру хранения или метод доступа к данным без изменения существующих приложений. Например, к базе данных могут быть добавлены новые виды данных; на предприятии могут быть приняты новые стандарты; могут быть изменены приоритеты приложений (а следовательно, и связанные с ними требования к производительности); могут появиться новые типы запоминающих устройств и т.д. Если приложения зависят от данных, то перечисленные изменения потребуют изменения программ и усилий программистов, которые можно было бы направить на создание новых приложений. До сих пор эта проблема не редкость; и сегодня случается, что 25% рабочего времени программистов (или даже больше) тратится на подобную работу, а это, конечно, бесполезная трата дефицитных и ценных ресурсов.
Таким образом, обеспечение независимости данных — основная цель систем баз данных. Независимость данных можно определить как иммунитет приложений к изменениям в структуре хранения данных и в методах доступа к данным, а это означает, что рассматриваемые приложения не зависят от любой конкретной структуры хранения и конкретных методов доступа. Далее в книге будет описана архитектура систем баз данных, обеспечивающая основу для достижения этой цели. Но прежде рассмотрим более детально некоторые примеры тех изменений, в выполнении которых может возникнуть необходимость у АБД и к которым, следовательно, должны быть невосприимчивы приложения.
Начнем с определения трех новых терминов: хранимое поле, хранимая запись и хранимый файл (рис. 1.7).
• Хранимое поле — это наименьшая единица хранимых данных. Вообще, база данных содержит много экземпляров каждого из нескольких типов хранимых полей. Например, база данных, содержащая информацию о деталях, может содержать тип хранимых полей с именем "номер детали", и для каждого вида детали (винт, шарнир, колпак и т.д.) предусмотрен один экземпляр этого хранимого поля.
•Хранимая запись — это набор связанных хранимых полей. И снова мы различаем тип и экземпляр. В данном случае экземпляр хранимой записи состоит из группы связанных экземпляров хранимых полей. Например, экземпляр хранимой записи в базе данных деталей состоит из экземпляров каждого из хранимых полей: номер детали, название детали, цвет детали и вес детали. Мы говорим, что база данных содержит множество экземпляров хранимой записи типа "'деталь" (один экземпляр для каждой определенной детали).
Заметим, что слова "тип" и "экземпляр" часто опускают, а что имеется в виду, следует выяснять по контексту. Хотя эта практика иногда может привести к недоразумению, она удобна и мы по ходу изложения будем время от времени прибегать к ней.
• И, наконец, хранимый файл — это набор всех экземпляров хранимых записей одного типа.
Замечание. Здесь умышленно не рассматривается предположение, что в хранимом файле может быть несколько типов хранимых записей. Это еще одно упрощающее предположение, которое не окажет существенного влияния на последующие рассуждения.
В системах, отличных от баз данных, обычно логическая запись совпадает с соответствующей хранимой записью. Как было показано выше, в базах данных это вовсе не обязательно, так как АБД может понадобиться внести изменения в структуру хранения данных (т.е. в хранимые поля, записи, файлы), в то время как логическая структура останется неизменной. Например, упомянутое выше поле 'вес детали'' может быть сохранено в двоичном формате для экономии памяти, тогда как какое-либо приложение, написанное на языке COBOL, может рассматривать это поле как символьную строку. А позже может понадобиться изменить форму с двоичной на десятичную, позволяя приложению по-прежнему рассматривать поле в символьном формате.
Как установлено ранее, разница, подобная этой, требующая преобразования данных определенного поля при каждом обращении к ним, сравнительно незначительна; однако в принципе разница между тем, что "видит" приложение и что сохраняется на самом деле, может быть довольно значительна. Развивая это замечание, перечислим аспекты структуры хранения баз данных, которые можно подвергнуть изменениям. Читателю предлагается подумать над тем, что должна сделать СУБД для защиты приложения от таких изменений (и всегда ли такую защиту можно обеспечить).
• Представление числовых данных.
Числовое поле может храниться во внутренней арифметической форме (например, в упакованном десятичном формате) или в виде символьной строки. В каждом случае АБД должен определить подходящее основание системы счисления (например, он может выбрать двоичную или десятичную систему счисления), масштаб (число с фиксированной или плавающей запятой), тип (действительное число или комплексное) и точность (количество цифр). Каждый из этих параметров может быть изменен для повышения производительности, при введении нового стандарта или по другим причинам.
• Представление символьных данных.
Поле в форме символьной строки может сохраняться с помощью нескольких разных наборов кодирования символов (например, таких как ASCII, EBCDIC).
• Единицы для числовых данных.
Единицы числовых полей могут быть изменены, например, с дюймов на сантиметры, если приложение связано с процессами измерения.
• Кодирование данных.
В некоторых ситуациях может понадобиться представлять данные кодированными значениями. Например, поле "цвет детали", которое представлено в приложении как символьная строка ("Красный", "Голубой", "Зеленый"), может храниться в виде десятичной цифры в соответствии с таблицей перекодировки: 1 = "Красный", 2 = "Голубой" и т.д.
• Материализация данных.
Обычно логическое поле, используемое приложением, соответствует некоторому определенному хранимому полю (хотя, как мы видели ранее, могут существовать различия в типе данных, единицах и т.д.). В этом случае процесс материализации, т.е. построение экземпляра логического поля из соответствующего экземпляра хранимого поля и передача его приложению, можно назвать прямым. Однако иногда логическое поле может не иметь соответствующего эквивалентного хранимого поля, а его значение "материализуется" с помощью некоторых вычислений, выполняемых над набором из нескольких экземпляров хранимых полей. Например, значения логического поля "общее количество" можно определить путем суммирования нескольких хранимых значений поля "количество". "Общее количество" — это пример виртуального поля, процесс определения его значения называют непрямым. Однако обратите внимание, что пользователь может отличить реальное поле от виртуального, так как экземпляр виртуального поля нельзя вставить или изменить (напрямую).
• Структура хранимых записей.
Два существующих типа хранимых записей можно объединить в один. Например, типы хранимых записей
Номер детали |
Цвет детали |
и |
Номер детали |
Вес детали |
можно представить в форме
номер детали |
Цвет детали |
вес детали |
Такие изменения могут выполняться, когда в систему баз данных вводятся ранее существующие приложения. При этом предполагается, что логическая запись приложения может состоять из подмножества соответствующей хранимой записи, т.е. некоторые поля хранимой записи будут "невидимы" для рассматриваемого приложения.
И наоборот, один тип хранимых записей можно разделить на два. Воспользуемся записями из предыдущего примера: тип хранимых записей
номер детали |
Цвет детали |
вес детали |
можно разбить на два
Номер детали |
цвет детали |
|
Номер детали |
вес детали |
Такое разделение позволяет редко используемые части исходной записи поместить, например, на более медленное устройство. При этом неявно предполагается, что логическая запись приложения может содержать поля из нескольких отдельных хранимых записей, т.е. логическая запись является расширением любой из этих хранимых записей.
• Структура хранимых файлов.
Хранимый файл может физически храниться в памяти разными способами. Например, его можно разместить на одном томе памяти (например, на одном диске) или распределить на нескольких томах разных типов устройств; он может быть физически упорядочен в соответствии со значениями некоторого хранимого поля; он может быть упорядочен какими-либо другими способами, например с помощью одного или нескольких индексов или встроенных цепочек указателей; к нему может быть обеспечен доступ методом хеш-адресации; хранимые записи могут быть физически объединены в блоки (несколько в одной физической записи). Но ни один из этих факторов не должен влиять каким-либо образом на приложение (за исключением, конечно, эффективности приложения).
Этим ограничиваются аспекты структуры хранения, которые можно подвергнуть изменениям. Здесь среди прочего предполагается, что база данных может развиваться, не оказывая влияния на приложения. В действительности возможность развития базы данных без логического ущерба для существующих приложений является единственным наиболее важным мотивом обеспечения независимости данных. Например, можно было бы расширить существующий тип хранимой записи добавлением новых хранимых полей, представляющих обычно дополнительную информацию о некоторых существующих типах объектов (например, поле "цена" можно добавить к хранимой записи "деталь"). Такие новые поля будут "невидимы" для существующих приложений. Точно так же можно добавить новые типы хранимых записей (а, следовательно, новые хранимые файлы), не изменяя существующих приложений; такие записи обычно представляют собой новые типы объектов (например, тип записи "поставщик" можно добавить к базе данных "детали"). Такие добавления также будут незаметны для приложений.
В заключение заметим, что независимость данных — понятие относительное, различные системы обеспечивают ее в разной мере или не обеспечивают вообще. В целом современные системы более развиты в этом направлении, чем старые, однако, как будет показано в последующих главах, и они имеют свои недостатки.