Системы обработки информации - язык баз данных SQL

Конструктор типов мультимножества


В стандарте SQL:1999 допускалась возможность использования только одного вида коллекций – динамических массивов с элементами любого допустимого в SQL типа, кроме типа массива. Тип массива образовывался с помощью конструктора типов массивов ARRAY.

Стандарт SQL:2003 расширяет возможности использования коллекций в двух важных направлениях. Во-первых, вводится новый конструктор типов мультимножеств MULTISET. Во-вторых, типом элементов любого типа коллекций теперь может быть любой допустимый в SQL тип данных, кроме самого конструируемого типа коллекции. Оба эти расширения качественно влияют на возможную природу организации SQL-ориентированных баз данных и на способы работы с этими базами данных. Мы остановимся на этом несколько более подробно в конце данного подраздела после обсуждения конкретных свойств типов мультимножеств.

При определении местоположения (например, столбца таблицы) типа мультимножеств используется конструкция dt

MULTISET, где dt задает тип данных элементов конструируемого типа мультимножеств. Значениями типа мультимножеств являются мультимножества, т.е. неупорядоченные коллекции элементов одного и того же типа, среди которых допускаются дубликаты. Например, значениями типа INTEGER MULTISET являются мультимножества, элементами которых являются целые числа. Примером такого значения может быть мультимножество {12, 34, 12, 45, -64}.

В отличие от массива, мультимножество является неограниченной коллекцией; при конструировании типа мультимножеств не указывается предельная кардинальность значений этого типа. Однако это не означает, что возможность вставки элементов в мультимножество действительно не ограничена; стандарт всего лишь не требует наличия границы. Ситуация аналогична той, которая возникает при работе с таблицами, для которых в SQL не объявляется максимально допустимое число строк.2

Значения-мультимножества создаются путем использования специальной конструкции SQL:2003, называемой конструктором значений-мультимножеств (multiset value constructor). Эта конструкция определяется следующими синтаксическими правилами:


multiset_value_constructor ::=
multiset_value_constructor_by_enumeration>

|

multiset_value_constructor_by_query>

|

table_value_constructor_by_query

multiset_value_constructor_by_enumeration ::=
MULTISET left_bracket value_expression_commalist right_bracket



multiset_value_constructor_by_query ::=
MULTISET ( query_expression)

table_value_constructor_by_query ::=
TABLE ( query_expression> )

Например, следующие выражения являются допустимыми значениями-мультимножествами: MULTISET [14, 16, 17] или MULTISET (SELECT DEPT_NO FROM EMP). Второй случай демонстрирует возможность преобразования таблицы в мультимножество3. Допускается и использование значения-мультимножества в качестве ссылки на таблицу в разделе FROM запроса. Для этого к значению-мультимножеству применяется операция UNNEST. Вот простой пример допустимого запроса:

SELECT T.A, T.A + 2 AS PLUS_TWO

FROM UNNEST(MULITISET [14,16,17]) AS T(A)

В результате выполнения запроса будет получена таблица

A

PLUS_TWO

14

16

16

18

17

19

Для типов мультимножеств поддерживаются операции для преобразования типа значения-мультимножества к типу массивов или другому типу мультимножеств с совместимым типом элементов (операция CAST), для удаления дубликатов из мультимножества (функция SET), для определения числа элементов в заданном мультимножестве (функция CARDINALITY), для выборки элемента мультимножества, содержащего в точности один элемент (функция ELEMENT). Кроме того, для мультимножеств обеспечиваются операции объединения (MULTISET UNION), пересечения (MULTISET INTERSECT) и определения разности (MULTISET EXCEPT). Каждая из операций может выполняться в режиме с сохранением дубликатов (режим ALL) или с устранением дубликатов (режим DISTINCT).

Наконец, введены три новые агрегатные функции. Агрегатная функция COLLECT создает мультимножество из значений аргумента в каждой строке группы строк. Функция FUSION производит объединение значений-мультимножеств из всех строк группы строк. Функция INTERSECT производит пересечение значений-мультимножеств из всех строк группы строк. Покажем на простом примере, как работают эти агрегатные функции. Пусть имеется таблица PROGRAMMERS следующего вида:



PROGRAMMER

FAVOURITE_LANGUAGES

‘Smith’

MULTISET [‘Java’, ‘Pascal’, ‘Perl’]

‘Brown’

MULTISET [‘Python’, ‘C++’, ‘Java’]

‘Scott’

MULTISET [‘Python’, ‘Java’]

Тогда в результате запроса

SELECT COLLECT(PROGRAMMER) AS ALL_PROGRAMMERS,
FUSION(FAVOURITE_LANGUAGES) AS ALL_LANGUAGES
INTERSECT(FAVOURITE_LANGUAGES) AS COMMON_LANGUAGES

FROM PROGRAMMERS

будет получена следующая таблица с одной строкой, все три столбца которой содержат значения-мультимножества:

ALL_PROGRAMMERS

ALL_LANGUAGES

COMMON_LANGUAGES

MULTISET

[‘Smith’,

‘Brown’

‘Scott’

MULTISET

[‘Java’,

‘Pascal’,

‘Perl’

‘Python’,

‘C++’,

‘Java’

‘Python’,

‘Java’]

MULTISET

[‘Java’]

При использовании мультимножеств в условных выражениях можно применять следующие предикаты:



  • сравнения по равенству (“=”);


  • сравнения по неравенству (“<>”);


  • проверки того, что заданное значение является элементом мультимножества (MEMBER);


  • проверки того, что одно мультимножество входит в другое мультимножество (SUBMULTISET);



  • проверки того, что мультимножество содержит дубликаты (IS A SET).

    После короткого рассмотрения особенностей типов мультимножеств в SQL:2003 обсудим, почему мы считаем отмеченные в начале подраздела расширенные возможности работы с типами коллекций принципиально важными. Дело в том, что даже при наличии определяемых пользователями типов данных и типов массивов SQL:1999 (см. [3]) не предоставлял полных возможностей для преодоления исторически присущего реляционной модели данных вообще и SQL, в частности, ограничения “плоских таблиц”. Теперь, после появления конструктора типов мультимножеств и устранения ограничений на тип данных элементов коллекции, это историческое ограничение полностью ликвидировано.



    Конечно же, мультимножество, типом элементов которого является анонимный строчный тип4

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

    Другой вопрос, принесут ли эти новые возможности существенную практическую пользу разработчикам и пользователям SQL-ориентированных баз данных? Как это обычно бывает в случае SQL, на этот вопрос трудно ответить однозначно. Скорее всего, большинство разработчиков, традиционно работающих в SQL-среде, просто не будет использовать новые средства, как не использует и объектно-реляционные расширения SQL. Но возможно, что расширенная поддержка типов коллекций привлечет к SQL-ориентированным СУБД новую категорию разработчиков и пользователей из числа, например, тех, которые традиционно использовали объектно-ориентированную или какую-либо другую среду, отличную от SQL.

    Между прочим, как кажется автору этой статьи, на введение типов мультимножеств в SQL:2003 оказали влияние работы Дейта и Дарвена . Конечно, SQL:2003 остается языком SQL со всеми присущими ему недостатками. Конечно, предложения Третьего манифеста, выглядят изящнее и стройнее, чем то, что появилось в SQL. Но похоже, что с использованием SQL:2003 теперь можно добиться почти тех же результатов, которые обеспечило бы применение какого-либо языка D.


    Содержание раздела