
- •20.7. Средства sql
- •20.8. Резюме
- •21.1. Введение
- •21.2. Некоторые аспекты технологам поддержки принятия решений
- •21.3. Проектирование базы данных поддержки принятия решений
- •21.5. Хранилища данных и магазины данных
- •21.6. Оперативная аналитическая обработка
- •21.7. Разработка данных
- •21.8. Резюме
- •22.1. Введение
- •22.2. Хронологические данные
- •22.3. Основная проблема хронологических баз данных
- •22.4. Интервалы
- •22.5. Интервальные типы
- •22.6. Скалярные операторы для интервалов
- •22.7. Операторы обобщения для интервалов
- •22.8. Реляционные операторы для обработки интервалов
- •22.9. Ограничения, включающие интервалы
- •22.10. Операторы обновления, включающие интервалы
- •22.11. Проектирование базы данных
- •22.12. Резюме
- •23.1. Введение
- •23.2. Обзор основных концепций
- •23.3. Исчисление высказываний
- •23.4. Исчисление предикатов
- •23.5. Базы данных с точки зрения доказательно-теоретического подхода
- •23.6. Дедуктивные субд
- •23.7. Обработка рекурсивных запросов
- •23.8. Резюме
- •Часть VI
- •24.1. Введение
- •24.2. Объекты, классы, методы и сообщения
- •24.3. Еще раз об объектах и объектных классах
- •Cdo для класса set (ref(emp))
- •24.4. Простой пример
- •1 | Course с001 , с001 0ffs , с001 ny offs |
- •24.5. Дополнительные аспекты
- •24.6. Резюме
- •25.1. Введение
- •X2 rational, y2 rational ) ... ;
- •25.2. Первая грубейшая ошибка
- •25.3. Вторая грубейшая ошибка
- •25.4. Вопросы реализации
- •25.5. Преимущества реального сближения двух технологий
- •25.6. Резюме
22.10. Операторы обновления, включающие интервалы
В этом разделе будет рассмотрено несколько проблем, которые возникают при использовании обычных операторов изменения INSERT, UPDATE и DELETE для хронологической переменной-отношения. И вновь в качестве примера будет применяться переменная-отношение S_DURING. Предположим, что определение переменной-отношения включает уточнения IJKEY и COALESCED, предложенные в предыдущем разделе, а также что текущее значение переменной-отношения S_DURING именно такое, как на рис. 22.4. Теперь рассмотрим следующие сценарии.
Вставка. Предположим, что с поставщиком с номером 'S2' был заключен дополнительный договор на период с дня 5 по день 6 (в течение этого времени поставщик, как и прежде, имел имя 'Jones', статус, равный 10, и находился в городе 'Paris'). Однако мы не можем просто вставить кортеж, не нарушив ограничение COALESCED, причем дважды. На самом деле для поставщика с номером 'S2' необходимо удалить один из существующих кортежей и обновить другой, чтобы установить значение атрибута DURING равным [d02,dl0\.
Обновление. Предположим, что статус поставщика с номером 'S2' был временно увеличен до 20 только на день 9. Довольно сложно выполнить такое изменение, хотя его формулировка подобна той, которая дается при простом обновлении. По существу, необходимо разбить кортеж с интервалом [d07,dl0] для поставщика с номером 'S2' на три кортежа со значениями атрибута DURING, равными [d07,d08], [d09,d09] и [dl0,dl0], остальные значения оставить прежними и в кортеже со значением атрибута DURING, равным [d09,d09], заменить значение атрибута STATUS на 20.
Удаление. Предположим, что договор с поставщиком с номером 'S3' был отменен в день 6, а затем возобновлен с дня 9. В этом случае изменение также далеко не тривиальное. Требуется разбить единственный кортеж для поставщика с номером 'S3' на два кортежа со значениями атрибута DURING, равными [d03,d05] и [d09,dl0].
Обратите внимание, что решения трех указанных заданий, изложенные лишь в общих чертах, являются специфическими для текущего значения переменной-отношения S DURING (и необходимы только при конкретных изменениях). Рассмотрим, например, проблему, связанную со вставкой. В общем случае кортеж может просто вставляться в переменную-отношение "как он есть", или же может потребоваться, чтобы он был подвергнут свертыванию с "предыдущим" кортежем, со "следующим" кортежем или с ними обоими сразу, как это было в нашем примере. Аналогично и в случае операций обновления или удаления может потребоваться "разбиение" существующих кортежей.
Очевидно, что пользователям было бы очень сложно обходиться лишь обычными операторами INSERT, UPDATE и DELETE. Необходимы определенные расширения этих операторов. Рассмотрим некоторые возможности таких расширений.
■ Операция INSERT. Практически проблема, связанная с операцией вставки, может быть решена за счет расширения семантики предложения COALESCED в определении переменной-отношения. А именно, можно разрешить выполнение операции INSERT обычным способом и потребовать, чтобы системой осуществлялись необходимые свертывания с кортежами, добавляемыми следующими операциями INSERT. Другими словами, уточнение COALESCED теперь будет не только определять ограничение, но и указывать явные компенсирующие действия (аналогично ссылочным действиям при определении внешнего ключа).
Однако, к нашему сожалению, только расширения семантики предложения COALESCED указанным способом будет недостаточно для решения проблем операций UPDATE и DELETE (почему?).
■ Операция UPDATE. Проблему, связанную с операцией обновления, можно решить за счет расширения оператора UPDATE так, как показано в следующем примере13.
UPDATE S_DURING
WHERE Si = Si ('S2')
DURING INTERVAL ( [d09,d09] )
STATUS := 20 ;
Здесь в третьей строке (синтаксис которой, по сути, имеет вид <имя атрибута> интервальное выражение>) указан атрибут интервала DURING, к которому применяется уточнение COALESCED, и соответствующее значение интервала [d09,d09]. В целом, подобная операция может интерпретировать так:
а) прежде всего определяются кортежи поставщика S2;
б) затем из найденных кортежей выбираются те, в которых значение атрибута DURING включает интервал [d09,d09] (естественно, должен существовать по крайней мере один такой кортеж);
в) если не обнаружено ни одного требуемого кортежа, то обновление не выполня- ется; в противном случае кортежи разбиваются, как это требуется, и выполня- ются необходимые обновления.
■ Операция DELETE. Аналогичным образом проблему удаления можно решить за счет расширения оператора DELETE, как, например, показано ниже.
DELETE S_DURING
WHERE Si = Si ('S3')
Этот синтаксис подобен предлагаемому в [22.3], но не идентичен ему.
DURING INTERVAL ( [d06,d08] ) }