Программирование >>  Хронологические базы данных 

1 ... 282 283 284 [ 285 ] 286 287 288 ... 348


I KEY { S#, DURING UNFOLDED} COALESCED DURING ;

Предложение I KEY здесь означает именно то, что комбинация атрибутов {S#,DURING} является потенциальным ключом для формы S DURING UNFOLD DURING. Таким образом, этого специального синтаксиса вполне достаточно для устранения указанного противоречия.

Необходимо заметить, что если комбинация атрибутов {St,DURING} является потенциальным ключом для формы S DURING UNFOLD DURING, то она, безусловно, является потенциальным ключом и для переменной-отношения S DURING. Это позволяет отказаться от исходного предложения KEY для переменной-отношения S DURING в пользу предложения I KEY. Также отметим, что ключ {S#,DURING} может считаться хронологическим потенциальным ключом в смысле, который вкладывался в это понятие в разделе 22.3. Кроме того, как мы уже убедились, этот хронологический потенциальный ключ - действительно настояший потенциальный ключ для содержащей его переменной-отношения, в отличие от хронологических потенциальных ключей , которые рассматривались в разделе 22.3.

Естественно предположить, что если поддерживается синтаксис предложения I KEY для потенциальных ключей, то мы вправе ожидать, что имеется соответствующая поддержка и для внешних ключей. Например, определение переменной-отношения SP DURING может включать приведенное ниже уточнение.

FOREIGN I KEY { S#, DURING UNFOLDED } REFERENCES S DURING ...

Его смысл заключается в следующем: если в переменной-отношении SP DURING имеются сведения о том, что поставщик с номером Sx может поставлять некоторые детали в течение интервала i, то в переменной-отношении S DURING также должно быть отображено, что с поставщиком с номером Sx заключен договор, действительный в течение всего этого интервала i. Если данное ограничение удовлетворяется, комбинация атрибутов {St,DURING} в переменной-отношении SP DURING может считаться хронологическим внешним ключом в смысле, оговоренном в разделе 22.3. (Однако это еще не настоящий внешний ключ в классическом смысле.)

Следует обратить внимание на одну особенность, касающуюся переменной-отношения S DURING. Предположим, что она на самом деле постоянно поддерживается в свернутом состоянии по атрибуту DURING. Предположим также, что время от времени мы запускаем процедуру, пересчитывающую статус поставщиков, с которыми в текущее время заключен договор. Конечно, процедура должна также записывать в переменную-отношение S DURING предыдущие значения статуса. Иногда в результате пересчета значения статуса будут оставаться без изменений. В таких случаях процедура будет машинально пытаться вставить, запись предыдущего статуса в переменную-отношение S DURING, в результате чего будет нарушено требование свернутого состояния, выражае-

Некоторые авторы определяют семантику предложения I KEY таким образом, что оно используется и для решения проблемы шбыточности. Мы же считаем такой подход несколько нелогичным и здесь не используем (во всяком случае в этом нет необходимости, поскольку ясно, что для того, чтобы справиться с проблемой габыточности, вполне достаточно и предложения COALESCED).



мого предложением COALESCED. Чтобы таких ситуаций не возникало, в процедуре должны быть предусмотрены проверка изменения статуса и выполнение соответствующей операции обновления вместо операции вставки, которая используется в том случае, если статус изменился (см. упр. 22.3). В качестве альтернативного подхода можно было бы не поддерживать переменную-отнощение S DURING в свернутом состоянии по атрибуту DURING. Такое рещение, возможно, не подходит для данного конкретного случая, но может быть подходящим для других случаев.

22.10. Операторы обновления, включающие интервалы

в этом разделе будет рассмотрено несколько проблем, которые возникают при использовании обычных операторов изменения INSERT, UPDATE и DELETE для хронологической переменной-отнощения. И вновь в качестве примера будет применяться переменная-отнощение S DURING. Предположим, что определение переменной-отнощения включает уточнения I KEY и COALESCED, предложенные в предыдущем разделе, а также что текущее значение переменной-отнощения S DURING именно такое, как на рис. 22.4. Теперь рассмотрим следующие сценарии.

Вставка. Предположим, что с поставщиком с номером S2 был заключен дополнительный договор на период с дня 5 по день 6 (в течение этого времени поставщик, как и прежде, имел имя Jones, статус, равный 10, и находился в городе Paris). Однако мы не можем просто вставить кортеж, не нарушив ограничение COALESCED, причем дважды. На самом деле для поставщика с номером S2 необходимо удалить один из существующих кортежей и обновить другой, чтобы установить значение атрибута DURING равным [d02,dlO].

Обновление. Предположим, что статус поставщика с номером S2 был временно увеличен до 20 только на день 9. Довольно сложно выполнить такое изменение, хотя его формулировка подобна той, которая дается при простом обновлении. По существу, необходимо разбить кортеж с интервалом [d07,dl0] для поставщика с номером S2 на три кортежа со значениями атрибута DURING, равными [d07,d08], [d09,d09] и [dlO,dlO], остальные значения оставить прежними и в кортеже со значением атрибута DURING, равным [d09,d09], заменить значение атрибута STATUS на 20.

Удаление. Предположим, что договор с поставщиком с номером S3 был отменен в день 6, а затем возобновлен с дня 9. В этом случае изменение также далеко не тривиальное. Требуется разбить единственный кортеж для поставщика с номером S3 на два кортежа со значениями атрибута DURING, равными [d03,d05] и [d09,dlO].

Обратите внимание, что решения трех указанных заданий, изложенные лишь в общих чертах, являются специфическюли для текущего значения переменной-отношения S DURING (и необходимы только при конкретных изменениях). Рассмотрим, например, проблему, связанную со вставкой. В общем случае кортеж может просто вставляться в переменную-отношение как он есть , или же может потребоваться, чтобы он был под-



вергнут свертыванию с предыдущим кортежем, со следующим кортежем или с ними обоими сразу, как это было в нашем примере. Аналогично и в случае операций обновления или удаления может потребоваться разбиение существующих кортежей.

Очевидно, что пользователям было бы очень сложно обходиться лишь обычными операторами INSERT, UPDATE и DELETE. Необходимы определенные расширения этих операторов. Рассмотрим некоторые возможности таких расширений.

Операция INSERT. Практически проблема, связанная с операцией вставки, может быть решена за счет расширения семантики предложения COALESCED в определении переменной-отношения. А именно, можно разрешить выполнение операции INSERT обычным способом и потребовать, чтобы системой осуществлялись необходимые свертывания с кортежами, добавляемыми следующими операциями INSERT. Другими словами, уточнение COALESCED теперь будет не только определять ограничение, но и указывать явные компенсирующие действия (аналогично ссылочным действиям при определении внешнего ключа).

Однако, к нашему сожалению, только расширения семантики предложения COALESCED указанным способом будет недостаточно для решения проблем операций UPDATE и DELETE (почему?).

Операция UPDATE. Проблему, связанную с операцией обновления, можно решить за счет расширения оператора UPDATE так, как показано в следующем примере.

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)

DURING INTERVAL ( [d06,d08] ) ;

Этот синтаксис подобен предлагаемому в [22.3], но не идентичен ему. 886 Часть V. Дополнительные аспекты



1 ... 282 283 284 [ 285 ] 286 287 288 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика