|
Программирование >> Хронологические базы данных
проблемы выглядит так. Пусть D - это база данных, а V - представление, определенное на D (т.е. представление, определение которого является функцией X на множестве D). Тогда, как известно из раздела 9.3, получаем следующее. V = X ( D ) Теперь пусть U - это операция обновления в представлении V. Так как U можно считать операцией, результат выполнения которой состоит в изменении ее аргументов, правомочно представить ее в следующем виде. и ( V ) = и ( X ( D ) ) Тогда проблема выполнения обновления в представлении сводится к поиску такой операции обновления U на множестве D, для которой истинно следующее выражение. и ( X ( D ) ) = X ( U ( D ) ) Операция подобного вида требуется по той причине, что реально существует только множество D (представления по определению виртуальны) и выполнять операции обновления непосредственно в представлениях как таковых невозможно. Прежде чем продолжить изложение, хотелось бы подчеркнуть, что на протяжении нескольких последних лет проблема обновления представлений была предметом ряда важных исследований, в результате проведения которых было разработано множество различных подходов к рещению этой проблемы (в том числе и автором этой книги). Подробные сведения об этих исследованиях можно найти, например, в [9.7], [9.10]-[9.13], [9.15], [17.13] В частности, предложения Кодда (Codd) для системы RM/V2 описываются в [5.2]. В этой главе изложен относительно новый подход [9.9], менее произвольный по сравнению с существовавшими ранее подходами, но обладающий преимуществом совместимости с лучшими аспектами этих подходов. Кроме того, новый подход позволяет считать обновляемым гораздо более широкий класс представлений по сравнению с прежними подходами. При этом подходе фактически все представления считаются потенциально обновляемыми - за исключением лишь тех, которые нарушают установленные ограничения целостности. Еще раз о золотом правиле Напомним золотое правило, определенное в предыдущей главе. Любым операциям изменения запрещается когда-либо переводить переменную-отношение в состояние, которое противоречит ее собственному предикату. При определении этого правила подчеркивалось, что оно применимо ко всем переменным-отношениям, как к базовым, так и к производным. Иначе говоря, производные переменные-отношения также имеют предикаты, как и должно быть согласно принципу взаимозаменяемости. Эти предикаты должны быть известны системе, что позволит ей правильно выполнять обновления представлений. Что же собой представляет предикат представления? Очевидно, что, прежде всего, нам необходим набор правил вывода предиката, такой, что если известен предикат (предикаты) на входе (входах) любой реляционной операции, то с его помощью можно определить предикат на выходе этой операции. Если такой набор правил будет получен, то мы сможем вывести предикат представления из предиката базовой переменной-отношения (или переменных-отношений), в терминах которой прямо или косвенно это представление было определено. (Безусловно, предикаты для всех базо- вых переменных-отношений можно считать известными: они представляют собой логическое произведение всех ограничений переменной-отношения, т.е. ограничений потенциальных ключей, определенных для данной базовой переменной-отношения.) На самом деле определить требуемый набор правил очень легко - они следуют непосредственно из определений реляционных операторов. Например, если А и В - две произвольные переменные-отношения некоторого типа и их предикаты есть РА и РВ соответственно, а представление С определено как А INTERSECT В, то очевидно, что предикат PC этого представления будет определяться выражением (РА) AND (РВ). Другими словами, некоторый кортеж будет появляться в представлении С тогда и только тогда, когда при его подстановке оба предиката, РА и РВ, принимают значение истина. О других реляционных операторах речь пойдет ниже в этом же разделе. Замечание. Таким образом, производные переменные-отношения автоматически наследуют определенные ограничения от тех переменных-отношений, на основе которых они определены. Однако вполне возможно, что некоторая производная переменная-отношение станет объектом определенных дополнительных ограничений, накладываемых помимо и поверх наследуемых ограничений. Поэтому для производных переменных-отношений желательно иметь возможность устанавливать требуемые ограничения явно (например, это может быть возможность определения для представления потенциального ключа). Язык Tutorial D действительно поддерживает такую возможность. Однако для простоты изложения в дальнейшем мы эту возможность чаше всего будем игнорировать. Механизм обновления представления Сушествует несколько важных принципов, которые должны соблюдаться любым систематическим подходом к проблеме обновления представлений. {Золотое правило, безусловно, важнейшее из них, но не единственное.) Перечислим эти принципы. 1. Обновляемость представления - понятие семантическое, а не синтаксическое. Другими словами, оно не зависит от выбранной формы записи определения представления. Например, два приведенных ниже представления семантически идентичны. VAR V VIEW S WHERE STATUS > 25 OR CITY = Paris ; VAR V VIEW ( S WHERE STATUS > 25 ) UNION ( S WHERE CITY = Paris ) ; Очевидно, что оба эти представления должны быть или обновляемыми, или не обновляемыми (на самом деле они, безусловно, должны быть обновляемыми). Однако этому утверждению противоречат и стандарт SQL, и большинство сушествую-ших на данный момент SQL-продуктов, которые совершенно безосновательно полагают, что первое из приведенных представлений обновляемо, а второе- нет (подробности приводятся в разделе 9.6). 2. Как следует из предыдушего рассуждения, механизм обновления должен корректно работать и в тех частных случаях, когда представление на самом деле является базовой переменной-отношением, поскольку любая базовая переменная-отношение В семантически неотличима от представления V, определенного как операция В UNION В или В INTERSECT В, или В WHERE true, или любое другое выражение, равносильное переменной-отношению В. Таким образом, правила обновления, ус- тановленные, например, для представления, которое определено с помощью операции объединения V = В UNION В, должны давать тот же результат, что и в случае, когда рассматриваемая операция обновления применяется непосредственно к базовой переменной-отнощению В. Иначе говоря, хотя тема данного раздела и звучит как обновление представлений , на самом деле в общем случае здесь рассматривается обновление переменных-отношений. Мы рассмотрим теорию обновления, применимую ко всем переменным-отнощениям, а не только к представлениям. 3. Применяемые правила должны сохранять симметричность во всех случаях, когда она применима. Например, правило удаления DELETE для представления, определенного как пересечение V = А INTERSECT В, не должно допускать произвольного удаления кортежа из переменной-отнощения А или В даже тогда, когда такое одностороннее удаление кортежа наверняка вызовет удаление этого кортежа из рассматриваемого представления. В подобном случае кортеж должен удаляться из обеих переменных-отнощений А и В. (Другими словами, не должно быть никакой неоднозначности. Всегда должен существовать единственный способ реализации данного обновления, который срабатывает во всех случаях. В частности, не должно быть никаких логических различий между представлениями, определенными как А INTERSECT В и В INTERSECT А.) 4. В правилах обновления должны учитываться любые применимые триггерные процедуры, включая, в частности, определенные ссылочные действия, подобные каскадному удалению (устанавливаемому с помощью опции CASCADE). 5. Для упрощения синтаксиса желательно рассматривать операцию UPDATE как сокращенную запись последовательности операций удаления и вставки (DELETE-INSERT); именно так мы и будем ее рассматривать. Это сокращение вполне приемлемо при соблюдении следующих условий. Не осуществляется никаких проверок предикатов переменных-отнощений в ходе выполнения любого требуемого обновления. Имеется в виду, что расщиренная запись операции UPDATE выглядит как DELETE-INSERT-яроверха, а не как DELETE-яроверха-INSERT-npoBepKa. Суть заключается в том, что операция DELETE временно нарущает истинность предиката переменной-отнощения, в то время как полная операция UPDATE ее не нарушает. Например, предположим, что переменная-отношение R содержит ровно 10 кортежей, и рассмотрим действие операции UPDATE ее некоторого кортежа t при условии, что предикат этой переменной-отношения R устанавливает, что в ней не может содержаться менее 10 кортежей. Триггерные процедуры также никогда не должны вызываться в середине выполнения любой операции обновления. (Фактически триггерные процедуры обычно выполняются сразу же по окончании операции, но до проверки предиката отношения.) Сокращенная запись требует некоторых незначительных уточнений для представлений, определяемых на основе операции проекции (подробности приводятся ниже в этом разделе). 6. Все обновления данных в представлениях должны быть реализованы как обновления того же типа в исходных переменных-отношениях. Иначе говоря, операции вставки (INSERT) отображаются в операции вставки, операции удаления (DELETE) отобража-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |