- •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.3. Основная проблема хронологических баз данных
В последующих примерах этой главы в качестве основы по-прежнему будет использоваться база данных поставщиков и деталей, но, чтобы она лучше подходила для наших целей, необходимо внести в нее несколько изменений. Прежде всего, для упрощения примеров удалим переменную-отношение Р. Во-вторых, откорректируем состав атрибутов переменной-отношения поставок SP, отбросив атрибут QTY и оставив лишь атрибуты Si и Р#. Измененную таким образом переменную-отношение SP можно интерпретировать так: "Поставщик с номе-, ром S# в настоящее время может поставить деталь с номером Pi". Иначе говоря, вместо того чтобы показывать действительные поставки деталей поставщиками, переменная-отношение SP теперь показывает лишь потенциально возможные поставки, т.е. возможности поставщиков поставлять детали. На рис, 22.1 представлена исправленная версия рис. 3.8 из главы 3. Здесь отображено множество данных, содержащихся в измененной базе данных. Обратите внимание, что эта база данных по-прежнему имеет тип моментального снимка, поскольку еще не включает никаких хронологических сведений.
Теперь приступим к обсуждению некоторых простых ограничений и запросов для этой базы данных. Позднее рассмотрим, что случится с ограничениями и запросами, если база данных будет расширена различными хронологическими функциями.
Ограничения (для текущей версии базы данных типа моментального снимка). Единственные ограничения, которые будут рассмотрены, — это ограничения для ключа. Напомним, что {S#} и {S#,P#} — первичные ключи переменных-отношений S и SP соответственно, a {St} — внешний ключ переменной-отношения SP, который ссылается на первичный ключ переменной-отношения S (безусловно, внешний ключ {Р#} не учитывается).
Запросы (для текущей версии базы данных типа моментального снимка). Запросы, которые мы будем обсуждать, очень просты, и их всего два.
■ Запрос 1.1. Определить номера поставщиков, которые в настоящее время могут поставить некоторую деталь.
Везде в этой главе неуточненный термин "предикат " используется для обозначения внешнего предиката, который понятен пользователям (см. главу 8), а не внутреннего, понятного системе (последний является, конечно, предикатом переменной-отношения/ Кроме того, мы не затрагиваем здесь аспекты внешнего предиката, которые или "очевидны", или не имеют отношения к теме нашего обсуждения.
SP { St }
■ Запрос 1.2. Определить номера поставщиков, которые в настоящее время не могут поставлять никаких деталей.
S { St } MINUS SP { St }
s# |
SNAME |
STATUS |
CITY |
SI |
Smith |
20 |
London |
S2 |
Jones |
10 |
Paris |
S3 |
Black |
30 |
Paris |
S4 |
Clark |
20 |
London |
S5 |
Adams |
30 |
Athens |
S# |
P# |
SI |
PI |
SI |
P2 |
SI |
P3 |
SI |
P4 |
SI |
P5 |
SI |
P6 |
S2 |
PI |
S2 |
P2 |
S3 |
P2 |
S4 |
P2 |
S4 |
P4 |
S4 |
P5 |
Рис. 22.1. База данных поставщиков и деталей (значения для примера): текущая версия типа моментального снимка
Отметим, что запрос 1.1 включает простую операцию проекции, а запрос 1.2 — операцию разности между двумя подобными проекциями. Позднее, при рассмотрении хронологических вариантов этих двух запросов, мы убедимся, что они включают хронологические аналоги этих двух операторов (см. раздел 22.8).
Замечание. Возможно, читателя не удивит тот факт, что могут быть определены хронологические аналоги и других реляционных операторов (см. упр. 22.8).
"Полуограниченные во времени" поставщики и поставки
Чтобы изменения вносились постепенно, на следующем этапе мы введем в переменные-отношения S и SP только "полухронологичность" (если можно так выразиться). Для этого к каждой из них добавим атрибут временной отметки SINCE (Начиная с), а затем соответственно переименуем эти переменные-отношения так, как показано на рис. 22.2.
Для упрощения представления информации на рис. 22.2 показаны не реальные временные отметки, а условные обозначения вида dOl, 602 и т.д., где d может для удобства произноситься как "день". Указанного соглашения мы будем придерживаться до конца этой главы. (Таким образом, во всех примерах будут использоваться временные отметки, которые являются днями.) Далее подразумевается, что день 1 непосредственно предшествует дню 2, день 2 непосредственно предшествует дню 3 и т.д. Кроме того, незначащие ведущие нули в таких выражениях, как ' день 1', отбрасываются.
Предикат для переменной-отношения S_SINCE формулируется так: "Поставщик с номером St и с именем SNAME имеет статус STATUS, находится в городе CITY, и договор с ним заключен с дня SINCE". Предикат для переменной-отношения SP SINCE формулируется так: "Поставщик с номером St может поставлять деталь с номером Pt начиная с дня SINCE".
Рис. 22.2. База данных поставщиков и деталей (значения для примера): "полухронологическая " версия
Ограничения ("полухронологическая" база данных). Первичные и внешние ключи для новой полухронологической базы данных те же, что и раньше. Однако требуется ввести дополнительное ограничение, которое могло бы рассматриваться как расширенное ограничение внешнего ключа в переменной-отношении SP SINCE для переменной-отношения S_SINCE. Оно необходимо для отражения того факта, что ни один поставщик не может поставить ни одной детали прежде, чем с ним будет заключен договор. Иными словами, если кортеж sp в переменной-отношении SP SINCE ссылается на кортеж s в переменной-отношении S_SINCE, то значение SINCE в кортеже sp не должно быть меньше, чем значение SINCE в кортеже S.
CONSTRAINT AUG_SP_T0_S_FK
IS_EMPTY ( ( ( S SINCE RENAME SINCE AS SS ) JOIN ( SP SINCE RENAME SINCE AS SPS ) ) WHERE SPS < SS ) ;
С этого примера мы и начнем рассмотрение основной проблемы хронологических баз данных. Для "полухронологической" базы данных, аналогичной показанной на рис. 22.2, по-видимому, потребуется установить много "расширенных ограничений внешнего ключа", подобных приведенному выше. Поэтому нам, скорее всего, потребуются некоторые подходящие случаю способы их сокращенной записи.
Запросы ("полухронологическая" база данных). Рассмотрим "полухронологические" версии запросов 1.1 и 1.2.
■ Запрос 2.1. Определить номера поставщиков, которые в настоящее время могут поставить некоторую деталь, показав в каждом случае дату, начиная с которой они способны выполнить эту поставку. Если поставщик с номером ' Sx' в настоящее время может поставить несколько деталей, он может поставить некоторую деталь начиная с наименьшей даты SINCE, которая есть среди значений дат для поставщика с номером 'Sx' в переменной-отношении SP SINCE (например, если в качестве значения номера 'Sx' взять 'S1', наименьшей датой в столбце SINCE для него будет дата й04). Значит, получаем следующее.
SUMMARIZE SP PER SP { S|} ADD MIN { SINCE } AS SINCE Результат будет таким, как показано ниже.
s# |
SINCE |
SI |
d04 |
S2 |
d08 |
S3 |
d08 |
S4 |
d04 |
■ Запрос 2.2. Определить номера поставщиков, которые в настоящее время не могут поставить ни одной детали, показав в каждом случае дату, начиная с которой они оказались в этом положении.
В нашей базе данных имеется один поставщик, который в настоящее время не может поставить ни одной детали, — это поставщик с номером 'S5'. Однако нельзя сделать какой-либо вывод о дате, начиная с которой поставщик с номером 'S5' не может поставить ни одной детали, поскольку для этого у нас нет данных — база данных пока лишь "яолухронологическая". Предположим, например, что текущий день — это dlO. Тогда может оказаться, что поставщик с номером 'S5' мог поставлять по крайней мере одну деталь начиная с даты, которая меньше даты d2, если с ним ранее был подписан договор, срок действия которого истек не позднее, чем d09. Также возможен крайний случай, когда поставщик с номером ' S5' вообще никогда не имел возможности что-либо поставлять.
Чтобы иметь хоть какие-то шансы получить ответ на запрос 2.2, необходимо завершить "хронологизацию" базы данных или по крайней мере выполнить это в отношении переменной-отношения SP. Точнее, необходимо сохранить в базе данных исторические записи, свидетельствующие о том, какие поставщики, когда и какие именно детали могли поставлять. Именно это мы и попытаемся сделать в следующем разделе.
Полностью хронологическая база данных поставщиков и поставок
На рис. 22.3 показано содержимое полностью хронологической версии базы данных поставщиков и поставок. Обратите внимание, что атрибуты SINCE переименованы в атрибуты FROM (От) и, кроме того, в каждую переменную-отношение добавлен новый атрибут типа временной отметки с именем ТО (До). Совместно атрибуты FROM и ТО отражают понятие интервала времени, в течение которого что-то истинно. Поэтому в именах переменных-отношений заменим слово SINCE (Начиная с) словом FR0MJT0 (От и до). Как видите, теперь в новой базе данных стало больше кортежей, чем в предыдущем варианте, поскольку в ней сохранены исторические записи. Для определенности будем подразумевать, что текущая дата — это dl 0, поэтому значение даты dl 0 для атрибута ТО означает, что соответствующий кортеж отражает текущее состояние дел.
Замечание. Возможно, читателю интересно, что это за механизм, который приводит к тому, что все значения атрибута ТО, которые совпадают с текущей датой dlO, автоматически заменяются значением dl 1 по бою часов в полночь. К сожалению, ответ этот вопрос мы вынуждены на некоторое время отложить, но мы вернемся к нему в разделе 22.11.
Заметим, что хронологическая база данных, показанная на рис. 22.3, включает все данные из предыдущего "полухронологического" аналога, представленного на рис. 22 2, дополненные историческими сведениями, относящимися к предыдущему периоду (от 602 до d04), в течение которого был действителен договор с поставщиком с номером 'S2'. Предикат для переменной-отношения S_FR0M_T0 можно сформулировать так: "Поставщик с номером St и с именем SNAME имел статус STATUS, находился в городе CITY и имел договор на поставку, действительный с дня FROM (и не действительный в день, предшествующий дню FROM) по день ТО (и не действительный в день, следующий за днем ТО)". Для переменной-отношения SP_FR0M ТО предикат построен по аналогичному принципу.
|
|
|
|
|
| ||
S FROM ТО |
s# |
SNAME |
STATUS |
CITY |
FROM |
TO |
|
|
SI |
Smith |
20 |
London |
d04 |
dlO |
|
|
S2 |
Jones |
10 |
Paris |
dO 7 |
dlO |
|
|
S2 |
Jones |
10 |
Paris |
d02 |
d04 |
|
|
S3 |
Black |
30 |
Paris |
d03 |
dlO |
|
|
S4 |
Clark |
20 |
London |
d04 |
dlO |
|
|
S5 |
Adams |
30 |
Athens |
d02 |
dlO |
|
|
|
|
|
|
| ||
SP_FROM_TO |
|
S# |
P# |
FROM |
TO |
| |
|
SI |
PI |
d04 |
dlO |
| ||
|
SI |
P2 |
d05 |
dlO |
| ||
|
SI |
P3 |
d09 |
dlO |
| ||
|
SI |
P4 |
d05 |
dlO |
| ||
|
SI |
P5 |
d04 |
dlO |
| ||
|
SI |
P6 |
d06 |
dlO |
| ||
|
S2 |
PI |
d02 |
d04 |
| ||
|
S2 |
P2 |
d03 |
d03 |
| ||
|
S2 |
PI |
d08 |
dlO |
| ||
|
S2 |
P2 |
d09 |
dlO |
| ||
|
S3 |
P2 |
d08 |
dlO |
| ||
|
S4 |
P2 |
d06 |
d09 |
| ||
|
S4 |
P4 |
d04 |
d08 |
| ||
|
S4 |
P5 |
d05 |
dlO |
| ||
|
|
|
|
|
|
Рис. 22.3. База данных поставщиков и деталей (значения для примера): первая полностью хронологическая версия с использованием временных отметок
Ограничения (первая хронологическая база данных). Прежде всего необходимо принять меры, чтобы в кортежах не появлялись ошибочные пары атрибутов FR0M-T0, в которых момент ТО предшествует моменту FROM.
CONSTRAINT S_FR0M ТО OK
IS_EMPTY ( S_FR0M~T0 WHERE TO < FROM ) ;
CONSTRAINT SP_FR0M_T0 OK
IS EMPTY ( SP FROM~T0 WHERE TO < FROM ) ;
Теперь обратите внимание на атрибуты, подчеркнутые на рис. 22.3 двойной линией. Как видите, атрибут FROM включен в первичный ключ обеих переменных-отношений, S_FR0M_T0 и SP_FR0M_T0. Очевидно, что первичный ключ переменной-отношения S_FR0M_T0 не может быть просто {Si}, поскольку в этом случае в переменную-отношение нельзя было бы включить сведения об одном и том же поставщике, с которым договоры на поставку заключались на несколько различных периодов. Точно такие же соображения применимы и в отношении переменной-отношения SP_FR0M_T0.
Замечание. В первичный ключ вместо атрибута FROM можно было бы включить атрибут ТО. Фактически обе переменные-отношения, S FROM ТО и SP_FR0M ТО, имеют по два потенциальных ключа и являются типичным примером переменных-отношений, для которых нет никаких очевидных причин выбирать один из имеющихся потенциальных ключей в качестве "первичного" [8.13]. Мы сделали указанный выбор исключительно для определенности.
Однако этими первичными ключами не исчерпываются все ограничения, которые нам хотелось бы иметь. Рассмотрим, например, переменную-отношение SP_FR0M_T0. Должно быть ясно, что если в такой переменной-отношении есть кортеж для поставщика с номером 'Sx' со значением f атрибута FROM и значением t атрибута ТО, то нам хотелось бы, чтобы в этой переменной-отношении не было какого-нибудь другого кортежа для поставщика с номером 'Sx', из значения которого следовало бы, что этот поставщик заключил договор со дня, непосредственно предшествующего дню f, или по день, непосредственно следующий за днем t. Например, рассмотрим поставщика с номером 'S1', для которого в переменной-отношении SP_FR0M_T0 имеется один кортеж со значениями атрибутов FROM=d04 и 10=dlO. Одного того, что {St,FROM} является первичным ключом для этой переменной-отношения, очевидно, недостаточно, чтобы предотвратить появление других "перекрывающихся" кортежей для поставщика с номером 'S1', например кортежа со значениями атрибутов FROM=d02 и TO=d06. Если бы такой кортеж появился, то это, кроме всего прочего, указывало бы, что с поставщиком с номером 'S1' был заключен договор, который являлся действительным в день, непосредственно предшествующий дню d04. Вероятно, следовало бы объединить такие два кортежа в один кортеж, в котором значения атрибутов были бы соответственно равны FROM=d02 и TO=dJ05.
5
Заметим, что если не
объединить
такие кортежи, это будет почти равносильно
разрешению существования дубликатов!
Наличие дубликатов означает, что в
базе данных "об одном и том же
говорится дважды ". Однако два кортежа
для поставщика с номером 'S1'
с перекрывающимися интервалами
времени фактически "говорят об одном
и том же дважды ", а именно — оба
они "утверждают", что с поставщиком
с номером 'S1
'
был заключен договор, срок действия
которого включает дни 4, 5 и 6.
Ниже представлено ограничение, которое запрещает перекрытие и смежность вре-мешшх диапазонов.
CONSTRAINT AUG_S FROM Т0_РК
IS EMPTY ((Js FROMJTO RENAME FROM AS Fl, TO AS Tl ) JOIN ( S~FR0M_T0 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.
Замечание. Фактически наличие данного ограничения позволяет обращаться к сочетанию атрибутов {Si,FROM,ТО} как к хронологическому потенциальному ключу (точнее, к хронологическому первичному ключу). Однако это не очень хороший термин, поскольку "хронологический" потенциальный ключ не является на самом деле потенциальным ключом переменной-отношения, которая его содержит. (В разделе 22.9 мы обсудим "хронологические потенциальные ключи", которые являются настоящими потенциальными ключами в классическом смысле этого термина.)
Далее необходимо отметить, что сочетание атрибутов {Si,FROM} в переменной-отношении SP_FR0M_T0 не является внешним ключом переменной-отношения SP_FR0M_T0 для переменной-отношения S_FR0M_T0, несмотря на то что это сочетание включает те же атрибуты, что и первичный ключ переменной-отношения S_FR0M_TO. Однако нам необходимо быть уверенными, что если сведения о некотором поставщике имеются в переменной-отношении SP_FR0M_T0, то они присутствуют и в переменной-отношении S_FR0M_T0.
CONSTRAINT AUG_SP_T0_S_FK_AGAIN1
SP_FR0M_T0 { St } <~S_FR0M_TO { Sf } ;
(Здесь знак "<" означает "является подмножеством".)
Но ограничения AUG_SP_T0_S_FK_AGAIN1 самого по себе недостаточно. Необходимо иметь уверенность в том, что даже после выполнения всех возможных объединений кортежей, если в переменной-отношении SP FROM ТО некоторый поставщик может поставлять некоторую деталь в течение некоторого времени, в переменной-отношении S_FR0M_T0 обязательно есть кортеж для этого поставщика, указывающий, что на определенный период договор с ним действительно был заключен. Это можно попытаться выразить так.
CONSTRAINT AUG_SP T0_S FK_AGAIN2 /* внимание - некорректно */ IS_EMPTY { ( (~S_FR0M_T0 RENAME FROM AS SF, TO AS ST ) JOIN ( SP_FR0M_T0 RENAME FROM AS SPF, TO AS SPT ) ) WHERE SPF < SF OR SPT > ST ) ;
Однако, как сказано в комментарии, данное определение фактически неверно. Чтобы разобраться, почему именно, рассмотрим пример. Пусть переменная-отношение S_FR0M_T0 будет такой, как показано на рис. 22.3, и пусть переменная-отношение
SP_FROM_TO содержит кортеж для поставщика с номером 'S2' с атрибутами, скажем, FROM=dOJ и TO=d04. Очевидно, что такое сочетание является допустимым, но на самом деле ограничение AUG_SP_T0_S_FK_AGAIN2 его запрещает.
Здесь мы не будем пытаться решить эту проблему, а отложим ее обсуждение до раздела 22.9. Однако отметим, что если, как указывалось ранее, сочетание атрибутов {St,FROM,ТО} в переменной-отношении S_FR0M_T0 считается "хронологическим потенциальным ключом", то сочетание атрибутов {Si,FROM,ТО} в переменной-отношении SP_FR0M_T0 можно считать "хронологическим внешним ключом" (хотя он на самом деле не является внешним ключом как таковым). Обсуждение этого вопроса также будет продолжено в разделе 22.9.
Запросы (первая хронологическая база данных). Рассмотрим полные хронологические версии запросов 1.1 и 1.2.
■ Запрос 3.1. Получить тройки значений атрибутов SI, FROM и ТО для поставщиков, которые в некоторое время могут поставить некоторую деталь, где FROM и ТО вместе означают максимальный непрерывный период, в течение которого поставщик с номером St действительно мог поставить некоторую деталь.
Замечание. Здесь слово "максимальный" используется как удобное сокращение, которое в данном случае означает, что поставщик с номером St не мог поставить ни одной детали до дня FROM и после дня ТО.
■ Запрос 3.2. Получить тройки значений атрибутов St, FROM и ТО для поставщиков, которые в определенное время не могут поставить никаких деталей, где FROM и ТО вместе означают максимальный непрерывный период, в течение которого поставщик с номером Si действительно не мог поставлять никаких деталей.
Вероятно, вам не потребуется много времени, чтобы, как и нам, предпочесть даже не приступать к написанию этих запросов! Если вы все-таки предпримете такую попытку, то в конце концов тот факт, что эти запросы можно выразить, хотя и чрезвычайно трудно, станет вам известен. Также несомненно, что вы придете к выводу о крайней желательности соответствующих сокращений.
Можно сделать заключение, что суть проблемы хронологических данных состоит в том, что их наличие требует создания ограничений и запросов, которые чрезмерно сложны, чтобы их сформулировать, если, конечно, системой не предоставляются удачно разработанные сокращения, которых, как нам известно, коммерческие СУБД в настоящее время не имеют.