Три манифеста баз данных ретроспектива и перспективы
1942e8f8

Определение новых базовых типов данных


IUS позволяет вводить новые базовые типы данных. При этом можно использовать как встроенные в IUS методы доступа и хранения, так и определять новые. Для начала рассмотрим способ создания новых базовых типов с использованием встроенных механизмов хранения.

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

IUS позволяет построить новый базовый тип данных, основанный на существующем типе, но обеспечивающий автоматическое преобразование к нужному значению. Сами типы вводятся следующими операторами:

CREATE DISTINCT TYPE usd AS MONEY;

CREATE DISTINCT TYPE euro AS MONEY;

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

CREATE FUNCTION usd_to_euro (v usd) RETURNS euro; . . .

CREATE FUNCTION euro_to_usd (v euro) RETURNS usd; . . .

CREATE IMPLICIT CAST (usd AS euro WITH usd_to_euro);

CREATE IMPLICIT CAST (euro AS usd WITH euro_to_usd);

После этого можно сравнивать значения типов usd и euro , полученные из разных таблиц, не вызывая явно функцию преобразования. Такое решение существенно снижает возможность внесения ошибок, связанных с преобразованием значений.82

Другой причиной, по которой может возникнуть необходимость во введении нового базового типа данных – это принципиальное отсутствие такого типа. Для этого поддерживается механизм определения типов со скрытой структурой (Opague Types ). Типы со скрытой структурой являются абстрактными в строгом смысле этого слова. IUS лишен какой-либо информации о внутреннем устройстве этих типов и может манипулировать соответствующими значениями только посредством предоставленных разработчиком функций.
Чтобы определить тип со скрытой структурой, необходимо выполнить следующую последовательность действий:

описать на языке C (или другом внешнем языке) структуру определяемых объектов;

написать на языке C (или другом внешнем языке) вспомогательные функции, вызываемые сервером СУБД;

зарегистрировать определяемый тип в базе данных посредством оператора CREATE OPAQUE TYPE;

зарегистрировать вспомогательные функции посредством операторов CREATE FUNCTION и CREATE CAST;

предоставить права доступа к определяемому типу и его вспомогательным функциям посредством оператора GRANT;

написать требующиеся для приложения дополнительные функции, которые можно вызывать средствами SQL, и зарегистрировать их;

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


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