Воссоединение SQL в 1995 г. люди, проекты, политика

       

Новые типы данных


В SQL:1999 имеется четыре новых типа данных (хотя для одного из них имеются некоторые опознаваемые варианты). Первым из этих типов является тип LARGE OBJECT, или LOB. Это тип с вариантами: CHARACTER LARGE OBJECT (CLOB) и BINARY LARGE OBJECT (BLOB). CLOB'ы ведут себя во многом подобно символьным строкам, но ограничены тем, что запрещено их использование в предикатах PRIMARY KEY и UNIQUE, в FOREIGN KEY, а также в сравнениях, отличных от чистых равенства или неравенства. Для BLOB'ов действуют аналогичные ограничения. (Косвенным образом, LOB'ы нельзя также использовать в разделах GROUP BY и ORDER BY.) Обычно приложениям не требуется пересылать весь LOB целиком в базу данных и из базы данных (конечно, после исходного их размещения); следует манипулировать LOB-значениями через специальный тип на стороне клиента, называемый LOB-локатором. В SQL:1999 локатор - это уникальное двоичное значение, которое действует как вид суррогата значения, сохраняемого в базе данных; локаторы могут использоваться в операциях (таких, как SUBSTRING) без привлечения накладных расходов для пересылки всего LOB-значения через интерфейс клиента и сервера.

Другим новым типом является тип BOOLEAN, который дает возможность в SQL непосредственно записывать истинностные значения true, false и unknown. Сложные комбинации предикатов можно также выразить способами, которые в чем-то более дружественны к пользователям, чем этого можно добиться обычными методами реструктуризации:

WHERE COL1 > COL2 AND COL3 = COL4 OR UNIQUE (COL6) IS NOT FALSE

В SQL:1999 имеются также два новых составных типа: ARRAY и ROW. Тип ARRAY позволяет хранить коллекции данных непосредственно в столбце таблицы базы данных. Например, определение

WEEKDAYS VARCHAR (10) ARRAY[7]

позволило бы хранить названия всех семи дней недели в одной строке базы данных. Означает ли это, что SQL:1999 допускает базы данных, не удовлетворяющие первой нормальной форме? Действительно, допускает, в том смысле, что разрешаются "повторяющиеся группы", запрещаемые первой нормальной формой. (Однако некоторые утверждают, что тип ARRAY в SQL:1999 всего лишь допускает хранение информации, которую можно декомпозировать, во многом подобно тому, как функция SUBSTRING может декомпозировать символьные строки -- и поэтому в действительности не противоречит духу первой нормальной формы.)


Тип ROW в SQL:1999 является расширением (анонимного) строчного типа, который всегда был в SQL и от наличия которого язык зависел. Этот тип обеспечивает разработчиков баз данных дополнительной возможностью хранения структурированных значений в одном столбце базы данных:

CREATE TABLE employee ( EMP_ID INTEGER, NAME ROW ( GIVEN VARCHAR (30), FAMILY VARCHAR (30) ), ADDRESS ROW ( STREET VARCHAR (50), CITY VARCHAR (30), STATE CHAR (2) ), SALARY REAL )

SELECT E.NAME.FAMILY FROM employee E

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

В SQL:1999 добавлена еще одна связанная с типами данных возможность, называемая "индивидуальными типами" (distinct types). Учитывая, что в общем случае маловероятно, что в приложении потребуется непосредственно сравнивать, например, размер обуви служащего со значением его или ее IQ, программистам SQL позволяется объявить типы SHOE_SIZE и IQ, основанные на INTEGER, и запрещается непосредственное перемешивание этих двух типов в выражениях. Так, выражение вида

WHERE MY_SHOE_SIZE > MY_IQ

(где имя переменной соответствует ее типу данных) было бы опознано как синтаксическая ошибка. Каждый из этих двух типов может быть "представлен" как INTEGER, но SQL не разрешает перемешивать их в выражениях -- и не один из них не допускает, скажем, умножения на INTERGER:

SET MY_IQ = MY_IQ * 2

Взамен этого в программах должно явно выражаться продуманное намерение допускать такое смешение:

WHERE MY_SHOE_SIZE > CAST (MY_IQ AS SHOE_SIZE)

SET MY_IQ = MY_IQ * CAST (2 AS IQ)

В дополнение к этим типам в SQL:1999 также введены определяемые пользователями типы, но они попадают в список объектно-ориентированных свойств.


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