Иллюстрированный самоучитель по SQL для начинающих

Основы SQL

Типы коллекций

После того как с выходом SQL: 1999 была разрушена реляционная строгость, стало возможным использование таких типов данных, которые нарушают первую нормальную форму. Теперь поля могут содержать не один, а целую коллекцию объектов. Тип ARRAY (массив) впервые появился уже в SQL: 1999, а вот тип MULTISET (мультимножество) – это новинка SQL:2003.

Можно сравнить две коллекции между собой только в том случае, если они содержат один и тот же тип данных, либо ARRAY, либо MULTISET, и сравниваемые типы элементов. Поскольку массивы имеют определенный порядок элементов, соответствующие элементы массивов можно сравнить. Мультимножества такого порядка не имеют, однако их также можно сравнить, но только в том случае, если для одного из двух сравниваемых мультимножеств существует нумерация, которой должна соответствовать нумерация другого мультимножества.

Типы ARRAY

Тип данных ARRAY (массив) нарушает первую нормальную форму (1НФ), но делает это иначе, чем тип ROW. Тип ARRAY, относящийся к типу коллекций, в действительности не является отдельным типом данных в том же смысле, что и типы CHARACTER или NUMERIC. Тип ARRAY просто дает возможность одному из других типов иметь множество значений внутри одного поля в таблице. Скажем, например, что для вашей организации важно поддерживать контакт со своими клиентами, находятся ли они на работе, дома или в дороге. Поэтому среди данных о клиенте может потребоваться и несколько телефонных номеров. Такую возможность можно реализовать, объявив атрибут Phone (телефон) массивом, как показано в следующем коде:

CREATE TABLE CUSTOMER (
CustID INTEGER PRIMARY KEY,
LastName CHARACTER VARYING (25),
FirstName CHARACTER VARYING (20),
Address addr_typ
Phone CHARACTER VARYING (15) ARRAY [3]
);

Это дает возможность хранить в таблице CUSTOMER (клиент) до трех телефонных номеров каждого клиента. Три телефонных номера являются примером повторяющейся группы. Если следовать классической теории реляционных баз данных, то такие группы делать нельзя, однако они – это только один из нескольких примеров нарушения правил со стороны SQL: 1999. Когда доктор И.Ф. Кодд впервые провозгласил свои правила нормализации, то ради целостности данных он пожертвовал функциональной гибкостью. SQL: 1999 вернул назад часть этой гибкости – впрочем, за счет некоторого усложнения структуры. Такое усложнение может привести к ослаблению целостности данных. Это вам напоминание на тот случай, если вы еще не полностью осознаете последствия всех действий, выполняемых с базой данных. Массивы упорядочены таким образом, что каждый элемент массива связан только с одной порядковой позицией в массиве.

Тип MULTISET

Тип данных MULTISET (мультимножество) – это неупорядоченная коллекция. Определенные элементы мультимножества могут быть не связаны, поскольку им не назначается определенная порядковая позиция в мультимножестве.

Типы REF

Типы REF в основную часть SQL не входят. Это значит, что какая-либо система СУБД, совсем не использующая эти типы данных, все равно может считаться соответствующей стандарту SQL:2003. Тип REF не является отдельным типом данных в том же смысле, что и типы CHARACTER и NUMERIC. На самом деле это указатель на элемент данных, на данные типа ROW или на данные абстрактного типа, размещаемого в строке таблицы. Разыменовывая указатель, можно получить требуемое значение. Не беспокойтесь, если запутались, – в этом вы не одиноки. Использование типов REF требует практического знания принципов объектно-ориентированного программирования (ООП). В книге я старался не слишком глубоко погружаться в эту муть. Поскольку типы REF не входят в основную часть SQL, вам будет лучше совсем их не использовать. Если нужна максимальная переносимость с одних платформ СУБД на другие, то не следует выходить за пределы основной части SQL.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.