Типы данных
Любые данные, используемые в
программировании, имеют свои типы данных.
Важно! Реляционная модель требует, чтобы типы используемых данных
были простыми.
Для уточнения этого утверждения
рассмотрим, какие вообще типы данных обычно рассматриваются в программировании.
Как правило, типы данных делятся на три группы:
- Простые типы данных.
- Структурированные типы данных.
- Ссылочные типы данных.
Простые типы данных
Простые, или атомарные, типы данных не обладают внутренней структурой. Данные
такого типа называют скалярами. К простым типам данных относятся
следующие типы:
- Логический.
- Строковый.
- Численный.
Различные языки программирования могут
расширять и уточнять этот список, добавляя такие типы как:
- Целый.
- Вещественный.
- Дата.
- Время.
- Денежный.
- Перечислимый.
- Интервальный.
- И т.д.…
Конечно, понятие атомарности довольно
относительно. Так, строковый тип данных можно рассматривать как одномерный
массив символов, а целый тип данных - как набор битов. Важно лишь то, что при
переходе на такой низкий уровень теряется семантика (смысл) данных.
Если строку, выражающую, например, фамилию сотрудника, разложить в массив
символов, то при этом теряется смысл такой строки как единого целого.
Структурированные типы данных
Структурированные типы данных предназначены для задания сложных
структур данных. Структурированные типы данных конструируются из составляющих
элементов, называемых компонентами, которые, в свою очередь, могут обладать
структурой. В качестве структурированных типов данных можно привести следующие
типы данных:
- Массивы
- Записи (Структуры)
С математической точки зрения массив
представляет собой функцию с конечной областью определения. Например,
рассмотрим конечное множество натуральных чисел
называемое множеством индексов.
Отображение
из множества во
множество вещественных чисел задает
одномерный вещественный массив. Значение этой функции для некоторого значения
индекса называется
элементом массива, соответствующим .
Аналогично можно задавать многомерные массивы.
Запись (или структура) представляет собой
кортеж из некоторого декартового произведения множеств. Действительно, запись представляет
собой именованный упорядоченный набор элементов ,
каждый из которых принадлежит типу .
Таким образом, запись есть
элемент множества .
Объявляя новые типы записей на основе уже имеющихся типов, пользователь может
конструировать сколь угодно сложные типы данных.
Общим для структурированных типов данных
является то, что они имеют внутреннюю структуру, используемую на том
же уровне абстракции, что и сами типы данных.
Поясним это следующим образом. При работе
с массивами или записями можно манипулировать массивом или записью и как с
единым целым (создавать, удалять, копировать целые массивы или записи), так и
поэлементно. Для структурированных типов данных есть специальные функции -
конструкторы типов, позволяющие создавать массивы или записи из элементов более
простых типов.
Работая же с простыми типами данных,
например с числовыми, мы манипулируем ими как неделимыми целыми объектами.
Чтобы "увидеть", что числовой тип данных на самом деле сложен
(является набором битов), нужно перейти на более низкий уровень абстракции. На
уровне программного кода это будет выглядеть как ассемблерные вставки в код на
языке высокого уровня или использование специальных побитных операций.
Ссылочные типы данных
Ссылочный тип данных (указатели) предназначен
для обеспечения возможности указания на другие данные. Указатели характерны для
языков процедурного типа, в которых есть понятие области памяти для хранения
данных. Ссылочный тип данных предназначен для обработки сложных изменяющихся
структур, например деревьев, графов, рекурсивных структур.
Типы данных, используемые в реляционной модели
Собственно, для реляционной модели данных тип используемых данных не важен. Требование, чтобы тип данных был простым, нужно понимать так, что в реляционных операциях не должна учитываться внутренняя структура данных. Конечно, должны быть описаны действия, которые можно производить с данными как с единым целым, например, данные числового типа можно складывать, для строк возможна операция конкатенации и т.д.
С этой точки зрения, если рассматривать массив, например, как единое целое и не использовать поэлементных операций, то массив можно считать простым типом данных. Более того, можно создать свой, сколь угодно сложных тип данных, описать возможные действия с этим типом данных, и, если в операциях не требуется знание внутренней структуры данных, то такой тип данных также будет простым с точки зрения реляционной теории. Например, можно создать новый тип - комплексные числа как запись вида , где . Можно описать функции сложения, умножения, вычитания и деления, и все действия с компонентами и выполнять только внутри этих операций. Тогда, если в действиях с этим типом использовать только описанные операции, то внутренняя структура не играет роли, и тип данных извне выглядит как атомарный.
Именно так в некоторых пост-реляционных СУБД реализована работа со сколь угодно сложными типами данных, создаваемых пользователями.