Скачиваний:
99
Добавлен:
02.05.2014
Размер:
2.54 Mб
Скачать

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] ) }

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]