- •Е.И. Асташева сетевые базы данных
- •Введение
- •1. Введение в базы данных
- •1.1. Что такое база данных
- •1.2. Структура базы данных
- •2. Иерархическая и сетевая модели организации данных
- •3. Реляционная модель базы данных
- •3.1. Домены и отношения
- •3.2. Целостность данных
- •3.3. Реляционная алгебра
- •3.4. Реляционное исчисление
- •4. Проектирование логической структуры базы данных
- •4.1. Концепция функциональной зависимости
- •4.2. Нормализация базы данных
- •4.3. Объектное моделирование
- •5. Функции защиты базы данных
- •5.1. Транзакции и параллелизм
- •5.2. Безопасность и целостность баз данных
- •6. Дополнительные аспекты реляционной технологии
- •6.1. Представления
- •6.2. Повышение производительности с помощью оптимизации
- •6.3. Домены, отношения и типы данных
- •6.4. Неопределенные значения и трехзначная логика
- •6.5. Распределенные базы данных
- •7. Технология физического хранения и доступа к данным
- •7.1. Основные этапы доступа к базе данных
- •7.2. Управление страницами
- •7.3. Процедура индексирования и хеширования
- •7.4. Сжатие данных
- •Заключение
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
6. Дополнительные аспекты реляционной технологии
6.1. Представления
Механизм представлений (view) является мощным средством СУБД, позволяющим скрыть реальную структуру БД от некоторых пользователей за счет определения представления БД. Реально представление является некоторым хранимым в БД запросом, а для пользователя ничем не отличается от базового отношения БД. Любая реализация представления должна гарантировать, что состояние представляемого отношения точно соответствует состоянию данных, на которых определено это представление. Обычно вычисление представления производится каждый раз при его использовании. Рассмотрим эти аспекты подробнее.
Рассмотрим пример создания представления на основе отношения SP (Оценки), приведенного на рис. 1. 11
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ VIEW1 ДЛЯ (SP.OCENKA >= 3) [NAME, SN, OCENKA]
При создании представления информация о нем записывается в каталог БД под собственным именем (в нашем примере - VIEW1), а у пользователя создастся полное впечатление того, что в БД реально существует отношение с таким именем. При этом любые изменения в данных адекватно отобразятся в представлении - в этом есть его отличие от запроса к БД, на которое представление очень похоже. В то же время запросы представляют собой как бы "мгновенную фотографию" данных и при изменении последних запрос к БД необходимо повторять. В примере создается представление VIEW1, которое состоит из трех атрибутов - NAME, SN и OCENKA, причем будут выбираться только те кортежи, для которых оценка будет больше или равна 3 - грубо говоря, информация по успевающим студентам. С таким представлением пользователь может работать, как с реально существующим.
Наличие представлений в БД необходимо для обеспечения логической независимости данных. Если система обеспечивает физическую независимость данных, то изменения в физической структуре БД не влияют на работу пользовательских программ. Логическая независимость подразумевает тот факт, что при изменении логической структуры данных влияние на пользовательские программы также не оказывается. Здесь система должна уметь решать проблемы, связанные с ростом и реструктуризацией БД. Очевидно, что с увеличением количества данных, хранимых в БД, возникает необходимость в расширении за счет добавления нового атрибута или отношения - это мы и будем называть ростом БД.
Реструктуризация данных подразумевает, что информация остается та же, но изменяется ее расположение, например, за счет перегруппировки атрибутов отношений. Предположим, что отношение SP в силу каких-либо причин необходимо разделить на два - SPO и SPP, что приведено на рис.6.1.
Рис.6.1. Структура отношений SPO и SPP
Понятно, что соединение полученных отношений воссоздаст отношение SP. Следовательно, для дальнейшей работы можно создать представление SP, а значит у пользователя сложится впечатление, что никакой реструктуризации просто не производилось:
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ SP
SPP СОЕДИНИТЬ С SPO
Любая пользовательская программа после этого вместо отношения SP будет использовать созданное представление для манипуляции с данными.
Помимо решения проблемы реструктуризации БД, представление можно использовать для возможности просмотра одних и тех же данных разными пользователями, да еще в различных вариантах. Кроме того, теперь пользователю можно не работать с большим массивом данных, многие из которых в данный момент ему могут быть и не нужны. Путем использования представлений, он имеет возможность ограничить объем данных для удобства работы. Пример такого представления для успевающих студентов приведен выше.
Наконец, используя механизм представлений можно скрыть служебные данные, которые не интересны пользователю. Так, номер студенческого билета, как правило, интереса для пользователя не представляет, однако он служит для обеспечения связи отношений в БД. Можно создать представление, где вместо номеров студенческих билетов будут подставлены фамилии студентов из другого отношения. Очевидно, такое представление более удобно в использовании.
Часто представление используется для выборки данных. Об этой операция мы уже говорили выше, однако имеет смысл сделать ряд дополнительных замечаний. Механизм представлений реализуется непосредственно на отношениях и хранится в виде функции. Материализация представления-выборки осуществляется непосредственно при реализации соответствующего действия пользователя, до этого момента материализованных данных представления в БД не хранится.
Проблема обновления данных при работе с представлениями заключается в следующем: иногда трудно внести в исходные отношения БД обновленные данные так, чтобы в результате получить необходимое обновление данных в представлении.
Обновляемость (или необновляемость) представления не должна зависеть от его формы записи. Кроме того, должна соблюдаться симметричность обновления, то есть исключена возможность неоднозначности способа реализации данного обновления. Так, скажем, обновление представления, построенного на основе двух отношений, должно производиться так, чтобы манипуляция с данными осуществлялась в обоих отношениях. При этом должны учитываться правила - триггеры контроля целостности данных. Эти триггеры никогда не запускаются внутри операции обновления (UPDATE) по той причине, что во время обновления может существовать нарушение целостности данных. Однако полностью выполненная операция обновления, как уже было сказано, целостность данных нарушать не должна.
Операция обновления обычно реализуется при помощи более мелких однотипных конструкций типа УДАЛИТЬ (DELETE) и ВСТАВИТЬ (INSERT) на исходных отношениях, после чего осуществляется проверка целостности. Очевидно, что использование и корректная работа этих операторов должны быть возможны и в БД, которая не полностью нормализована, хотя в некоторых случаях это может приводить к неожиданным для пользователя результатам. Причем, помимо этого, корректная работа должна обеспечиваться как в случае работы с одним, так и при работе сразу с несколькими кортежами.
Рассмотрим выполнение операции ВСТАВИТЬ для представления вида А СОЕДИНИТЬ Б, то есть для представления, полученного с помощью операции объединения. Необходимо иметь в виду, что новый (вставляемый) кортеж должен удовлетворять логическому выражению, определяющему наличие или отсутствие кортежа хотя бы в одном из исходных отношений (предикату). Если новый кортеж удовлетворяет предикату А, то он вставляется в А, если он удовлетворяет предикату Б - то в Б. Возможна ситуация, когда кортеж вставляется и в А и в Б. Вставку можно пояснить следующим примером на основе представлений, приведенных на рис.6.1. Предположим, что представление определено следующим образом:
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ VIEW2 SPP (ДЛЯ SPP.PN = "Физика") СОЕДИНИТЬ С SPO (ДЛЯ SPO.OCENKA>=3)
В результате чего будет получено представление VIEW2, пример которого со значениями приведен на рис.6.2
Рис.6.2. Структура и пример данных для представления VIEW2
При попытке выполнить вставку кортежа (3415, Математика, Сурядный, 5) имеем, что этот кортеж удовлетворяет предикату SPO.OCENKA>=3. но не удовлетворяет предикату SPP.PN = "Физика". Значит, новый кортеж будет вставлен в отношение, удовлетворяющее первому предикату, то есть в отношение, содержащее информацию об оценках.
Аналогичным образом можем рассмотреть процесс удаления кортежа из представления, полученного объединением: если удаляемый кортеж принадлежит А, то он удаляется из А. Если после удаления кортежа из А этот кортеж имеет место в Б, то он также удаляется и из Б. Например, при попытке удалить из VIEW2 кортеж (3413, Физика, Гриценко, 3), удаляется кортеж из отношения, удовлетворяющего предикату SPP.PN = "Физика", а затем - из отношения, удовлетворяющего предикату SPO.OCENKA>=3.
Процесс обновления происходит так, чтобы текущий кортеж удовлетворял одному или обоим предикатам. Например, если обновляемый кортеж принадлежит А, то он удаляется из А. Если измененная версия кортежа удовлетворяет предикату А, то он вставляется в А. При этом, если измененная версия кортежа удовлетворяет предикату Б, то он вставляется и в Б. Например, при попытке обновления кортежа (3413, Физика, Старова, 4) на (3413, Физика, Старова, 5) обновление будет произведено в обоих отношениях.
Теперь более кратко рассмотрим выполнение аналогичных операций для представления вида А ПЕРЕСЕКАЕТ Б, то есть для представления, полученного как результат выполнения операции пересечения. При вставке новый кортеж должен удовлетворять предикату А и предикату Б. Если новый кортеж не входит в А, то этот кортеж вставляется в А. Если новый кортеж не входит в Б, то он будет вставлен и в Б.
При удалении кортежа из представления, он удаляется из А, если он не удален из Б, то он удаляется и из Б. При выполнении операции обновления, измененный кортеж должен удовлетворять предикату А и предикату Б. Кортеж удаляется из А и из Б. Затем, если обновленный кортеж отсутствует в А, он вставляется в А, если он отсутствует в Б, то вставляется и в Б.
Если же представление получено при помощи операции вычитания, то есть А ВЫЧИТАЕТСЯ ИЗ Б, то выполнение операций происходит следующим образом. При вставке новый кортеж должен удовлетворять предикату А и не должен удовлетворять предикату Б. Следовательно, новый кортеж вставляется в А. При удалении кортежа, последний удаляется из А. В случае обновления кортеж должен удовлетворять предикату А и не удовлетворять предикату Б. Кортеж удаляется из А, а затем его обновленный вариант вставляется в А.
Представление, полученное как выборка, может быть реализовано путем выполнения операции А ДЛЯ <условие>. Таким образом, данные, находящиеся в таком представлении, должны удовлетворять как предикату А, так и условию. При выполнении операции вставки новый кортеж вставляется в А. При выполнении удаления кортеж удаляется из А. При выполнении обновления кортеж удаляется из А. Обновленная версия, удовлетворяющая предикату А и условию, вставляется в А.
Предположим, что представление определено следующим образом:
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ VIEW3 SPP ДЛЯ SPP.PN = "Физика")
В результате выполнения получим представление V1EW3, пример которого со значениями приведен на рис.6.3
Рис.6.3. Структура и пример данных для представления VIEW3
Попытка осуществить вставку в такое представление кортежа (3416, Физика, Бычкова) закончится успешно, а кортежа (3417, Математика, Котенко) - неудачей, так как последний кортеж не удовлетворяет условию. Попытка обновить кортеж (3412, Физика, Поляков) на (3412, Химия, Поляков) закончится неудачей, так как обновленный кортеж не удовлетворяет условию.
Для представления, полученного при помощи проекции, следует иметь в виду, что кортеж будет включен только в том случае, если у соответствующего атрибута значение кортежа входит в заданное множество А. Это условие будет являться предикатом. При попытке вставить кортеж обновление будет осуществляться для отношения А в том случае, если кортеж удовлетворяет предикату. При попытке удаления из А удаляются все кортежи, в которых значение совпадает с удаляемым значением. Наконец, при выполнении обновления кортежа сначала из отношения А удаляются кортежи, подобные обновляемым, а затем в А будут вставлены обновленные варианты кортежа, удовлетворяющие предикату А.
В качестве примера рассмотрим представление, полученное как:
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ VIEW4 (SPP.SN, SPP.PN)
В результате выполнения получим данные, пример которых приведен на рис.6.4.
Рис.6.4. Структура и пример данных для представления V1EW4
Вставка в VIEW4 кортеж (3419, Математика) закончится успешно. В результате этого в отношение SPP будет вставлен кортеж (3419, Математика, X). где X - значение атрибута NAME, используемое по умолчанию. В то же время, попытка вставить кортеж (3412, Химия) закончится неудачей, так как нарушается условие уникальности ключа SN. Попытка обновить кортеж (3412, Физика) на (3412. Математика) приведет к тому, что успешно произойдет изменение кортежа (3412, Физика. Поляков) на (3412. Математика. Поляков) в отношении SPP (данные взяты согласно рис.6.3).
Рассмотрим теперь представление, полученное как расширение отношения А. Такое представление можно получить как:
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ VIEW ДОБАВИТЬ К А <выражение> КАК X
Предикат имеет такой вид, что в расширенном варианте каждый кортеж представления А является порождением кортежа отношения при помощи проекции, исключающей значение X от кортежа А из кортежа отношения, и, кроме того, удовлетворяет предикату А. Правило обновления такого представления при вставке заключается в том, что вставляемый кортеж должен удовлетворять предикату представления. При этом в отношение А вставляется кортеж, исключающий значение X от кортежа отношения А. При удалении из А удаляется кортеж, исключающий значение X от кортежа отношения А. Наконец, при обновлении сначала из А удаляется кортеж по правилу, приведенному выше. Затем в А будет вставлен кортеж, удовлетворяющий предикату представления, причем из модифицированного кортежа исключается значение X от кортежа отношения А.
Рассмотрим теперь представление, полученное как расширение отношения А. Такое представление можно получить как:
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ VIEW5 ДОБАВИТЬ К SPO (ЕСЛИ OCENKA>=3 TO "Зачет" ИНАЧЕ "Незачет") КАК ZACHET
В результате получим представление, приведенное на рис.6.5.
Рис.6.5. Структура и пример данных для представления VIEW5
Вставка в V1EW5 кортежа (3419, 4, Зачет) будет завершена успешно и приведет к добавлению в отношение SPO кортежа (3419, 4). Неудачу потерпит попытка вставки кортежа (3418, 2, Зачет), как неудовлетворяющего предикату. Обновление кортежа (3414, 3, Зачет) на (3414, 4, Зачет) завершится успешно и в отношении SPO обновится кортеж (3414, 3) на (3414, 4).
И, наконец, рассмотрим представление, полученное как результат операции соединения, то есть типа:
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ VIEW А ПРИСОЕДИНИТЬ Б
Предикатом такого представления будет как бы составной предикат А, для части представления, полученного от отношения А, и предикат Б, для части представления, полученного из Б. При попытке вставки новый кортеж должен удовлетворять предикату представления. Если часть представления, полученная от отношения А, в А отсутствует, то эта часть вставляется в А. Если часть представления, полученная от отношения Б, в Б отсутствует, то эта часть вставляется в Б. При удалении кортежа удаляются соответствующие части представления из отношений А и Б. И, наконец, при обновлении кортежа, его обновленная версия должна удовлетворять предикату представления. Из отношения А удаляется часть кортежа, полученная из А, из отношения Б - полученная из Б. После этого осуществляется вставка обновленного кортежа по правилу, изложенному выше.
Рассмотрим пример представления, полученного соединением отношений SPP и SPO:
СОЗДАТЬ ПРЕДСТАВЛЕНИЕ VXEW6 SPP ПРИСОЕДИНИТЬ SPO
Как результат получим представление, приведенное на рис.6.6.
Рис.6.6. Структура и пример данных для представления VIEW6
Приведем несколько примеров работы с этим представлением. Вставка в VIEW6 кортежа (3412, Математика, Поляков, 5) будет завершена успешно, при этом в отношение SPO будет добавлен кортеж (3412, 5). Удаление кортежа (3413, Химия, Старова, 4) будет завершено успешно: из отношения SPP будет удален кортеж (3413, Химия, Старова) и из отношения SPO - (3413, 4). Удаление кортежа (3412, Математика, Поляков, 4) завершится успешно, при этом из отношения SPO будет удален кортеж (3412, 4). Попытка обновить кортеж (3414, Физика, Гриценко, 3) на (3414, Физика, Гриценко, 5) завершится успешно, а в отношении SPO кортеж (3414, 3) будет заменен кортежем (3414, 5).
Таким образом, рассмотренный механизм использования представлений, полученных различными способами, и правил их обновления позволяет расширить возможности СУБД при работе в первую очередь во многопользовательских системах. Близки к представлениям так называемые снимки, которые фиксируют состояние БД в определенный момент времени – их часто используют в системах, где требуются данные на заданный момент времени.