|
Программирование >> Хронологические базы данных
Ниже представлено ограничение, которое запрещает перекрытие и смежность вре-менньгх диапазонов. CONSTRAINT AUG S FR0M T0 PK IS EMPTy ( ( ( S FROM TO RENAME FROM AS Fl, TO AS Tl ) JOIN ( S FROM TO RENAME FROM AS F2, TO AS T2 ) ) WHERE ( Tl > F2 AND T2 > Fl ) ) OR ( F2 = Tl+1 OR Fl = T2+1 ) ) ; Это выражение несколько запутанное, не говоря уже о том, что здесь допущены определенные вольности в написании (например, выражение Т1+1 используется для обозначения дня, непосредственно следующего за днем Т1). К этому вопросу мы еще возвратимся в разделе 22.5. Замечание. Фактически наличие данного ограничения позволяет обращаться к сочетанию атрибутов {S#,FROM,ТО} как к хронологическому потенциальному ключу (точнее, к хронологическому первичному ключу). Однако это не очень хороший термин, поскольку хронологический потенциальный ключ не является на самом деле потенциальным ключом переменной-отношения, которая его содержит. (В разделе 22.9 мы обсудим хронологические потенциальные ключи , которые являются настоящими потенциальными ключами в классическом смысле этого термина.) Далее необходимо отметить, что сочетание атрибутов {Sl,FROM} в переменной-отношении SP FROM TO не является внешним ключом переменной-отношения SP FROM TO для переменной-отношения S FROM TO, несмотря на то что это сочетание включает те же атрибуты, что и первичный ключ переменной-отношения S FROM TO. Однако нам необходимо быть уверенными, что если сведения о некотором поставщике имеются в переменной-отношении SP FROM TO, то они присутствуют и в переменной-отношении S FROM TO. CONSTRAINT AUG SP T0 S FK AGAIN1 SP FR0M T0 { S# } < s FR0M T0 { S# } ; (Здесь знак < означает является подмножеством .) Но ограничения AUG SP T0 S FK AGAIN1 самого по себе недостаточно. Необходимо иметь уверенность в том, что даже после выполнения всех возможных объединений кортежей, если в переменной-отношении SP FR0M ТО некоторый поставщик может поставлять некоторую деталь в течение некоторого времени, в переменной-отношении S FROM TO обязательно есть кортеж для этого поставшика, указывающий, что на определенный период договор с ним действительно был заключен. Это можно попытаться выразить так. CONSTRAINT AUG SP T0 SJK AGAIN2 /* внимание - некорректно */ IS EMPTY ( ( ( S FR0M T0 RENAME FROM AS SF, TO AS ST ) JOIN ( SP FROM TO RENAME FROM AS SPF, TO AS SPT ) ) WHERE SPF < SF OR SPT > ST ) ; Однако, как сказано в комментарии, данное определение фактически неверно. Чтобы разобраться, почему именно, рассмотрим пример. Пусть переменная-отношение S FROM TO будет такой, как показано на рис. 22.3, и пусть переменная-отношение SP FROM TO содержит кортеж для поставщика с номером S2 с атрибутами, скажем, FROM=dOJ и 1O=d04. Очевидно, что такое сочетание является допустимым, но на самом деле ограничение AUG SP T0 S FK AGAIN2 его запрещает. Здесь мы не будем пытаться решить эту проблему, а отложим ее обсуждение до раздела 22.9. Однако отметим, что если, как указывалось ранее, сочетание атрибутов {Sl,FROM,ТО} в переменной-отнощении S FROM TO считается хронологическим потенциальным ключом , то сочетание атрибутов {Sl,FROM,ТО} в переменной-отнощении SP FROM TO можно считать хронологическим внешним ключом (хотя он на самом деле не является внешним ключом как таковым). Обсуждение этого вопроса также будет продолжено в разделе 22.9. Запросы (первая хронологическая база данных). Рассмотрим полные хронологические версии запросов 1.1 w 1.2. Запрос 3.1. Получить тройки значений атрибутов Sl, FROM и ТО для поставщиков, которые в некоторое время могут поставить некоторую деталь, где FROM и ТО вместе означают максимальный непрерывный период, в течение которого поставщик с номером Sl действительно мог поставить некоторую деталь. Замечание. Здесь слово максимальный используется как удобное сокращение, которое в данном случае означает, что поставщик с номером Sl не мог поставить ни одной детали до дня FROM и после дня ТО. Запрос 3.2. Получить тройки значений атрибутов Si, FROM и ТО для поставщиков, которые в определенное время не могут поставить никаких детапей, где FROM и ТО вместе означают максимальный непрерывный период, в течение которого поставщик с номером Sl действительно не мог поставлять никаких деталей. Вероятно, вам не потребуется много времени, чтобы, как и нам, предпочесть даже не приступать к написанию этих запросов! Если вы все-таки предпримете такую попытку, то в конце концов тот факт, что эти запросы можно выразить, хотя и чрезвычайно трудно, станет вам известен. Также несомненно, что вы придете к выводу о крайней желательности соответствующих сокращений. Можно сделать заключение, что суть проблемы хронологических данных состоит в том, что их наличие требует создания ограничений и запросов, которые чрезмерно сложны, чтобы их сформулировать, если, конечно, системой не предоставляются удачно разработанные сокращения, которых, как нам известно, коммерческие СУБД в настоящее время не имеют. 22.4. Интервалы А теперь займемся разработкой соответствующего набора сокращений. Первый и наиболее важный шаг- понять необходимость применения интервалов как таковых вместо того, чтобы интерпретировать их как пары отдельных значений, как мы это делали до сих пор. Что же конкретно представляет собой интервал времени? Согласно рис. 22.3 поставщик с номером S1 мог поставлять деталь с номером Pl в течение интервала с дня 4 по день 10. Но что означает выражение интервал с дня 4 по день 10 ? Ясно, что дни 5, 6, 7, 8 и 9 в него включаются, но что можно сказать о начальной и конечной точках, о днях 4 и 10? Оказывается, задавая некоторый конкретный интервал, мы иногда считаем, что указанные начальная и конечная точки включаются в интервал, а иногда- нет. Если интервал с дня 4 по день 10 включает день 4, то говорят, что он закрыт относительно его начальной точки, в противном случае говорят, что интервал открыт относительно его начальной точки. Точно так, если интервал включает день 10, то говорят, что он закрыт относительно его конечной точки, в противном случае говорят, что интервал открыт относительно его конечной точки. Поэтому принято обозначать интервал начальной и конечной точками (именно в этом порядке), предваряя его открывающей квадратной скобкой или открывающей круглой скобкой и заключая его закрывающей квадратной скобкой или закрывающей круглой скобкой. Квадратные скобки используются, когда интервал закрыт, а круглые скобки - когда он открыт. Таким образом, интервал, например, с 4 по 10 день, можно обозначить четырьмя различными способами. [d04,dlO] [d04,dll) {d03,dlO] (d03,dll) Замечание. Вам может показаться странным, например, что используются открывающая квадратная скобка и закрывающая круглая скобка. Однако есть веские причины использования всех четырех вариантов обозначения интервалов. В действительности на практике наиболее часто используется так называемый закрыто-открытый вариант (открывающие квадратные скобки и закрывающие круглые скобки). Однако закрыто-закрытый вариант (открывающие квадратные скобки и закрывающие квадратные скобки), несомненно, наиболее интуитивно понятный, и поэтому мы будем отдавать предпочтение именно ему. Поскольку интервалы, такие как [d04,dl0], сами по себе являются значениями, имеет смысл объединить атрибуты FROM и ТО переменной-отношения, скажем, SP FROM TO (см. рис. 22.3) в отдельный атрибут DURING, значения которого берутся из интервального типа (подробности приводятся в следующем разделе). Непосредственное преимущество этой идеи заключается в том, что отпадает необходимость в произвольном выборе одного из двух потенциальных ключей ([Sl,FROM] или [Sl,TO]) в качестве первичного. Еще одно преимущество состоит в том, что теперь не нужно решать, как интерпретировать интервалы FROM-TO, показанные на рис. 22.3, - как закрытые или как открытые по отношению к каждому значению атрибутов FROM и ТО. Фактически интервалы [d04,dlO], [d04,dll), (d03,dl0] и (d03,dll) теперь становятся четырьмя отдельными возможными представлениями одного и то же интервала и нам нет необходимости знать, каково реальное представление. К тому же к преимуществам можно отнести и то, что ограничения переменной-отношения для предотвращения появления ошибочных пар атрибутов FROM-TO, в которых точка ТО предшествует точке FROM (как указывалось в разделе 22.3) больше не нужны, поскольку ограничение FROM < ТО подразумевается в Чтобы понять, почему закрыто-открытый вариант интервала может быть более предпочтительным, рассмотрим операцию разбиения интервала /d04,dl07 перед, скажем, днем d07. В результате получим смежные интервалы /d04,d07j и /dOT/dlO ].
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |