Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700276.doc
Скачиваний:
11
Добавлен:
01.05.2022
Размер:
1.94 Mб
Скачать

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).

Таким образом, рассмотренный механизм использования представлений, полученных различными способами, и правил их обновления позволяет расширить возможности СУБД при работе в первую очередь во многопользовательских системах. Близки к представлениям так называемые снимки, которые фиксируют состояние БД в определенный момент времени – их часто используют в системах, где требуются данные на задан­ный момент времени.