Объектно-реляционные расширения
Принципиальные расширения в поддержке больших объектов и
триггеров INSTEAD-OF могут быть лицензированы отдельно от
основной части сервера Oracle8 в виде Object Option. Что касается
дополнительных встроенных типов данных, то Oracle предлагает
четыре расширенных реляционных типа данных: большие объекты с
улучшенным управлением содержимым; два вида типов данных
коллекции - VARRAY и вложенные таблицы; расширенный тип данных,
реализующий указатели.
Два типа коллекций предназначены для поддержки нескалярных
доменов. Типы категории VARRAY позволяют хранить массивы в
столбцах таблиц; для большинства типов данных Oracle8, включая
объектные типы, их значения могут храниться в VARRAY. Ряд
ограничений в VARRAY затрудняет их применение в некоторых целях.
Например, должен быть объявлен максимальный размер массива, и в
настоящее время такие массивы и их содержимое не полностью
доступны из SQL (хотя доступ к ним возможен из PL/SQL или кода
приложения на 3GL).
Другим типом коллекции являются вложенные таблицы. Как следует из
названия, вложенные таблицы позволяют хранить в столбцах
табличные значения. В отличие от VARRAY, вложенные таблицы
полностью доступны из SQL.
Наконец, имеется расширенный тип данных, реализующий указатели,
которые в Oracle8 называются REF. REF реализуются с
использованием генерируемых системой объектных идентификаторов;
указатели на объекты могут храниться в объектных таблицах, и на
основе указателей возможна навигация. Указателями можно
манипулировать и производить навигацию из SQL с использованием
ключевых слов REF, DEREF и VALUE. Указатели играют важную роль
при выполнении операций объектного кэша клиента.
Объектные типы. Система объектных типов Oracle8 позволяет
определять и хранить именованные структуры данных, например:
CREATE TYPE customer_type AS OBJECT (
name VARCHAR2 (20),
no_of_purchases NUMBER,
MEMBER FUNCTION get_no_of_purchases RETURN NUMBER);
Любой тип Oracle8 может выступать в качестве члена объектного
типа, включая VARRAY, вложенные таблицы и другие объектные типы.
В бета- версиях Oracle8 объектные типы назывались "абстрактными
типами данных" (термин, используемый в проектах SQL3 и в
академических кругах), но позже было решено, что термин
"объектные типы" является более понятным и точным. (На самом
деле, объектные типы Oracle8 представляют собой обобщение
именованных типов строк и абстрактных типов данных SQL3.)
В объектных типах могут определяться методы, реализация которых
может быть представлена на PL/SQL или в виде вызовов функций 3GL.
Методы похожи на хранимые процедуры и могут вызываться из SQL или
PL/SQL для вычисления и получения информации об объектах данного
типа и/или их модификации. Каждый объектный тип имеет по меньшей
мере один метод - конструктор. Это определенная в системе
функция, которая создает объект данного типа. В дополнение к
общим методам, при необходимости могут быть реализованы
специальные методы, меняющие для объектного типа порядок
сортировки и операции сравнения.
Объектные типы можно использовать двумя способами. Во-первых,
с использованием объектного типа можно определить объектные
таблицы, специфицируя тип таблицы целиком:
CREATE TABLE customers OF customer_type
В этом примере каждая строка результирующей таблицы будет
содержать объект типа customer_type с членами-атрибутами,
специфицированными при объявлении этого объектного типа (другими
словами, "name" и "no_of_purchases"). К каждой строке-объекту
Oracle8 добавляет "скрытый" столбец, содержащий генерируемый
системой уникальный идентификатор (ID) объекта. Этот ID можно
использовать в указателях (REF) на объекты таблицы из других
таблиц или реализовывать указатели между объектами этой же
таблицы. При желании столбец ID можно индексировать для более
быстрого поиска REF.
Во-вторых, объектные типы можно использовать для определения
типов столбцов. В этом случае при определении типов столбцов
таблицы имена объектных типов помещаются вместо имен базовых
типов. Например, объявленный выше тип customer_type можно было бы
использовать для определения структурированного столбца
"customer" в обычной таблице. Члены такого "объектного столбца"
доступны из SQL с использованием расширенной точечной нотации,
например, путем выборки my_table.customer.name.
Эти два вида применение объектных типов соответствуют двум
способам отображения структурированных объектов в реляционную
схему.
Объектный кэш клиента. В Oracle8 также обеспечиваются
значительные возможности манипулирования объектами на стороне
клиентских приложений. Объектный кэш клиента может быть
реализован и доступен для манипулирования с использованием
вызовов нового интерфейса OCI (Oracle Call Interface), с
применением прекомпилятора C/C++ со встроенным SQL (приобретается
отдельно), либо на основе библиотеки классов C++ и среды
поддержки времени исполнения, управляемой ожидаемым вскоре
продуктом Oracle Object Database Designer (развитие
Designer/2000).
С использованием интерфейса уровня OCI объекты из объектных
таблиц Oracle8 могут быть загружены в кэш поосле выполнения
запроса на расширенном SQL, выбирающего идентификаторы объектов;
после этого возможно манипулирование объектами. Все изменения
могут быть впоследствии вытолкнуты на сервер. OCI также дает
возможность приложению сохранить указатели на другие объекты,
которые будут подкачиваться в кэш клиента по мере необходимости.
Поддерживается управляемый уровень упреждающего чтения в кэш
объектов, на которые ссылается базовый объект. Эта возможность
похожа на "листание объектов", которое обеспечивается в некоторых
объектных системах баз данных.
Прекомпилятор предоставляет представление более высокого уровня
тех же функциональных возможностей, которые предоставляются
разработчикам традиционных баз данных. Более детальный интерфейс
OCI более подходит для разработчиков приложений.
В Oracle8 обеспечивается компонент Object Type Translator (OTT),
который может генерировать соответствующий С-структуры для
использования клиентскими приложениями при работе с объектным
кэшем.
Поддержка компанией согласованного многоверсионного чтения
расширяется на кэшированные объектные данные и позволяет улучшить
масштабируемость за счет возможности клиентов объектного кэша
работать без запроса блокировок по чтению в базе данных. Каждый
клиент кэша видит свою собственную частную версию базы данных в
той точке, в которой этот клиент начал манипулировать объектами.
В кэше клиента может поддерживаться несколько нитей (thread),
каждая из которых владеет собственной сессией с базой данных и
видит частную порцию кэша, соответствующую собственной транзакции
нити.
Объектные представления. Oracle8 обеспечивает объектные
представления, которые особенно существенны для постепенного
перехода к использованию возможностей объектно-реляционного
подхода и для новых применений существующих баз данных без
изменения их схемы. Объектные представления похожи на
традиционные реляционные представления, но в них могут
использоваться строгая типизация, сложные структуры (не в первой
нормальной форме), методы и возможности ссылок на существующие
реляционные данные.
Многотабличные объектные представления могут быть сделаны
обновляемыми за счет наличия нового вида триггера INSTEAD OF,
который перехватывает команды SQL, направленные на обновление
представления, и выполняет соответствующее действие. Осмысленно
применять такие триггеры и для того, чтобы сделать обновляемым
любое традиционное реляционное представление.
Некоторые простые, но полезные объектные представления являются
обновляемыми по своей природе. Например, с помощью объектного
представления можно представить таблицу customers, состоящую из
нескольких столбцов, каждый из которых содержит фрагмент адреса,
как таблицу, к которой один столбец содержит структурированные
объекты address. Поскольку такие структуры являются обновляемыми,
они легко надстраиваются над существующей схемой.
"Виртуальными объектами", определенными с помощью объектного
представления, можно манипулировать и с использованием описанных
раньше возможностей клиентского кэша, так как если бы они были
"реальными" объектами из объектных таблиц. Для создания
пригодных идентификаторов виртуальных объектов в определениях
объектной таблицы должен быть специфицирован соответствующий
уникальный составной ключ для объектного представления.
По причине наличия некоторых незначительных ограничений объектные
представления не полностью эквивалентны объектным таблицам.
Например, обычно невозможно хранить указатели на виртуальные
объекты в объектных представлениях, поскольку такие указатели
должны конструироваться с использованием составного первичного
ключа и могут изменяться (в отличие от генерируемых системой
идентификаторов реальных объектов).
Развитие возможностей в будущем. Пока компания Oracle не объявила
время выпуска и точный набор функциональных возможностей
Oracle 8.1. Однако, если основывываться на истории компании, она
должна объявить следующий общий выпуск во второй половине 1998
г., включив в него поддержку языка Java для выполнения функций
управления базами данных (реализации хранимых процедур и
методов), явную поддержку наследования таблиц, расширенную службу
картриджей баз данных. Картридж для работы с временными рядами
планируется выпустить несколько раньше.