2008 г.
Базы данных. Вводный курс
Сергей Кузнецов
Назад Содержание Вперёд
2.5. Современные модели данных
Я считаю, что история современных моделей данных
началась с 1989 г., когда группа известных специалистов в области
языков программирования баз данных опубликовала статью под названием
«Манифест систем объектно-ориентированных баз данных»
[2.6]. К этому времени уже существовало несколько реализаций
объектно-ориентированных СУБД (ООСУБД), но каждая из них опиралась
на некоторое расширение объектной модели какого-либо
объектно-ориентированного языка программирования (Smalltalk,
Object
Lisp,
C++),
отсутствовали какие-либо общие подходы.
В [2.6] не предлагалась единая
объектно-ориентированная модель данных, но выделялся набор
требований к ООСУБД. Базовыми требованиями являлось преодоление
несоответствия между типами данных, используемыми в языках
программирования, и типами данных, поддерживаемыми в набравших к
тому времени силу реляционных (вернее, SQL-ориентированных)
СУБД, а также придание СУБД возможностей хранить в БД данные
произвольно сложной структуры. Эти требования сопровождались
утверждениями об ограниченности реляционной модели данных и языка
SQL
и потребности использовать более развитые модели данных.
Под влиянием [2.6] в 1991 г. возник консорциум ODMG
(Object
Database
Management
Group),
задачей которого была разработка стандарта объектно-ориентированной
модели данных. В течение более чем десятилетнего существования ODMG
опубликовала три базовых версии стандарта, последняя из которых
называется ODMG
3.0 [4.4]. На этот документ мы и будем опираться в дальнейшем
изложении.
В ответ на публикацию [2.6] группа исследователей,
близких к индустрии баз данных, в 1990 г. опубликовала документ
«Манифест систем баз данных третьего поколения» [2.7],
который во многом направлен на защиту инвестиций крупных
компаний-производителей программного обеспечения SQL-ориентированных
СУБД. Соглашаясь с авторами [2.6] относительно потребности обеспечения
развитой системы типов данных в СУБД, авторы [2.7] утверждали, что
можно добиться аналогичных результатов, не производя революцию в
области технологии баз данных, а эволюционно развивая технологию
SQL-ориентированных
СУБД.
За публикацией [2.7] последовало появление
объектно-реляционных продуктов
ведущих компаний-поставщиков SQL-ориентированных
СУБД (Informix
Universal
Server,
Oracle8,
IBM
DB2
Universal
Database).
В 1999 г. был принят стандарт языка SQL
(SQL:1999),
в котором был зафиксирован ряд новых черт языка, придающих ему черты
полноценной модели данных. В последнем ко времени написания этой
книги стандарте SQL:2003
эта модель уточнена и расширена. В
Части 4 мы достаточно подробно обсудим
стандарт SQL,
а в этом
разделе остановимся лишь на некоторых
особенностях модели данных SQL,
отличающих ее от реляционной модели данных.
Итак, в начале 1990-х гг. были провозглашены два
манифеста, каждый из которых претендовал на роль программы будущего
развития технологии баз данных. В первом манифесте реляционная
модель данных отвергалась полностью, а во втором заменялась еще
незрелой к тому времени моделью данных SQL,
которая уже тогда была далека от реляционной модели. На защиту
реляционной модели данных в ее первозданном виде встали Кристофер
Дейт и Хью Дарвен, опубликовавшие в 1995 г. статью, под названием
«Третий манифест» [2.8].
«Третий манифест» являлся одновременно
наиболее консервативным и наиболее радикальным. Консервативность
Третьего манифеста заключается
в том, что его авторы всеми силами утверждают необходимость и
достаточность использования в системах базах данных следующего
поколения классической реляционной модели данных. Радикальность
состоит в том, что (a)
авторы полностью отрицают подходы, предлагаемые в первых двух
манифестах, расценивая их как необоснованные, плохо проработанные,
избыточные и даже вредные (за исключением одной общей идеи о
потребности обеспечения развитой системы типов); (b)
фактически, авторы полностью отбрасывают технологию, созданную
индустрией баз данных за последние 25 лет, и предлагают вернуться к
истокам реляционной модели данных, т.е. начальным статьям Э. Кодда
[2.1].
Позже Дейт и Дарвен написали книгу, первое издание
которой вышло в 1998 г. под названием «Foundation
for
Object/Relational
Databases:
The
Third
Manifesto»
[4.5], второе – в 2000 г. под названием «Foundation
for
Future
Database
Systems:
The
Third
Manifesto»
[4.6] (издан перевод второго издания на русский язык [1.5]) и третье –
под названием «Databases, Types and the
Relational Model: The
Third
Manifesto»
в 2006 г. [4.7]. В этих книгах очень подробно излагается подход
авторов к построению СУБД на основе, как они утверждают, истинных
идей Эдгара Кодда, изложенных им в своих первых статьях про
реляционную модель данных. Некоторые более поздние идеи Кодда
относительно той же реляционной модели авторами отвергаются. В любом
случае, Кодд и Дарвен предлагают некоторый современный вариант
реляционной модели данных (далее для определенности мы будем
называть ее истинной реляционной
моделью), который, безусловно, заслуживает внимания и изучения. В
данной книге мы ограничимся только кратким очерком основных черт
этой модели.
2.5.1. Объектно-ориентированная модель данных
Если не обращать внимания на особенности
объектно-ориентированной терминологии (предполагается, что читатели
в общих чертах знакомы с ней), то объектно-ориентированная модель
данных ODMG, специфицированная в [4.4], отличается от других двух
моделей, описываемых в
этом разделе, прежде всего, в одном
принципиальном аспекте. В модели данных SQL
и истинной реляционной модели данных база данных представляет собой
набор именованных контейнеров данных одного родового типа: таблиц
или отношений соответственно. В объектно-ориентированной модели
данных база данных – это набор объектов (контейнеров данных)
произвольного типа.
Типы и структуры данных объектной модели
В объектной модели данных вводятся две
разновидности типов: литеральные и
объектные типы.
Литеральные типы данных – это обычные типы данных, принятые в
традиционных языках программирования. Они подразделяются на базовые
скалярные числовые типы, символьные и булевские типы (атомарные
литералы), конструируемые типы записей
(структур) и
коллекций.
Литеральный тип записи – это традиционный
определяемый пользователем структурный тип, подобный структурному
типу языка C
или типу записи языка Pascal.
Отличие состоит лишь в том, что в объектной модели атрибут типа
записи может определяться не только на литеральном, но и на
объектном типе, т.е. значение литерального типа записи может в
качестве компонентов включать объекты. На первый взгляд это звучит
странно и страшновато, но здесь все странности проистекают из
особенностей объектно-ориентированной терминологии. У любого
существующего объекта имеется одно и только одно местоположение,
характеризующееся его идентификатором (OID).
Когда в модели говорится, что некоторое структурное значение в
качестве компонента имеет некоторый объект, то, конечно, имеется в
виду OID
этого объекта, являющийся всего лишь аналогом указательного значения
в традиционных языках программирования.
Имеются четыре вида типов коллекций: типы множеств,
мультимножеств (неупорядоченные наборы элементов, возможно,
содержащие дубликаты), списков (упорядоченные наборы элементов,
возможно, содержащие дубликаты) и словарей (множества пар <ключ,
значение>
, причем все ключи в этих
парах должны быть различными). Типом элемента любой коллекции может
являться любой скалярный или объектный тип за исключением того же
типа коллекции.
Объектные типы в объектной модели данных по смыслу
ближе всего к понятию класса в
объектно-ориентированных языках программирования. У каждого
объектного типа имеется операция создания и инициализации нового
объекта этого типа. Эта операция возвращает значение OID
нового объекта, который можно хранить в любом месте, где допускается
хранение объектов данного типа, и использовать для обращения к
операциям объекта,
определенным в его объектном типе.
Имеются два вида объектных типов. Первый из них
называется атомарным объектным типом. Нестрого говоря, при
определении атомарного объектного типа указывается его внутренняя
структура (набор свойств – атрибутов и связей) и набор
операций, которые можно применять к объектам этого типа. Для
определения атомарного объектного типа можно использовать механизм
наследования, расширяя набор свойств и/или переопределяя
существующие и добавляя новые операции.
Атрибутами называются
свойства объекта, значение которых можно получить по OID
объекта. Значениями атрибутов могут быть
и литералы, и объекты (т.е. OID),
но только тогда, когда не требуется обратная ссылка. Связи
– это инверсные свойства. В этом
случае значением свойства может быть только объект. Связи
определяются между атомарными объектными типами. В объектной модели
ODMG
поддерживаются только бинарные связи, т.е. связи между двумя типами.
Связи могут быть разновидностей «один-к-одному»,
«один-ко-многим» и «многие-ко-многим» в
зависимости от того, сколько экземпляров соответствующего объектного
типа может участвовать в связи.
Связи явно определяются путем указания путей
обхода. Пути обхода указываются парами, по
одному пути для каждого направления обхода связи. Например, в базе
данных СЛУЖАЩИЕ-ОТДЕЛЫ
служащий работает (works
)
в одном отделе, а отдел состоит (consists
of
)
из множества служащих. Тогда путь обхода consists_of
должен быть определен в объектном типе
ОТДЕЛ
,
а путь обхода works
– в типе СЛУЖАЩИЙ
.
Тот факт, что пути обхода относятся к одной связи, указывается в
разделе inverse
обоих объявлений пути обхода. Это связь
«один-ко-многим». Путь обхода consists_of
ассоциирует объект типа ОТДЕЛ
с литеральным множеством объектов типа
СЛУЖАЩИЙ
,
а путь обхода works
ассоциирует объект типа СЛУЖАЩИЙ
с объектом типа ОТДЕЛ
.
Пути обхода, ведущие к коллекциям объектов, могут быть
упорядоченными или неупорядоченными в зависимости от вида коллекции,
указанного в объявлении пути обхода.
Заметим, что хотя связь является модельным
понятием, другие понятия модели наталкивают на мысль, что
единственным способом реализации связей является хранение в объекте
OID
или коллекции OID
связанных объектов в зависимости от вида связи. Это можно сделать и
с использованием должным образом типизированных атрибутов. Однако
явное определение связи обеспечивает системе дополнительную
информацию, которая используется в объектной модели как ограничение
целостности (см. ниже).
Второй вид – это объектные типы коллекций.
Как и в случае использования литеральных типов коллекций, можно
определять объектные типы множеств, мультимножеств, списков и
словарей. Типом элемента объектного типа коллекции может быть любой
литеральный или объектный тип за исключением того же типа коллекции.
У объектных типов коллекций имеются предопределенные наборы
операций. В отличие от литеральных типов коллекций, которые, как и
все литеральные типы являются множествами значений, объектные типы
коллекций обладают операцией создания объекта, имеющего, как и все
объекты, собственный OID.
Интересен и важен один специальный случай неявного
использования объектов типа множества. При определении атомарного
объектного типа можно в качестве одного из дополнительных свойств
этого типа указать, что для него должен быть создан объект типа
множества, элементами которого являются объекты данного атомарного
типа (экстент
объектного структурного типа). Поскольку такой объект создается
неявно, его OID
неизвестен, но зато у него имеется имя, явно задающееся в
определении и совпадающее с именем атомарного объектного типа.
Наличие этой возможности позволяет создавать объектные базы данных,
состоящие из именованных контейнеров однотипных объектов, причем в
действительности эти контейнеры содержат OID'ы
соответствующих объектов.
Манипулирование данными в объектной модели
В стандарте ODMG
в качестве базового средства манипулирования объектными базами
данных предлагается язык OQL
(Object
Query
Language).
Это небольшой, но достаточно сложный язык запросов. Разработчики в
целом характеризуют его следующим образом:
- OQL
опирается на объектную модель ODMG
(имеется в виду, что в нем поддерживаются средства доступа ко всем
возможным структурам данных, допускаемых в структурной части
модели).
-
OQL очень
близок к SQL/92.
Расширения относятся к объектно-ориентированным понятиям, таким как
сложные объекты, объектные идентификаторы, путевые выражения,
полиморфизм, вызов операций и отложенное связывание.
-
В OQL
обеспечиваются высокоуровневые примитивы для работы с множествами
объектов, но, кроме того, имеются настолько же эффективные примитивы
для работы со структурами, списками и массивами.
-
OQL
является функциональным языком, допускающим неограниченную
композицию операций, если операнды не выходят за пределы системы
типов. Это является следствием того факта, что результат любого
запроса обладает типом, принадлежащим к модели типов ODMG,
и поэтому к результату запроса может быть применен новый запрос.
-
OQL не
является вычислительно полным языком. Он представляет собой простой
язык запросов.
-
Операторы языка OQL
могут вызываться из любого языка программирования, для которого в
стандарте ODMG
определены правила связывания. И, наоборот, в запросах OQL
могут присутствовать вызовы операций, запрограммированных на этих
языках.
-
В OQL
не определяются явные операции обновления, а используются вызовы
операций, определенных в объектах для целей обновления.
- В OQL
обеспечивается декларативный доступ к объектам. По этой причине
OQL-запросы
могут хорошо оптимизироваться.
-
Можно легко определить формальную семантику OQL.
Объем этой лекции не позволяет привести развернутое
описание языка OQL.
Приведем лишь один характерный пример.
Получить номера руководителей отделов и тех
служащих их отделов, зарплата которых превышает 20000 руб.
SELECT
DISTINCT STRUCT ( ОТД_РУК:
D.ОТД_РУК,
СЛУ:
( SELECT E
FROM D.CONSISTS_OF AS E
WHERE
E.СЛУ_ЗАРП
> 20000.00 ) )
FROM ОТДЕЛЫ
D
Здесь предполагается, что для атомарного объектного
типа ОТДЕЛ
определен
экстент типа множества с именем ОТДЕЛЫ
.
В запросе перебираются все существующие объекты типа ОТДЕЛ
,
и для каждого такого объекта происходит переход по связи к
литеральному множеству объектов типа СЛУЖАЩИЙ
,
соответствующих служащим, которые работают в данном отделе. На
основе этого множества формируется «усеченное» множество
объектов типа СЛУЖАЩИЙ
,
в котором остаются только объекты-служащие с зарплатой, большей
20000.00. Р
езультатом
запроса является литеральное значение-множество, элементами которого
являются значения-структуры с двумя литеральными значениями, первое
из которых есть атомарное литеральное значение типа INTEGER
,
а второе – литеральное значение-множество с
элементами-объектами типа СЛУЖАЩИЙ.
Более точно, результат запроса имеет тип
set
< struct
{ integer
ОТД_РУК; bag
< СЛУЖАЩИЙ > СЛУ } >
.
В совокупности результатом допустимых в OQL
выражений запросов могут являться:
-
коллекция объектов;
-
индивидуальный объект;
-
коллекция литеральных значений;
-
индивидуальное литеральное значение.
Ограничения целостности в объектной модели
В соответствии с общей идеологией
объектно-ориентированного подхода в модели ODMG
два объекта считаются совпадающими в том и только в том случае,
когда являются одним и тем же объектом, т.е. имеют один и тот же
OID.
Объекты одного объектного типа с разными OID
считаются разными, даже если обладают полностью совпадающими
состояниями. Поэтому в объектной модели отсутствует аналог
ограничения целостности сущности реляционной модели данных.
Интересно, что при определении атомарного объектного типа можно
объявить ключ – набор свойств объектного класса, однозначно
идентифицирующий состояние каждого объекта, входящего в экстент
этого класса. Для класса может быть объявлено несколько ключей, а
может не быть объявлено ни одного ключа даже при наличии определения
экстента. Но при этом определение ключа не трактуется в модели как
ограничение целостности; утверждается, что объявление ключа
способствует повышению эффективности выполнения запросов.
Что же касается ссылочной целостности, то она
поддерживается, если между двумя атомарными объектными типами
определяется связь вида «один-ко-многим». В этом случае
объекты на стороне связи «один» рассматриваются как
предки, а объекты на стороне связи «многие» – как
потомки, и ООСУБД обязана следить за тем, чтобы не образовывались
потомки без предков.
Назад Содержание Вперёд