
- •Isbn 5-8459-0138-3 (рус) isbn 0-201-38590-2 (англ)
- •Глава 2. Архитектура системы баз данных 65
- •Глава 6. Реляционная алгебра 192
- •Глава 7. Реляционное исчисление 243
- •Глава 8. Целостность данных 301
- •Глава 9. Представления 350
- •Часть 111
- •Часть IV
- •Глава 14. Восстановление 544 14.1. Введение 544
- •Глава 15. Параллельность 566
- •Часть V
- •Глава 16. Защита данных 602
- •Глава 17. Оптимизация 639
- •Глава 18. Отсутствующая информация 693
- •Глава 19. Наследование типов 725
- •Глава 20. Распределенные базы данных 767
- •Глава 21. Поддержка принятия решений 813
- •Глава 22. Хронологические базы данных 853
- •Глава 23. Логические системы управления базами данных 899
- •Часть VI
- •Глава 24. Объектные базы данных 944
- •Глава 25. Объектно-реляционные базы данных 999
- •Часть I (четыре главы) — это обширное введение в теорию баз данных вообще и реляционных баз данных в частности. Здесь также излагаются основы стандартно- го языка баз данных sql.
- •Часть IV. Две главы данной части — это несколько пересмотренные и расширен- ные версии глав 13 и 14 предыдущего издания.
- •Часть VI. Глава 24 является полностью переписанной и значительно улучшенной версией глав 22-24. Глава 25 почти полностью обновлена.
- •Часть I
- •Часть I состоит из четырех вводных глав.
- •1.1. Вводный пример
- •1.2. Что такое система баз данных
- •1.3. Что такое база данных Перманентные данные
- •1.4. Назначение баз данных
- •1.5. Независимость данных
- •1.6. Реляционные и другие системы
- •1.7. Резюме
- •2.1. Введение
- •2.2. Три уровня архитектуры
- •Внешний уровень (представления отдельных пользователей)Концептуальный уровень (обобщенное представление пользователей)
- •2.3. Внешний уровень
- •Отображение "внешний/концептуальный" схемы
- •Определение структур хранения (внутренняя схема)
- •Внешнее представление а Концептуальная схема
- •2.4. Концептуальный уровень
- •2.5. Внутренний уровень
- •2.6. Отображения
- •2.7. Администратор базы данных
- •2.8. Система управления базой данных
- •2.9. Система управления передачей данных
- •2.10. Архитектура "клиент/сервер"
- •2.11. Утилиты
- •2.12. Распределенная обработка
- •2.13. Резюме
- •3.1. Введение
- •3.2. Реляционная модель
- •3.3. Отношения и переменные-отношения
- •3.4. Смысл отношений
- •3.5. Оптимизация
- •3.6. Каталог
- •3.7. Базовые переменные-отношения и представления
- •3.8. Транзакции
- •3.9. База данных поставщиков и деталей
- •3.10. Резюме
- •Глава 4
- •4.1. Введение
- •4.2. Обзор языка sql
- •4.3. Каталог
- •4.4. Представления
- •4.5. Транзакции
- •4.6. Внедрение sql-операторов
- •4.7. Несовершенство языка sql
- •4.8. Резюме
- •Часть 9. Управление внешними данными (sql/med) Часть 10. Связь с объектным языком (sql/olb)
- •Часть II
- •Глава 5
- •5.1. Введение
- •5.2. Домены
- •5.3. Значения отношений
- •5.4. Переменные-отношения
- •5.5. Средства sql
- •5.6. Резюме
- •6.1. Введение
- •6.2. Реляционная замкнутость
- •6.3. Синтаксис
- •6.4. Семантика
- •6.5. Примеры
- •6.5.1. Получить имена поставщиков детали с номером 'р2'
- •6.5.2. Получить имена поставщиков по крайней мере одной красной детали
- •6.5.3. Получить имена поставщиков всех типов деталей
- •6.5.4. Получить номера поставщиков по крайней мере тех типов деталей, которые поставляет поставщик с номером 's2'
- •6.5.5. Получить все пары номеров поставщиков, находящихся в одном городе
- •6.5.6. Получить имена поставщиков, которые не поставляют деталь с номером 'р2'
- •6.6. Зачем нужна реляционная алгебра
- •6.7. Дополнительные операторы
- •6.8. Группирование и разгруппирование
- •6.9. Реляционные сравнения
- •6.10. Резюме
- •7.1. Введение
- •7.2. Исчисление кортежей
- •7.3. Примеры
- •7.3.5. Найти имена поставщиков по крайней мере одной детали, поставляемой поставщиком с номером 's2'
- •7.3.6. Выбрать имена поставщиков всех типов деталей
- •7.3.7. Определить имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.3.8. Определить номера поставщиков по крайней мере всех типов деталей, поставляемых поставщиком с номером *s2'
- •7.4. Сравнительный анализ реляционного исчисления и реляционной алгебры
- •7.5. Вычислительные возможности
- •7.5.1. Определить номера и вес в граммах всех типов деталей, вес которых превышает 10 ооо г
- •7.6.1. Выбрать номера поставщиков из Парижа со статусом, большим 20
- •7.7.1. Указать цвета деталей и названия городов, в которых находятся детали "не из Парижа" с весом, превышающим 10 фунтов
- •7.7.2. Для всех деталей указать номер и вес в граммах
- •7.7.3. Выбрать информацию обо всех парах поставщиков и деталей, находящихся в одном городе
- •7.7.4. Найти все пары названий городов, таких, что поставщик из первого города поставляет деталь, находящуюся во втором городе
- •7.7.5. Выбрать все пары номеров поставщиков, таких, что оба поставщика в каждой паре находятся
6.7. Дополнительные операторы
Многие авторы предлагали новые алгебраические операторы после определения Код- дом первоначальных восьми. В этом разделе детально рассматривается несколько таких операторов— SEMIJ0IN (полусоединение), SEMIMINUS (полувычитание), EXTEND (расширение), SUMMARIZE (обобщение) и TCL0SE (транзитивное замыкание). В терминах языка Tutorial D синтаксис этих операторов выглядит следующим образом.
<полусоединениё>
:: = реляционное выражение>
SEMIJ0IN реляционное выражениё>
<полувычитание>
::- реляционное выражение>
SEMIMINUS реляционное выражение>
расширение>
::= EXTEND реляционное выражениё>
ADD <список добавляемых расширений>
<добавляемое расширение>
::= <выражевие> AS <имя атрибута>
<обобщение>
::= SUMMARIZE реляционное выражениё> PER реляционное выражение> ADD <список добавляемых обобщений?
<добавляемое обобщениё>
::= <тип обобщения? [ ( <скалярное выражение> ) )
AS <имя атри6ута>
<тип обобщения?
::= COUNT | SUM | AVG | MAX | MIN | ALL | ANY | C0UNTD | SUMD | AVGD
<транзитивное замыкание>
:: = TCL0SE реляционное выражение>
Значения различных параметров реляционное выражение>, упомянутые в этом син- таксисе BNF, не должны иметь тип <не проекция?.
Полусоединение
Пусть обозначения А, В, X, Y и I будут иметь тот же смысл, который был им присвоен при определении оператора JOIN в разделе 6.4. Тогда полусоединением отношения А с отношением В (что записывается как A SEMIJ0IN В, причем именно в таком порядке) по определению называется операция, эквивалентная следующей.
( A JOIN В ) { X, Y }
Другими словами, полусоединением отношения А с отношением В называется резуль- тат соединения отношений А и В, для которого дополнительно выполнена операция про- екции по атрибутам отношения А. Тело полученного в результате выполнения этой опе- рации отношения, неформально говоря, состоит из тех кортежей отношения А, которые имеют соответствие в отношении В.
Пример. Получить значения атрибутов Si, SNAME, STATUS и CITY для всех поставщи- ков детали с номером ' Р2'.
S SEMIJOIN ( SP WHERE PI = Pi ( 'P2' ) )
Полувычитание
Снова пусть обозначения А, В, X, Y и Z имеют тот же смысл, что и при определении оператора JOIN в разделе 6.4. Тогда полувычитанием отношений А и В (что записывает- ся как A SEMIMINUS В, причем именно в таком порядке) называется операция, эквива- лентная следующему оператору.
A MINUS ( A SEMIJ0IN В )
Неформально говоря, тело полученного в результате выполнения этой операции отноше- ния состоит из тех кортежей отношения А, которые не нашли соответствия в отношении В.
Пример. Получить значения атрибутов St, SNAME, STATUS и CITY для всех поставщи- ков, не поставляющих деталь с номером ' Р2'.
S SEMIMINUS ( SP WHERE Р# = Р# ( 'Р2' ) )
Операция расширения
Читатель, возможно, заметил, что в описанной нами алгебре нет средств для скаляр- ных вычислений. Конечно, на практике такие возможности просто необходимы. Напри- мер, может понадобиться запросить из базы данных результат вычисления некоторого арифметического выражения, подобного выражению WEIGHT*454, или сослаться на такое значение в выражении WHERE при выборке. (Вспомним, что в нашем примере вес деталей приведен в фунтах; тогда выражение WEIGHT*454 переводит этот вес в граммы5.) Для обеспечения таких возможностей и предназначена операция расширения. Точнее, с ее помощью из определенного отношения (по крайней мере, концептуально) создается но- вое отношение. Оно похоже на начальное, но содержит дополнительный атрибут, значе- ния которого получены посредством некоторых скалярных вычислений. Например, можно написать следующее.
EXTEND Р ADD ( WEIGHT * 454 ) AS GMWT
С помощью этого выражения (заметьте, именно выражения, а не команды или опера- тора, что разрешает вложение подобных выражений в другие выражения) создается но- вое отношение с таким же заголовком, как и у отношения Р, за исключением дополни- тельного атрибута GMWT. Каждый кортеж этого отношения совпадает с соответствующим кортежем отношения Р, но содержит еще одно дополнительное значение атрибута GMWT, вычисляемое в соответствии с указанным выражением, как показано на рис. 6.9.
р# |
PNAME |
COLOR |
WEIGHT |
CITY |
GMWT |
Р1 |
Nut |
Red |
12,0 |
London |
5448,0 |
Р2 |
Bolt |
Green |
17,0 |
Paris |
7718,0 |
РЗ |
Screw- |
Blue |
17,0 |
Rome |
7718,0 |
Р4 |
Screw |
Red |
14,0 |
London |
6356,0 |
Р5 |
Cam |
Blue |
12,0 |
Paris |
5448,0 |
Р6 |
Cog |
Red |
19,0 |
London |
8626,0 |
Рис. 6.9. Пример выполнения операции расширения
Обратите внимание, что это выражение EXTEND не изменяет содержимое базовой пере- менной-отношения деталей в базе данных. Это всего лишь выражение, такое же, как, на- пример, S JOIN SP, и значит, оно создает определенный результат. В нашем случае этот ре- зультат подобен текущему значению базовой переменной-отношения деталей. (Иначе го- воря, операция расширения — это не реляционный аналог SQL-оператора ALTER TABLE.)
Теперь можно использовать вновь созданный атрибут GMWT в любых операциях про- екции, выборки и т.д., как, например, показано ниже.
( ( EXTEND Р ADD ( WEIGHT * 454 ) AS GMWT )
WHERE GMWT > WEIGHT ( 10000.0 ) ) { ALL BUT GMWT }
Замечание. Конечно, более дружественный пользователю язык должен позволять вставлять подобные выражения непосредственно в предложение WHERE, например, сле- дующим образом.
Р WHERE ( WEIGHT * 454 ) > WEIGHT ( 10000.0 )
Однако такая возможность — это всего лишь синтаксическое усовершенствование. Обратимся к обобщенному представлению данного выражения.
EXTEND A ADD ехр AS Z
В общем случае результатом вычисления подобного выражения будет отношение с заголовком, эквивалентным заголовку исходного отношения А, но с расширенным новым атрибутом Z. Тело результирующего отношения будет состоять из всех кортежей t, где t является кортежем отношения А, дополненного значением нового атрибута Z, который определяется посредством вычисления скалярного выражения ехр для данного кортежа отношения А. При этом отношение А не должно иметь атрибута Z и выражение ехр не должно ссылаться на атрибут Z. Заметьте, что кардинальность результата равна карди- нальности отношения А, а степень результата равна степени отношения А плюс единица. Типом переменной Z в этом случае будет тип выражения ехр.
Приведем еще несколько примеров.
1. EXTEND S ADD 'Supplier' AS TAG
Это выражение эффективно дополняет каждый кортеж отношения S символьным значением 'Supplier' (очевидно, что скалярный литерал (символьное значение) является простейшим случаем скалярного выражения).
2. EXTEND { Р JOIN SP ) ADD ( WEIGHT * QTY ) AS SHIPWT
Этот пример иллюстрирует применение оператора EXTEND к результату реляцион- ного выражения, более сложного, чем просто имя переменной-отношения.
3. ( EXTEND S ADD CITY AS SCITY ) { ALL BUT CITY }
Имя атрибута, такое как CITY, — также допустимое скалярное выражение. Заметь- те, что этот пример равносилен следующему выражению.
S RENAME CITY AS SCITY
Иными словами, оператор RENAME не примитивен! Он может быть определен через оператор EXTEND (и проекцию). Разумеется, мы не собираемся отвергать уже зна- комый оператор RENAME, поскольку он действительно полезен. Однако тот факт, что оператор RENAME — в действительности просто сокращение, является, по крайней мере, интересным.
4. EXTEND Р ADD WEIGHT * 454 AS GMWT, WEIGHT * 16 AS OZWT Этот пример служит иллюстрацией "множественного" расширения.
5. EXTEND S
ADD COUNT ( ( SP RENAME St AS X ) WHERE X = St ) AS NP
Результат вычисления этого выражения показан на рис. 6.10.
s# |
SNAME |
STATUS |
CITY |
NP |
SI |
Smith |
20 |
London |
6 |
S2 |
Jones |
10 |
Paris |
|
S3 |
Black |
30 |
Paris |
1 |
S4 |
Clark |
20 |
London |
3 |
S5 |
Adams |
30 |
Athens |
0 |
Рис. 6.10. Еще один пример операции расширения Пояснения
■ Для данного поставщика в текущем значении переменной-отношения S вы- ражение
( ( SP RENAME S# AS X ) WHERE X = St )
позволяет возвратить множество кортежей поставок, соответствующих кор- тежу поставщика в текущем значении переменной-отношения SP.
■ Затем для этого множества поставок применяется обобщающая функция COUNT, возвращающая соответствующее значение кардинальности (которое является, конечно же, скалярным значением).
Атрибут NP в результирующем отношении представляет количество деталей, кото- рые поставляются поставщиком, определяемым соответствующим значением атри- бута St. В частности, обратите внимание на значение атрибута NP для поставщика с номером 'S5' — множество кортежей отношения SP для этого поставщика пусто, поэтому функция COUNT возвращает значение "нуль".
Рассмотрим вкратце обобщающие функции. Общее назначение этих функций со- стоит в том, чтобы на основе значений некоторого атрибута определенного отно- шения получить скалярное значение. Типичными примерами являются функции COUNT, SUM, MAX, MIN, ALL и ANY. В языке Tutorial D параметр <вызов обобщающей функции> является особым случаем параметра <скалярвое выражениё> и в общем случае имеет следующий вид.
<имя функции> { реляционное выражение> [, <иня атрибута> ] )
Если параметр <имя функции> имеет значение COUNT, то параметр <имя атрибута> недопустим и должен быть опущен. В остальных случаях параметр <имя атрибута> может быть опущен тогда и только тогда, когда параметр реляционное выражение> задает отношение со степенью, равной единице. Тогда единственный атрибут результирующего отношения, получаемого после вычис- ления выражения реляционное выражение>, будет использоваться по умолча- нию. Вот несколько примеров.
SUM { SP WHERE St = St { 'SI' ), QTY)
SUM ( ( SP WHERE St = St( 'SI' ) ) { QTY } )
Обратите внимание на различие между этими двумя выражениями. Первое выра- жение позволяет подсчитать суммарный объем всех поставок для поставщика с номером 'S1', а второе — суммарный объем всех поставок различных комплектов деталей для поставщика с номером ' S1'.
Если аргумент обобщающей функции оказывается пустым множеством, то функ- ции COUNT и SUM возвращают значение "нуль", а функции MIN и МАХ — наименьшее и наибольшее значения соответствующего домена. Функции ALL и ANY в этом слу- чае возвращают соответственно значения истина и ложь, а функция AVG генериру- ет исключительную ситуацию.
Операция обобщения
Начиная этот раздел, следует сказать, что данная версия оператора SUMMARIZE отлича- ется от версий, рассмотренных в предыдущих изданиях настоящей книги. Фактически это улучшенная версия, в которой учтены определенные трудности, возникавшие в пре- дыдущих версиях при работе с пустыми отношениями.
Как мы уже убедились, в реляционной алгебре операция расширения позволяет вы- полнять "горизонтальные" вычисления в отношении отдельных строк. Оператор обоб- щения выполняет аналогичную функцию для "вертикальных" вычислений в отношении отдельного столбца. Например, рассмотрим следующее выражение.
SUMMARIZE SP PER SP { Pt } ADD SUM ( QTY ) AS TOTQTY
В результате его вычисления создается отношение с заголовком {P|,T0TQTY}, содер- жащее один кортеж для каждого значения атрибута Pt в проекции SP{Pt}. Каждый из этих кортежей содержит значение атрибута Pi и соответствующее общее количество де- талей (рис. 6.11). Другими словами, концептуально исходное отношение Р "перегруппировано" в множество групп кортежей (по одной группе для каждого уни- кального значения атрибута Pi), после чего для каждой полученной группы сгенерирован один кортеж, помещаемый в окончательный результат.
р# |
TOTQTY |
Р1 |
600 |
Р2 |
1000 |
РЗ |
400 |
Р4 |
500 |
Р5 |
500 |
Р6 |
100 |
Рис. 6.11. Пример выполнения операции SUMMARIZE В общем случае значение выражения SUMMARIZE A PER В ADD <обо6щение> AS Z определяется следующим образом.
Отношение В должно иметь такой же тип, как и некоторая проекция отношения А, т.е. каждый атрибут отношения В должен одновременно присутствовать в отно- шении А. Примем, что атрибутами этой проекции (или, что эквивалентно, атрибу- тами отношения В) являются атрибуты Al, А2, ... , An.
Результатом вычисления данного выражения будет отношение с заголовком {А1, А2, ... , An, Z}, где Z является новым добавленным атрибутом.
Тело результата содержит все кортежи t, где t является кортежем отношения В, расширенным значением нового атрибута Z. Это значение нового атрибута Z под- считывается посредством вычисления обобщающего выражения по всем корте- жам отношения А, которое имеет те же значения для атрибутов Al, А2, ... , An, что и кортеж t. (Разумеется, если в отношении А нет кортежей, принимающих те же значения для атрибутов Al, А2, ... , An, что и кортеж t, то обобщающее вы- ражение будет вычислено для пустого множества.) Отношение В не должно со- держать атрибут с именем Z, а обобщающее выражение не должно ссылаться на атрибут Z. Заметьте, что кардинальность результата равна кардинальности отно- шения В, а степень результата равна степени отношения В плюс единица. Типом переменной Z в этом случае будет тип обобщающего выражения.
Вот еще один пример.
SUMMARIZE { Р JOIN SP ) PER Р { CITY } ADD COUNT AS NSP Результат его вычисления будет выглядеть так.
CITY |
NSP |
London |
5 |
Paris |
6 |
Rome |
1 |
Другими словами, результат содержит по одному кортежу для каждого из трех упо- минаемых в отношении Р городов (Лондона, Парижа и Рима), причем в каждом кортеже показано количество поставок деталей из соответствующего города. v
Сделаем некоторые выводы.
1. Предложенный синтаксис позволяет выполнять множественные операции обоб- щения, как, например, показано ниже.
SUMMARIZE SP BY { Р# } ADD SUM ( QTY ) AS TOTQTY,
AVG ( QTY ) AS ATCQTY
2. Общая форма параметра <о6общение> (повторимся) имеет следующий вид.
SUMMARIZE реляционное выражение>
PER реляционное выражение>
ADD <список добавляемых обобщений>
Каждый элемент <добавляемое о6о6щение>, в свою очередь, имеет следующий вид.
«тип обобщения^ [ { <скалярное зыражение> ) ] AS <имя атри6ута>
Чаще всего параметр <тип обобщения> задает одну из функций COUNT, SUM, AVG, MIN, MAX, ALL, ANY, COUNTD, SUMD и AVGD. Буква "D" (distinct — различный) в названии функций COUNTD, SUMD и AVGD означает следующее: "перед выполнением этой обобщающей операции удалить все избыточные повторяющиеся значения". Пара- метр <скалярное выражение> может содержать ссылки на атрибуты отношения, ко- торое определяется параметром реляционное выражение>, размещенным непо- средственно за ключевым словом SUMMARISE.
Замечание. Параметр <скалярное выражениё> (вместе с квадратными скобками) можно опустить лишь в том случае, если параметр <тип обобщение имеет значе- ние COUNT.
Обратите также внимание на то, что параметр <до6авляемое о6общение> — это не вызов обобщающей функции, задаваемый параметром <вызов обобщающей функции>. Параметр <вызов обобщающей функции> задает скалярное выражение и может использоваться в любом месте, где допустим вызов оператора выборки (в частности, скалярного литерала). Параметр Добавляемое о6общение> — это не скалярное значение; он является операндом оператора SUMMARIZE и имеет смысл только в контексте операции обобщения.
3. Как вы, наверное, догадались, оператор SUMMARIZE не примитивен— его можно моделировать с помощью оператора EXTEND. Например, рассмотрим следующее выражение.
SUMMARIZE SP PER S { St } ADD COUNT AS NP
По сути, это сокращенная запись представленного ниже более сложного выраже- ния.
{ EXTEND S { St }
£kr*v^ ADD ( ( SP RENAME St AS X ) WHERE X = St ) AS Y,
COUNT { Y ) AS NP )
{ St, NP }
Возможен еще один эквивалентный вариант записи.
WITH ( S { St } ) AS Tl,
( SP RENAME St AS X ) AS T2,
( EXTEND Tl ADD ( T2 WHERE X = St ) AS Y ) AS T3, ( EXTEND T3 ADD COUNT ( Y ) AS NP ) AS T4: T4 { St, NP }
4. Рассмотрим следующий пример.
SUMMARIZE SP PER SP { } ADD SUM ( QTY ) AS GRANDTOTAL
В нем группирование и подведение итогов производятся для отношения, которое вообще не имеет атрибутов. Пусть sp — это текущее значение базовой перемен- ной-отношения SP. Предположим, что отношение sp содержит по крайней мере один кортеж. Тогда все кортежи отношения sp будут иметь "одинаковые значения" по пустому множеству атрибутов, а именно— по "0-кортежу" [5.5]. Таким обра- зом, в этом контексте они образуют единственную группу, для которой в конечном результате будет построен всего один кортеж. Другими словами, обобщающая
функция вычисляется только один раз и для всего отношения sp в целом. Следова- тельно, вычисление представленного выше выражения SUMMARIZE даст в результате отношение с одним атрибутом (с именем GRANDTOTAL) и одним кортежем, причем единственное скалярное значение в единственном результирующем кортеже явля- ется общим итогом по всем значениям атрибута QTY в исходном отношении sp.
Если, с другой стороны, исходное отношение sp совсем не имеет кортежей, то нет и групп, а следовательно, нет и результирующих кортежей, т.е. результирующее отношение также будет пустым. Однако приведенное ниже выражение, напротив, "будет работать" (т.е. будет возвращать корректное значение, а именно — нуль), даже если отношение sp пустое 6.
SUMMARIZE SP PER RELATION { TUPLE { } }
ADD SUM ( QTY ) AS GRANDTOTAL
Точнее, это выражение будет возвращать отношение с одним лишь атрибутом GRANDTOTAL и одним кортежем, в котором значение GRANDTOTAL будет равно нулю. Поэтому автор предлагает разрешить опускать предложение PER в выражении SUMMARIZE, как это сделано в следующем примере.
SUMMARIZE SP ADD SUM ( QTY ) AS GRANDTOTAL
Подразумевается, что пропуск предложения PER эквивалентен определению этого предложения в следующей форме.
PER RELATION { TUPLE { } }
Транзитивное замыкание
Операция транзитивного замыкания упоминается здесь, в основном, для полноты из- ложения. Ее детальное обсуждение выходит за рамки данной главы. Тем не менее мы да- дим здесь определение этой операции. Пусть А — произвольное бинарное отношение с ат- рибутами X и Y, принадлежащими одному типу Т. Тогда транзитивным замыканием от- ношения А (что записывается как TCL0SE А) называется отношение А+, заголовок которого такой же, как заголовок отношения А, а тело является супермножеством отношения А.
Супермножество отношения А определяется следующим образом. Кортеж { Х:х, Y:y } принадлежит отношению А* тогда и только тогда, когда он принадлежит отноше- нию А или когда существует последовательность значений zl, z2, ... , zn (принадлежащихтипу Т), такая, что все кортежи { Х:х, Y:zl }, { X:zl, Y:z2 }, ... , { X:zn, Y:y } принадлежат отношению А. Иначе говоря, кортеж (х,у) принадлежит от- ношению А* только тогда, когда (нестрого говоря) в представляющем отношение А графе есть линия, соединяющая точку х с точкой у. Обратите внимание на то, что тело отноше- ния А всегда содержится в теле отношения А+ как подмножество.
Обсуждение этого вопроса будет продолжено в главе 23.