- •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.9. Ограничения, включающие интервалы
Очевидно, что пара атрибутов {Si,DURING} является потенциальным ключом для переменной-отношения S DURING. На рис. 22.4 для данного ключа использовалось подчеркивание двойной линией, указывающее, что это первичный ключ. Отметим, что атрибут {Si} сам по себе не является потенциальным ключом, поскольку после завершения действия договора с некоторым поставщиком может быть заключен новый договор, как, например, в случае поставщика с номером 'S2' в базе данных, представленной на рис. 22.4. Таким образом, переменную-отношение S_DURING можно определить так.
VAR S_DURING BASE RELATION
{ Si SI, SNAME NAME, STATUS INTEGER, CITY CHAR,
DURING INTERVAL ( DATE ) } KEY { Si, DURING } ; /* Предупреждение: этого недостаточно! */
Однако определение ключа, как оно здесь представлено, не полностью отвечает необходимым требованиям, несмотря на то что оно логически корректно. А именно, согласно этому определению в переменной-отношении S DURING допустимы, например, два таких кортежа.
S2 |
Jones |
10 |
Paris |
[d02,d08] |
S2 |
Jones |
10 |
Paris |
[d07,dl0] |
Как видите, в этих кортежах имеется определенная избыточность, поскольку данные о наличии договора с поставщиком с номером 'S2' в дни 7 и 8 представлены дважды.
Данный вариант предложения KEY имеет и другой недостаток: оно не исключает возможности появления в переменной-отношении S DURING, например, таких двух кортежей.
S2 |
Jones |
10 |
Paris |
[d02,d06] |
S2 |
Jones |
10 |
Paris |
\d07,dl0] |
В этом случае уже нет избыточности данных, однако имеется излишнее многословие, поскольку два кортежа используются для того, чтобы "сказать" то, что можно выразить в одном кортеже.
S2 | Jones [10 1 Paris \[d02,dl0]
Чтобы предотвратить подобные случаи избыточности и излишнего "многословия", для переменной-отношения, очевидно, необходимо предоставить соответствующее ограничение (назовем его ограничением С1), которое может быть сформулировано так.
Если два отдельных кортежа переменной-отношения S DURING идентичны, за исключением лишь значений их атрибутов DURING, равных И и /2, то результат операции il MERGES i2 должен иметь значение ложь.
(Напомним, что операция проверки слияния интервалов MERGES представляет собой логическую конъюнкцию (OR) операций перекрытия интервалов OVERLAPS и проверки смежности MEETS. Поэтому операция MERGES может возвращать результат ложь только в том случае, если он будет получен и для обеих операций OVERLAPS и MEETS. Ограничение перекрытия интервалов с помощью операции OVERLAPS служит для предотвращения избыточности, а ограничение смежности интервалов с помощью операции MEETS используется, чтобы предотвратить излишнее "многословие".) Должно быть ясно, что существует очень простой способ реализации ограничения С1, а именно— посредством постоянной поддержки переменной-отношения SJ3URING в свернутом состоянии по всем значениям времени атрибута DURING. Поэтому добавим к определению этой переменной-отношения предложение COALESCED, которое в общем случае является необязательным.
VAR S DURING BASE RELATION
{ S? Si, SNAME NAME, STATUS INTEGER, CITY CHAR,
DURING INTERVAL ( DATE ) } KEY { St, DURING } ; /* Этого по-прежнему недостаточно! */
COALESCED DURING ;
Ч
Отметим, что можно добавить аргумент
с целью обеспечения соответствующего
специального синтаксиса для решения
проблемы избыточности, но не проблемы
"многословия".
Замечание. Пока подразумевается, что любая попытка обновить переменную-отношение S_DURING так, чтобы она оказалась не полностью свернутой по атрибуту DURING, отвергается. Обсуждение этого вопроса будет продолжено в разделе 22.10.
К сожалению, предложения KEY и COALESCED все еще не полностью отвечают необходимым требованиям. Например, по-прежнему возможно появление таких двух кортежей.
S2 |
Jones |
10 |
Paris |
[d02.dOS] |
S2 |
Jones |
20 |
Paris |
[d07,dW] |
В этом случае поставщик с номером 'S2' в дни 7 и 8 имеет статус 10 и 20 (ясно, что наличие таких кортежей недопустимо). Другими словами, здесь мы имеем дело с противоречием.
Понятно, что для устранения таких противоречий необходимо обеспечить для переменной-отношения соответствующее ограничение. Назовем его ограничением С2. Оно может быть сформулировано следующим образом.
Если два отдельных кортежа переменной-отношения S_DURING с одним и тем же значением атрибута S# имеют значения атрибута DURING, равные il и i2 соответственно, и выражение il OVERLAPS i2 истинно, то эти кортежи должны быть идентичны, за исключением, может быть, значений их атрибута DURING.
Необходимо подчеркнуть, что ограничение С2 не реализуется поддержкой переменной-отношения S_DURING в свернутом состоянии по атрибуту DURING (и, очевидно, не реализуется за счет того, что {S#,DURING} является потенциальным ключом). Но если предположить, что переменная-отношение S_DURING всегда поддерживается развернутой по атрибуту DURING, то справедливы следующие замечания.
Единственный потенциальный ключ для развернутой формы переменной-отношения S_DURING UNFOLD DURING— это все та же комбинация атрибутов {S#,DURING}, поскольку в любое заданное время любой заданный поставщик, с которым в данное время заключен договор, имеет только одно имя, один статус и находится в одном городе.
Следовательно, никакие два отдельных кортежа не могли бы иметь одно и то же значение атрибута St и "перекрывающиеся" значения атрибута DURING, поскольку в форме S_DURING UNFOLD DURING все значения атрибута DURING являются единичными интервалами, и два кортежа с одним и тем же значением атрибута St и "перекрывающимися" значениями атрибута DURING являлись бы дубликатами (фактически они были бы одним и тем же кортежем).
Поэтому, если обеспечено такое ограничение, что комбинация атрибутов {St,DURING} является потенциальным ключом для формы S_DURING UNFOLD DURING, ограничение С2 обеспечивается "автоматически". Определим новое предложение I_KEY, которое может использоваться вместо обычного предложения KEY в переменной-отношении S_DURING.
VAR S_DURING BASE RELATION
{ St St, SNAME NAME, STATUS INTEGER, CITY CHAR, DURING INTERVAL ( DATE ) }
I KEY { St, DURING UNFOLDED} COALESCED DURING ;
Предложение I_KEY здесь означает именно то, что комбинация атрибутов {S#,DURING} является потенциальным ключом для формы S_DURING UNFOLD DURING12. Таким образом, этого специального синтаксиса вполне достаточно для устранения указанного противоречия.
Необходимо заметить, что если комбинация атрибутов {Si,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 { St, DURING UNFOLDED } REFERENCES S_DURING ...
Его смысл заключается в следующем: если в переменной-отношении SP_DURING имеются сведения о том, что поставщик с номером ' Sx' может поставлять некоторые детали в течение интервала i, то в переменной-отношении S_DURING также должно быть отображено, что с поставщиком с номером 'Sx' заключен договор, действительный в течение всего этого интервала i. Если данное ограничение удовлетворяется, комбинация атрибутов {Si,DURING} в переменной-отношении SP_DURING может считаться хронологическим внешним ключом в смысле, оговоренном в разделе 22.3. (Однако это еще не настоящий внешний ключ в классическом смысле.)
12
Некоторые авторы определяют семантику
предложения I
KEY
таким
образом, что оно используется и для
решения проблемы избыточности. Мы же
считаем такой подход несколько
нелогичным и здесь не используем
(во всяком случае в этом нет необходимости,
поскольку ясно, что для того, чтобы
справиться с проблемой избыточности,
вполне достаточно и предложения
COALESCED).