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

1 ... 41 42 43 [ 44 ] 45 46 47 ... 348


OPERATOR REFLECT ( P POINT ) UPDATES ( P ) ; BEGIN ;

THE X ( P ) := - THE X ( P ) ; THE Y ( P ) := - THE Y ( P ) ; RETURN ; END ; END OPERATOR ;

Оператор REFLECT отображает точку с декартовыми координатами (х,у) симметрично относительно начала координат в точку (-х,-у), модифицируя соответствующим образом координаты исходной точки. Обратите внимание на использование в этом примере выражений вида ТНЕ псевдопеременная. ТНЕ псевдопеременная - это обращение оператора THE к точке назначения (в частности, слева от оператора присвоения). Такое обращение оператора фактически не возвращает, а назначает значение указанному компоненту своего аргумента. Например, в определении оператора REFLECT выражение ТНЕ Х ( Р ) : = ...; фактически присваивает компоненту X некоторое значение (допустимого декартова представления) аргумента-переменной, представленной параметром Р. Разумеется, для изменения любого аргумента с помощью оператора обновления, в частности путем присвоения значения выражению ТНЕ псевдопеременная, этот аргумент следует определить как переменную, а не как более общее выражение.

Ниже показано, что псевдопеременные могут быть вложенными.

VAR LS LINESEG ;

ТНЕ Х ( THE BEGIN ( LS ) ) := 6.5 ;

Наконец, от ненужного оператора можно избавиться, как, например, показано ниже. DROP OPERATOR REFLECT ;

Однако удаляемый таким образом оператор не может быть встроенным.

Преобразование типов

Еще раз рассмотрим следующее определение типа данных. TYPE S# POSSREP ( CHAR ) ;

По умолчанию допустимое представление этого типа унаследует имя St, а значит, данное имя получит и соответствующий оператор выбора. Таким образом, следующее выражение будет корректным.

SI ( S1 )

Оно возвращает номер определенного поставщика. Обратите внимание на то, что оператор выбора S# можно рассматривать как оператор преобразования типа, который преобразует строки в номера поставщиков. Аналогично оператор выбора Р можно рассматривать как оператор преобразования строк в номера деталей, а оператор выбора QTY - как оператор преобразования целых чисел в количество деталей и т.д.

В главе 3 приводилось несколько примеров, в которых строки сравнивались с номерами деталей. Например, в упр. 3.4 присутствует следующее выражение.

...WHERE PI = Р2



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

...WHERE Р# = Р (Р2 )

Теперь операция сравнения является корректной.

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

Величины, расположенные слева и справа от операторов < , > и = , должны быть одного и того же типа.

Величины, расположенные слева и справа от оператора присвоения := , должны быть одного и того же типа.

Разумеется, при необходимости для явного преобразования типов можно воспользоваться так называемыми операторами CAST, как, например, показано ниже.

CAST AS RATIONAL ( 5 )

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

Заключительные замечания

Из всего вышесказанного о поддержке типов данных можно сделать несколько выводов. Наиболее важные из них приводятся ниже.

Во-первых, наиболее важно то, что теперь система может определить, какие выражения являются допустимыми, а какие нет, и установить тип результата выполнения любого допустимого выражения.

Во-вторых, общая совокупность всех типов данных определенной базы данных является замкнутым множеством. Это означает, что тип результата выполнения любого допустимого выражения принадлежит этой совокупности. В частности, если операторы сравнения являются допустимыми, то этому замкнутому множеству обязательно должен принадлежать тип boolean или значение true!

В-третьих, тот факт, что системе известны типы результатов выполнения всех допустимых выражений, означает, в частности, что системе известно и то, какие операции присвоения и сравнения допустимы.



в завершение этого раздела приведем важный факт, который пригодится нам в будущем. Мы сказали, что домен - это тип данных, системный или определенный пользователем, с произвольной внутренней структурой и что к значениям этого типа применимы только определенные для него операторы (внутреннее представление типа скрыто от пользователя). Теперь, если переключиться на объектно-ориентированные системы, можно обнаружить, что фундаментальное понятие таких систем, класс объектов, - это тип данных, системный или определенный пользователем, с произвольной внутренней структурой и что к значениям этого типа применимы только определенные для него операторы (внутреннее представление типа скрыто от пользователя)... Другими словами, домены и классы объектов - это одно и то же\ Данный факт является звеном, связующим две технологии - объектную и релящюнную. Подробно этот важный вопрос изучается в главе 25.

5.3. Значения отношений

Как уже говорилось в главе 3, следует четко различать собственно отношения и переменные-отношения (т.е. переменные, значениями которых являются отношения). В этом разделе рассматриваются значения отношений (для краткости- просто отношения). Переменные-отношения будут рассмотрены в следующем разделе. Прежде всего дадим точное определение термина отношение.

Пусть задано множество из п типов или доменов Г; (/ = 1,2, ... , п), причем все они необязательно должны быть различными. Тогда г будет отношением, определенным на этих типах, если оно состоит из двух частей: заголовка и тела, где:

а) заголовок- это множество из п атрибутов вида А\.Т\, здесь А\- имена атрибутов (которые должны отличаться одно от другого) отношения г, а 71 - соответствующие имена типов (/ = 1,2, ..., );

б) тело - это множество из m кортежей /; здесь /, в свою очередь, является множеством компонентов вида Ai.Vi, в которых Vj - значение типа 7], т.е. значение атрибута для атрибута А[ в кортеже t(i= 1,2,п).

Значения тип называются соответственно кардинальностью и степенью отношения г. Из этого определения вытекает следующее.

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

2. Говорят, что атрибут Ai имеет тип Т\ или (иногда) определен на типе Т\. Отметим, что любое число различных атрибутов из одного отношения или из различных отношений может быть одного и того же типа (см. рис. 3.8 в главе 3, рис. 4.5 и рис. 4.6 в главе 4).

3. В любой заданный момент могут существовать значения определенного типа, не представленные в базе данных как значение одного из атрибутов этого типа. Например, значение Р8 может быть номером некоторой детали, хотя на рис. 3.8 детали с номером Р8 нет.

Заголовок еще иногда называют схемой (отношения). Используется также термин содержание (intension). В этом случае тело называется расширением (extention).



1 ... 41 42 43 [ 44 ] 45 46 47 ... 348

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