Скачиваний:
79
Добавлен:
02.05.2014
Размер:
2.54 Mб
Скачать

22.5. Интервальные типы

В предыдущем разделе рассуждения об интервалах основывались, по существу, на интуиции. Теперь необходимо изложить этот подход более формально. Отметим, что зернистость интервального значения [d04,dl0]— "дни". Точнее, можно сказать, что зернистость относится к типу DATE, т.е. мы подразумеваем, что единица измерения зер­нистости принадлежит к обычному семейству типов даты и времени, а его размер­ность— "день" (в противоположность, скажем, "часам", "миллисекундам" или "месяцам"). Исходя из данного замечания можно точно определить тип интервального значения [d04,dl0].

S DURING

S#

SNAME

STATUS

CITY

DURING

SI

Smith

20

London

[d04,dl0\

S2

Jones

10

Paris

[d07,dl0]

S2

Jones

10

Paris

[d02,d04]

S3

Black

30

Paris

[d03,dl0]

S4

Clark

20

London

[d04,dl0]

S5

Adams

30

Athens

\d02,dl0~\

SP_DURING

S#

P#

DURING

SI

PI

[d04,dW]

SI

P2

[d05,dl0]

SI

P3

[d09,dW]

SI

P4

[d05,dl0]

SI

P5

[d04,dl0]

SI

P6

[dOe.dlO]

S2

PI

[d02,d04]

S2

P2

[d03.d03]

S2

PI

[dOS.dW]

S2

P2

[d09,dl0]

S3

P2

[d08,dl0]

S4

P2

[d06,d09]

S4

P4

[d04,d08]

S4

P5

[d05,dl0]

Рис. 22.4. База данных поставщиков и деталей (значения для примера): окончательный вариант полной хронологической версии с использованием интервачов

■ Во-первых, это, конечно, некоторый интервальный тип. Только одного этого факта достаточно, чтобы определить операторы, которые применимы к рассмат­риваемому интервальному значению (точно так, когда говорят, например, что, ес­ли значение г относится к типу отношение, этого достаточно, чтобы определить операторы (JOIN и т.д.), которые применимы к значению г).

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

Таким образом, тип значения [d04,dl0] — INTERVAL (DATE), где

а) INTERVAL — генератор типа, подобный RELATION в языке Tutorial D (см. главу 5) или массиву array в обычном языке программирования; этот генератор типа по- зволяет определить множество конкретных типов интервалов, которые будут рас- смотрены далее;

б) DATE — точечный тип данного интервального типа.

Следует подчеркнуть, что в общем случае точечный тип РТ определяет тип и точ­ность начальной и конечной точек, а также всех точек между двумя последними, ко­торые имеют значения типа INTERVAL {РТ). (В случае типа DATE точность, конечно, за­дается неявно.)

Замечание. В главе 4 уже отмечалось, что точность не является частью соответст­вующего типа и должна задаваться ограничением целостности. Например, в объявле­ниях DECLARE X TIMESTAMP(3) и DECLARE У TIMESTAMP(6) атрибуты X и У имеют один и тот же тип, но зависят от различных ограничений (согласно этим ограничениям в ат­рибуте X должны содержаться значения в миллисекундах, тогда как значения атрибута Y измеряются в микросекундах). Поэтому, строго говоря, чтобы сказать, например, что TIMESTAMP(3) и DATE— это допустимые точечные типы, необходимо объединить два понятия, которые лучше было бы иметь отдельными понятиями. Вместо этого, пожа­луй, было бы предпочтительнее определить два типа Tl и Т2, оба с возможными пред­ставлениями типа временных отметок TIMESTAMP, но с различными "ограничениями точности". Затем можно сказать, что допустимыми точечными типами являются типы, Т1 и Т2 (а не, например, TIMESTAMP(3) и TIMESTAMP(6)). Однако для простоты мы сле­дуем в этой главе общепринятой практике и условно считаем, что точность действи­тельно является частью типа.

Какие свойства должен иметь тип, чтобы он был допустимым как точечный тип? Прежде всего, нам известно, что интервал обозначается своими начальной и конечной точками и содержит, по крайней мере неформально, множество точек. Если можно опре­делить полное множество точек, задав просто начальную точку s и конечную точку е, необходимо, чтобы можно было определить точку, которая непосредственно следует (в некотором установленном порядке) за точкой s. Такую непосредственно следующую точку называют наследником или преемником точки s. Условимся для простоты, что в качестве обозначения такой точки будет использоваться выражение s+1. Тогда функция, с помощью которой определяется точка s+1 по точке s, называется функцией следова­ния для данного точечного типа (и точности). Функция следования должна быть опреде­лена для каждого значения точечного типа, за исключением точки, определенной как "последняя". (Имеется и точка, определяемая как "первая", которая не является следую­щей за какой-либо точкой.)

Если точка s+1 определена как следующая за точкой s, необходимо установить, не следует ли точка s+1 за точкой е, в соответствии с тем же принятым порядком следова­ния для точечного типа. Если это не так, точка s+1 действительно принадлежит интерва­лу [s,e] и нужно переходить к следующей точке s+2. Этот процесс мы можем продол­жать до тех пор, пока не перейдем к первой точке s+л, которая следует за точкой е. В ре­зультате такого прохода будут перебраны все точки интервала [ s, е].

Поскольку точка s+л фактически является преемником точки е, т.е. в действитель­ности непосредственно следует за точкой е, можно утверждать, что единственное свойство, согласно которому тип РТ должен быть допустимым как точечный тип, рав­носильно тому, что для него должна быть определена функция следования. Короче го­воря, должно быть установлено общее упорядочение для значений типа РТ (поэтому можно считать, что для всех пар значений РТ определены и доступны обычные опера­торы сравнения "<", ">" и т.д.).

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

Дадим, наконец, точное определение.

■ Пусть РТ— точечный тип. Тогда интервал (или значение интервала) i типа INTERVAL {РТ) — это скалярное значение, для которого определены два унарных оператора (START и END) и один бинарный оператор (IN), такие, что

a) START (i) и END (i) возвращают значения типа РТ;

б)START(i) < END(i);

в) пусть р — некоторое значение типа РТ; тогда р IN i истинно, если оба сравне­ния, START (i) < р и р < END (i), дают в результате значения истина.

Обратите внимание на обращение в этом определении к некоторой функции следова­ния для типа РТ. Также отметим, что начальная и конечная точки составляют возможное представление (в смысле главы 5) для значений типа INTERVAL (РТ) соответственно (поэтому в языке Tutorial D можно было бы обращаться к точкам START и END как THE_START и THE END). И наконец заметим, что по определению интервалы всегда непус­тые, т.е. в любом заданном интервале всегда имеется по крайней мере одна точка.

Следует подчеркнуть, что значение типа INTERVAL(Pf) является скалярным, т.е. оно не имеет компонентов, которые видны пользователю. Действительно, оно имеет некото­рое возможное представление (на самом деле даже несколько возможных представлений, как мы убедились в предыдущем разделе), и эти возможные представления имеют види­мые для пользователя компоненты, но само значение интервала таких видимых компо­нентов не имеет. Иначе говоря, это означает, что интервалы инкапсулированы.

Соседние файлы в папке Дейт К. Дж. Введение в системы баз данных [7 издание]