Август/Сентябрь 2003


Тема номера: Объектно-реляционная технология Oracle9i


Простые стратегии для сложных данных:
объектно-реляционная технология Oracle9i

(Simple Strategies for Complex Data:
Object-Relational Technology Oracle9i)

Источник: Geoff Lee и др. «An Oracle Technical White Paper», май 2002. http://otn.oracle.com/products/oracle9i/pdf/simple_strat_for_complex_rel2.pdf
Перевод Алексея Резниченко

Предисловие редакторов русского перевода

В данном документе четко и лаконично изложены основные принципы объектно- реляционной технологии, воплощенной в новом продукте компании Oracle – в сервере баз данных Oracle9i. Редакция журнала считает необходимым познакомить с ним читателей. Вместе с тем, подготовка и публикация перевода этого документа была в определенной степени инициирована также терминологической дискуссией, сопровождавшей перевод на русский язык документации Oracle9i, который выполнялся специалистами компаний РДТЕХ (www.rdtex.ru) и ITI Ltd. (www.iti.ru). Некоторые фрагменты этой дискуссии отражены в последних публикациях колонки "О чистоте русского языка и точности терминологии". В ходе дискуссии ее участники неоднократно указывали на вольности с терминологией в документации Oracle. В отличие от документации Oracle9i данный документ безупречен в части терминологии.

К сожалению, авторы документа не приводят никаких сведений о соотношении объектных возможностей, предусмотренных в Oracle 9i и в стандартах SQL:1999, а также SQL:200n – новой версии международного официального стандарта языка SQL, разработка которой завершается в настоящее время.

Все стандарты, на которые имеются ссылки в данном документе, подробно рассмотрены в книге М.Р.Когаловского "Энциклопедия технологий баз данных" (М: "Финансы и статистика", 2002). Там же содержатся необходимые ссылки на соответствующие официальные документы и другие публикации, включая отечественные. Кроме того, полезные публикации по затрагиваемым в статье вопросам указываются в примечаниях редакторов перевода.

В данном выпуске журнала публикуется первая часть перевода статьи. Окончание будет опубликовано в следующем выпуске OM/RE. Для удобства читателя в обоих случаях приводится полное содержание статьи.

Анатолий Бачин (omre@mail.ru),
Михаил Когаловский (kogalov@cemi.rssi.ru),
Александр Соколов (ap_sokolov@mail.ru)

СОДЕРЖАНИЕ

Часть II

  • Связывания для языков программирования
  • Отображение объектов между SQL и Java
  • Отображение объектов SQL в C++
  • Отображение объектов SQL в XML
  • Поддержка объектно-реляционной технологии в JDeveloper
  • Среда Oracle Business Components for Java
  • Механизм сохраняемости, управляемой контейнером с применением объектов Oracle9i
  • Отображение объектных типов Oracle в CMP-поля
  • Мастер JPublisher
  • Развертывание объектно-ориентированных приложений на интернет-платформах Oracle
  • Заключение

 Введение

СУБД Oracle9i ™ быстро превратилась в СУБД для всех типов данных – от простых до сложных. Мультимедийные типы данных, такие, как изображения, карты, видео- и аудио- клипы, редко обрабатывались неспециализированным программным обеспечением. Но в настоящее время многие веб-приложения требуют от своих серверов баз данных управления такими данными. Иные программные решения были также необходимы для хранения данных, которыми оперируют:

  • финансовые инструменты;
  • технические диаграммы;
  • молекулярные структуры.

Для удовлетворения этих потребностей сервер баз данных Oracle9i ™ предоставляет объектно-реляционную технологию, которая обеспечивает простые методы разработки, развертывания и управления приложениями, оперирующими со сложными данными.

СУБД Oracle9i ™ была расширена для поддержки полных возможностей объектного моделирования, включая наследование и многоуровневые коллекции со средствами эволюции типов.

Сервер Oracle9i ™ с объектно-реляционной технологией может быть "подогнан" разработчиками для создания их собственных специфических для области применения (application-domain-specific) типов данных. СУБД Oracle9i ™ была расширена для поддержки полных возможностей объектного моделирования, включая наследование (inheritance) и многоуровневые коллекции (multi-level collections), а также эволюции типов данных (type evolution). Например, можно создать новые типы данных, представляющие клиентов (customers), финансовые портфели (financial portfolios), фотографии и телефонные сети – и, тем самым, обеспечить, чтобы ваши приложения баз данных оперировали абстракциями, свойственными вашей предметной области (application domain). Кроме того, весьма желательно интегрировать эти новые типы с сервером баз данных настолько тесно, насколько это возможно, чтобы они обрабатывались наравне со встроенными типами данных, такими, как NUMBER или VARCHAR.

Рис. 0. Объектно-реляционная архитектура СУБД Oracle9i.

И, наконец, СУБД Oracle9i ™ предлагает большой набор интерфейсов прикладного программирования (API), реализующих связывания для различных языков. Для Java и PL/SQL предлагается "прямая" (native) поддержка внутри самой СУБД с тесной интеграцией между системой объектно-реляционных типов и хранимыми процедурами, написанными на Java или PL/SQL. Так как XML быстро становится стандартом для обмена информацией, то используя объектно-реляционную среду, можно "напрямую" хранить данные XML и эффективно манипулировать ими, индексировать их и эффективно обрабатывать запросы. Можно также поддерживать отображение между типами языка SQL и клиентских языков программирования (Java и C++), чтобы обеспечить "бесшовный" доступ к экземплярам типов данных SQL из приложений, написанных на Java или C++.

 Объектно-ориентированная разработка приложений

Со времени своего появления в 1960-х годах объектно-ориентированная технология становилась все более зрелой. Поскольку появились индустриальные стандарты, обеспечившие ее повсеместное принятие, разработка объектно-ориентированных приложений стала в настоящее время доминирующей в области ИТ. Наиболее важные из этих стандартов:

  • UML (Unified Modeling Language) – унифицированный язык моделирования для объектно-ориентированного анализа и проектирования (Прим. ред. Общие сведения о языке UML можно найти, например, в статье [1]. В ней также приведен список рекомендуемой литературы по этому языку.);
  • стандарт объектно-реляционных баз данных SQL:1999 (Прим. ред. Более подробно со стандартом SQL:1999 можно ознакомиться по статьям [2] и [3]. О дальнейшем развитии стандарта SQL читайте [12]);
  • стандарты языков объектно-ориентированного программирования Java и C++. Прежде чем приступить к рассмотрению реализации стандарта SQL:1999 в СУБД Oracle9i и соответствующих ему объектно-ориентированных интерфейсов прикладного программирования для Java и C++, необходимо сначала обсудить UML.

Рис. 1. UML-диаграмма приложения "Оперативный каталог" (Online Catalog).
Надписи на рисунке:

  • Inheritance – наследование (Прим.ред.: на рис. опечатка: "inheritanc" вместо "inheritance");
  • Aggregation ­– агрегирование;
  • Navigable Association ­– навигационная ассоциация.

Спецификации UML – это сплав лучших результатов, достигнутых в индустрии объектно- ориентированных технологий. Текущей является версия 1.4 этих спецификаций от Object Management Group (OMG), международной организации, разрабатывающей стандарты объектных технологий. (Прим. ред. В июне 2003 г. консорциум OMG принял новую версию этого стандарта – UML 2.0.) UML определяет стандартные конструкции для описания объектно-ориентированного программного обеспечения как объектной модели. Например, UML-диаграмма на рис. 1 изображает объектную модель приложения "Оперативный каталог", которое корпорация Oracle разработала как часть нового проекта Common Schema (общая схема). В этой объектной модели есть несколько классов (например, Category, leafCategory). Каждый из этих классов обладает рядом атрибутов и операций. Например, класс Category обладает атрибутами category_name и category_description, а также операциями add() и remove().

Классы также связаны между собой различными связями. Например:

  • класс leafCategory наследует от класса Category;
  • класс compositeCategory может агрегировать объекты класса Category;
  • а класс leafCategory имеет навигационную ассоциацию с классом Product_Information (то есть, классы leafCategory ссылаются на список объектов Product_Information).

Как только приложение проанализировано и спроектировано с применением UML, результирующая объектная модель может быть отображена в целевую реализацию с заданным языком программирования и сохраняемостью данных. После этого реализованное приложение готово для развертывания в рамках заданной целевой архитектуры. Преимущества объектно-реляционной технологии СУБД Oracle9i становятся очевидными по мере развертывания такого объектно-ориентированного процесса разработки. Как описано в следующем разделе, система объектных типов Oracle9i позволяет осуществлять отображение "один-к-одному" конструкций объектной модели UML в соответствующую объектно-реляционную схему.

 Система объектных типов СУБД Oracle9i

Исторически приложения разрабатывались с прицелом на доступ и модификацию корпоративных данных, которые хранятся в таблицах, составленных из "родных" для SQL типов данных, таких, как INTEGER, NUMBER, DATE и CHAR. Но, начиная с СУБД Oracle8, поддерживаются не только эти, но также и новые объектные типы данных, которые теперь являются частью действующего стандарта ANSI SQL:99. В этом разделе дан краткий обзор основных характеристик системы объектно-реляционных типов Oracle.

 Объектные типы

Объектный тип, отличный от "родных" (native) для SQL типов данных, – тип определяемый пользователем, который специфицирует как лежащие в основе сохраняемые (underlying persistent) данные (называемые "атрибутами" этого объектного типа), так и соответствующее поведение ("методы" этого объектного типа).

Корпорация Oracle расширила SQL (как DDL, так и DML), чтобы позволить пользователям:

  • определять свои собственные типы (которые представляют их бизнес-объекты) и связи (например, наследование и агрегирование) между этими определяемыми пользователями типами;
  • хранить их экземпляры (то есть, объекты) в базе данных (либо в столбцах таблиц, либо как сами таблицы);
  • запрашивать, вставлять и изменять эти экземпляры.

Бизнес-объект:

  • может содержаться внутри другого бизнес-объекта;
  • на него может ссылаться другой объект (используя конструкцию, называемую REF);
  • к нему можно получить доступ;
  • с ним можно манипулировать как с коллекциями (collections) или наборами (sets), используя структуры, называемые массивами переменной длины (VARRAYS) и вложенными таблицами (Nested Tables).

Пользователи могут определять операции над бизнес-объектами как методы (methods) определяемых пользователями типов. Методы могут быть реализованы как хранимые процедуры на языках Java или PL/SQL. Объекты также обладают глобально уникальными идентификаторами, называемыми объектными идентификаторами (Object ID), которые могут быть использованы для поддержки ссылок между объектами.

СУБД Oracle9i позволяет пользователям рассматривать объектные данные как реляционные. Например, пользователи могут использовать SQL для запросов объектных данных точно так же, как для запросов реляционных данных. Пользователи могут получать доступ к объекту, используя операторы SQL DML, к его атрибутам и методам, используя расширенные выражения путей (например, объект.атрибут). Они могут также использовать SQL для выполнения явных соединений (explicit joins) объектов в таблицах. Кроме того, Oracle9i позволяет пользователям выполнять неявные соединения (implicit joins) объектов, путем обхода (traversing) или навигации по ссылкам от одного объекта к другому. Объекты можно индексировать, применяя методы MAP или ORDER для преобразования их в скалярные значения, которые затем могут быть индексированы.

Объектно-реляционные конструкции СУБД Oracle9i весьма близки к реляционным, которые хорошо знакомы пользователям СУБД Oracle. Например, ссылка REF очень похожа на внешний (foreign) ключ, методы – это хранимые процедуры (которые могут быть написаны на языках Java, PL/SQL или C/C++), модели безопасности и транзакций, оперирующие с объектными типами, являются точно такими же, как и модели, определенные для реляционных таблиц.

Рис. 2. Определяемые пользователями объектные типы позволяют использовать конструкции предметной области.

Рассматриваемая система объектных типов существенно повышает уровень абстракции, на котором пишутся программы для работы с базами данных. Вместо оперирования типами данных NUMBER, CHAR и т.д., эти программы могут работать с конструкциями предметной области, такими, как Customer, Portfolio или Money. Из этого проистекают многие преимущества, не последним из которых является лучшее моделирование вашего бизнеса в базе данных.

  Объектные представления

С другой стороны, СУБД Oracle9i также позволяет пользователю рассматривать реляционные данные как объекты. Объектные представления (Object Views) позволяют синтезировать бизнес-объект из данных, которые продолжают храниться в реляционных таблицах. А именно, можно:

  • определять объекты, которые вы можете использовать в своих приложениях, без миграции каких-либо существующих реляционных данных;
  • различными способами комбинировать объекты, разработанные для одного приложения, для использования их другими приложениями. Объектные представления обладают примерно той же функциональностью, что и объектные таблицы. Они могут обладать методами, принадлежать коллекциям, ссылаться друг на друга, обладать свойством индивидуальности объектов (object identity), к ним можно получать доступ как через SQL, так и навигационным путем (path traversal). Более того, корпорация Oracle расширила механизм представлений, чтобы использовать специальные триггеры INSTEAD OF для поддержки полностью обновляемых представлений.

Рис. 3. Объектные представления добавляют гибкость при доступе к унаследованным данным.

Надписи на рисунке:

  • Relational Applications – реляционные приложения;
  • Object Applications – объектные приложения;
  • Object Views – объектные представления;
  • Relational Data – реляционные данные;
  • Objects – объекты;
  • One Database – одна база данных.

 Наследование

Наследование типов (Type inheritance) – это фундаментальная концепция в любой объектно-ориентированной системе. Наследование типов позволяет совместно использовать похожие свойства различных типов, а также расширять их характеристики.

Во многих объектно-ориентированных приложениях объекты организованы в типы, а типы – в иерархии типов. Эмпирически вполне достаточно организовать иерархии типов в виде набора деревьев. Тем самым, простого наследования достаточно для поддержки организации типов в большинстве приложений. Java – это объектно-ориентированный язык программирования, поддерживающий простое наследование. С помощью простого наследования тип может расширять один супертип (наследовать от одного супертипа). Такой тип, называемый подтипом (subtype), наследует все атрибуты и методы своего супертипа (supertype). Подтипу можно также добавлять новые атрибуты и методы или переопределять унаследованные методы. СУБД Oracle поддерживает модель простого наследования. А это очень близко соответствует стандарту ANSI SQL:99. (Прим. ред. Этот стандарт ANSI принят одновременно с официальным международным стандартом ISO/IEC SQL:1999 и тождественен ему.) В следующих нескольких разделах поддержка наследования типов в Oracle обсуждается более подробно.

Наследование типов позволяет совместно использовать похожие свойства различных типов, а также расширять их характеристики.

Иерархия типов

Корневой тип иерархии создается с помощью оператора CREATE TYPE, в котором должен быть указано ключевое слово NOT FINAL (нетерминальный).

CREATE TYPE Person_t AS OBJECT(
name VARCHAR2(100),
dob DATE,

MEMBER FUNCTION age() RETURN number,
MEMBER FUNCTION print() RETURN varchar2) NOT FINAL;

Под нетерминальным типом может быть создан подтип. Он наследует все атрибуты и методы от своего супертипа. В нем можно добавить новые атрибуты и методы и/или переопределить унаследованные методы.

CREATE TYPE Employee_t UNDER Person_t(
salary NUMBER,
bonus NUMBER,
MEMBER FUNCTION wages() RETURN number,
OVERRIDING MEMBER FUNCTION print() RETURN varchar2);

В Oracle Common Schema имеется более сложный пример иерархии наследования типов. Как показано на рис. 1, класс Category и его подклассы моделируются элегантной, но простой конструкцией, представляющей иерархии "часть-целое" (part-whole) с древовидной структурой. Этот пример более детально раскрывает основные преимущества системы объектных типов Oracle9i при сохранении всех аспектов объектной модели приложения.

create type category_typ as object
( category_name varchar2(50)
, category_description varchar2(1000)
, category_id number(2)
)
NOT INSTANTIABLE NOT FINAL;
create type subcategory_ref_list_typ as table of ref
category_typ;
create type product_ref_list_typ as table of number(6);
/
create type corporate_customer_typ under customer_typ
( account_mgr_id number(6)

);
create type leaf_category_typ under category_typ
(
product_ref_list product_ref_list_typ
);
create type composite_category_typ under category_typ
(
subcategory_ref_list subcategory_ref_list_typ
)
NOT FINAL;
create type catalog_typ under composite_category_typ
(
member function getCatalogName return varchar2
);

Иерархия представлений

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

CREATE VIEW Persons OF Person_t WITH OBJECT ID (name) AS
SELECT name, dob FROM r_persons;
CREATE VIEW Employees OF Employee_t UNDER Persons AS
SELECT name, dob, salary, bonus from r_employees;

Запрос к представлению Persons выберет всех лиц, включая служащих.

SELECT VALUE(p) FROM Persons p;
E-mail this page