Главная » SQL, Базы данных » ГЕНЕРАТОРЫ-ТИПОВ и реляционная модель

0

Теперь обратимся к изучению типов, которые не определены с помощью оператора TYPE, а получены путем вызова некоторого генератора типа (type  generator). В общем, генератор типа — это просто особый вид оператора; его специфика состоит в том, что он возвращает тип, скажем, вместо простого  скалярного значения. Например, в обычном языке программирования можно применить следующую конструкцию.

VAR SALES ARRAY INTEGER [12] ;

Эта конструкция позволяет определить переменную SALES, допустимыми значениями которой являются одномерные массивы из 12 целых чисел. В этом примере выражение ARRAY INTEGER [12] может рассматриваться как вызов  генератора типа ARRAY, который возвращает массив конкретного типа. Данный конкретный тип массива является сгенерированным типом. Из этого следуют приведенные ниже выводы.

1.  Генераторы типов известны в литературе под многими разными названиями, включая конструкторы типов, параметризованные типы, полиморфные типы, шаблоны типов и универсальные типы. В данной книге принят термин генератор типа.

2.  Сгенерированные типы являются вполне допустимыми типами и могут приме няться везде, где допустимо использование обычных "несгенерированных" типов. Например, может быть определена некоторая переменная отношения, имеющая определенный атрибут типа ARRAY  INTEGER  [ 12 ]. В отличие от этого, сами ге нераторы типов как таковые не являются типами.

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

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

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

Примечание. Фактически здесь допущено некоторое упрощение. В частности, мы не исключаем возможности для пользователей определять свои собственные генераторы типов. Но такая возможность в данной книге больше не рассматривается.

Итак, сгенерированные типы, безусловно, имеют возможные представления (сокращенно possrep — possible representation), которые, вполне очевидно, являются производными, во-первых, от универсального возможного  представления, применяемого к рассматриваемому генератору типа, и, во-вторых, от конкретного возможного представления (представлений) видимого  пользователю  компонента (компонентов) конкретного рассматриваемого  сгенерированного типа. Например, в случае генератора типа ARRAY INTEGER  [ 12 ] имеют место описанные ниже особенности.

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

Видимые пользователю компоненты представляют собой именно те 12 элементов массива, которые были только что упомянуты, и они имеют то возможное представление (представления), которое определено для типа INTEGER.

Аналогичным образом, должны быть предусмотрены операторы,  предоставляющие необходимые функциональные возможности селектора и  оператора ТНЕ_. Например, выражение

ARRAY     INTEGER     (    2,                                        5,                                        9,                                        9,                                        15,                                        27,                                        3 3 ,                                        32,                                        2 5 ,                                        19,                                        5,                                        1    )

которое по сути представляет собой литерал с определением массива, может использоваться для задания конкретного значения типа ARRAY INTEGER [ 12 ] (иными словами, "для применения функциональных средств селектора"). Аналогичным образом, следующее выражение

SALES   [3]

может использоваться для доступа к третьему компоненту (т.е. к третьему элементу массива) того значения массива, которое оказалось текущим значением переменной массива SALES (иными словами, "для применения функциональных средств оператора ТНЕ_"). Это выражение может также служить в качестве псевдопеременной.

186    Часть П. Реляционная модель

Применимы также операторы присваивания и сравнения для проверки на равенство.

Например, ниже приведен допустимый оператор присваивания.

SALES   :=   ARRAY   INTEGER   (   2,    5,    9,    9,    15,    27,    33,    32,    25, 19,    5,    1   )    ;

А в данном случае определен допустимый оператор проверки на равенство.

SALES     =   A R R AY     I NTEGER                                        (     2,                                         5,                                         9,                                         9,                                         15,                                         2 7 ,                                         3 3 ,                                         3 2 ,                                         25,                                         19,     5,

1     )

Примечание. Любой конкретный генератор типа может также иметь множество связанных с ним универсальных ограничений и операторов (они являются универсальными в том смысле, что рассматриваемые ограничения и операторы  применяются к любому конкретному типу, полученному с помощью вызова рассматриваемого генератора типа). Например, в случае генератора типа ARRAY имеют место описанные ниже особенности.

■  Может быть предусмотрено такое универсальное ограничение, что нижний индекс

lower не должен быть больше верхнего индекса upper.

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

(В действительности, упомянутые выше селекторы, операторы ТНЕ_, а также операторы присваивания и сравнения на равенство также фактически происходят от некоторых универсальных операторов.)

В заключение отметим, что двумя генераторами типов, которые имеют особую важность в мире реляционных баз данных, являются TUPLE И RELATION. ЭТИ  операторы подробно рассматриваются в следующей главе.

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии