Олег Сиротюк,
инженер по контролю качества компании InterSystems
sirotyuk@intersystems.ru

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

Как оказалось, реляционные базы данных очень хороши для традиционных приложений, например, систем резервирования билетов или банковских систем. Однако использование реляционного подхода не столь эффективно в таких приложениях, как АСУП, геоинформационные системы, средства для хранения и извлечения документов, работы с аудио- и видеоинформацией, а также в системах, основанных на знаниях. Это связано с примитивностью структур данных, лежащих в основе реляционной модели. В нетрадиционных приложениях базы данных содержат сотни таблиц, над которыми постоянно выполняются дорогостоящие операции соединения, необходимые для воссоздания сложных структур данных.

Серьезное ограничение реляционных баз данных - их довольно слабые возможности по части представления семантики приложений. В результате на смену реляционным пришли объектно-ориентированные системы управления базами данных (ООСУБД). Первые публикации об ООСУБД появились довольно давно, в середине 80-х гг. Возникновение ООСУБД обусловлено в первую очередь потребностями практики - необходимостью разработки сложных информационных прикладных систем. Развитие ООСУБД тесно связано с развитием объектно-ориентированных языков программирования, которые сами по себе имеют свойства, присущие ООСУБД. Основное достоинство ООСУБД - повышение уровня абстракции. Так, разработчик теперь имеет дело уже не с полями БД, а с понятиями "класс", "объект" и "свойство".

И все же есть соображения, которые удерживают разработчиков от перехода с реляционной технологии на объектную. Основное препятствие для такого перехода - значительный объем существующих разработок на основе реляционных СУБД. При переходе на объектную технологию необходимо многое начинать с нуля. Кроме того, объектная технология, поддерживаемая в ряде постреляционных СУБД, не имеет развитого и стандартизированного языка генерации отчетов и анализа данных, каким является структурированный язык запросов SQL. Данные проблемы были решены в постреляционной СУБД Cache компании InterSystems (http://www.intersystems.ru). Cache обеспечивает реализацию основных возможностей объектно-ориентированной технологии, позволяет во многом облегчить переход с реляционной технологии на объектную и может выступать в роле шлюза к реляционным базам данных.

Отличительная особенность СУБД Cache - независимость хранения данных от способа их представления, что достигается с помощью так называемой единой архитектуры данных Cache. В рамках данной архитектуры существует единое описание объектов и таблиц, отображаемых непосредственно на многомерные структуры ядра базы данных, ориентированные на обработку транзакций*. При этом не используется многослойная структура обработки данных, присущая СУБД - наследникам реляционной или объектной парадигмы (рис. 1). Сокращение количества уровней обработки данных позволяет сэкономить вычислительные ресурсы и значительно повысить быстродействие разрабатываемых приложений.


* См. В. Кирстен, М. Ирингер и др. "СУБД Cache. Объектно-ориентированная разработка приложений". СПб.: "Питер", 2001.

Fig.1 Рис. 1. Структуры обработки данных.

С помощью интегрированного с БД Cache RAD-инструментария разработки приложений Cache Server Pages (CSP) можно создавать Web-приложения любого уровня сложности. При этом можно использовать классы системной библиотеки %Net, которые реализуют все основные сетевые протоколы Интернета и интрасетей: SMTP, POP3, HTTP, FTP и т. д.

Основные компоненты

Рассмотрим подробнее назначение и функциональные возможности основных компонентов системы, архитектура которой представлена на рис. 2.

Fig.2 Рис. 2. Архитектура системы Cache.

TMDM - многомерное ядро Cache

Данные в Cache хранятся в виде разреженных многомерных массивов, называемых глобалями. Количество индексов массива может быть произвольным, что позволяет описывать и хранить структуры данных произвольного уровня сложности. Индексы глобалей не типизированы, т. е. могут принадлежать к любому литеральному типу данных. Синтаксис индексов глобалей достаточно прост: индексы заключаются в скобки и отделяются запятыми. Глобаль отличается от локальной переменной знаком ^. Например, с помощью следующей глобали можно описать количество машин Mercedes SL600 черного цвета на складе:

^car("Mercedes","SL600","black")=10

Скорость доступа к индексированным переменным не зависит от числа индексов, так как глобали хранятся в виде B*-деревьев.

Немного усложняя приведенную структуру описания данных, можно определить все доступные цвета для Mercedes SL600:

^car("Mercedes","SL600","colors")=3
^car("Mercedes","SL600" ,"colors",1)="black"
^car("Mercedes","SL600" ,"colors",2)="blue"
^car("Mercedes","SL600" ,"colors",3)="white"

Применение разреженных массивов позволяет оптимизировать использование объема жесткого диска и сократить время выполнения операций ввода-вывода.

В Cache реализована развитая технология обработки транзакций и разрешения конфликтов. Блокировка данных происходит на логическом уровне. Это позволяет учитывать особенность многих транзакций, выполняющих изменения небольшого объема информации. Кроме того, в Cache реализованы атомарные операции добавления и удаления без проведения блокировки.

Сервер Cache Objects

Объектная модель Cache (рис. 3) соответствует объектной модели стандарта ODMG (Object Data Management Group). В соответствии со стандартом в Cache реализовано два типа классов - классы типов данных (литералы) и классы объектов (объекты).

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

Классы типов данных подразделяется на два подкласса - атомарные и структурированные. К атомарным литеральным типам в Cache относятся традиционные скалярные типы данных (%String, %Integer, %Float, %Date и др.). В Cache реализованы две структуры классов типов данных - список и массив.

Fig.3 Рис. 3. Объектная модель Cache.

Различают два подтипа классов объектов - зарегистрированные и незарегистрированные. Зарегистрированные классы обладают предопределенным поведением, т. е. набором методов, наследуемых из системного класса %RegisteredObject и отвечающих за создание новых объектов и за управление размещением объектов в памяти. Незарегистрированные классы не обладают предопределенным поведением, разработка функций (методов) для них целиком и полностью возлагается на разработчика.

Зарегистрированные классы бывают двух типов - встраиваемые и хранимые. Встраиваемые классы наследуют свое поведение от системного класса %SerialObject. Основная особенность хранения встраиваемого класса состоит в том, что объекты встраиваемых классов существуют в памяти как независимые экземпляры, однако могут быть сохранены в базе данных, только будучи встроены в другой класс.

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

Хранимые классы наследуют свое поведение от системного класса %Persistent, который предоставляет обширный набор функций, в частности, создание объекта, подкачку объекта из БД в память, удаление объекта и т. п. Каждый экземпляр хранимого класса имеет два уникальных идентификатора - OID и OREF. OID (object ID) характеризует объект, записанный в БД, т. е. на физическом носителе, а OREF (object reference) характеризует объект, загруженный из БД, который находится в памяти.

Cache в полном объеме реализует все основные концепции объектной технологии: наследование, полиморфизм, инкапсуляцию.

Предусмотрено несколько стратегий хранения объектов в БД - автоматическое хранение в многомерной базе данных Cache; хранение в структурах, определенных пользователем; хранение в таблицах внешних реляционных баз данных, доступных через шлюз Cache SQL Gateway.

Сервер Cache SQL

Наряду с реализацией в полном объеме основных принципов объектной технологии в СУБД Cache поддерживается и структурированный язык запросов SQL для выполнения запросов в соответствии с популярным стандартом. Кроме этого, с помощью единой архитектуры данных Cache можно автоматически преобразовывать реляционные таблицы в классы объектов. При поступлении на сервер Cache SQL DDL-описания реляционной таблицы программа автоматически преобразует DDL-описание во внутреннюю структуру хранения данных и сохраняет полученную структуру в словаре данных. Затем с помощью поставляемых в стандартной комплектации Java- или ODBC-драйверов данные из реляционных таблиц импортируются в многомерные структуры ядра Cache. После этого можно работать с данными как в виде реляционных таблиц, так и в виде классов объектов. Таким образом при переходе с реляционной технологии на объектную разработка не начинается с нуля - Cache многое делает автоматически.

Классы Cache также могут быть представлены в виде реляционных таблиц. Соотношение между разнообразными понятиями объектного и реляционного подходов представлены в табл. 1.

Таблица 1. Объектные и реляционные понятия в Cache

Объектное понятие Реляционное понятие
Класс Таблица
Экземпляр Строка
Идентификатор объекта (OID) ID-столбец в виде первичного ключа
Свойство-константа Столбец
Ссылка на хранимый объект Внешний ключ
Встраиваемые объекты Индивидуальные столбцы
Коллекция-список Столбец с полем-списком
Коллекция-массив Подтаблица
Поток данных BLOB
Индекс Индекс
Запрос Хранимая процедура или представление
Метод класса Хранимая процедура

В таблице не обозначены понятия параметров класса, многомерных свойств и методов объекта, так как в реляционной технологии им нет аналогов. Кроме объектных понятий в Cache поддерживаются еще и триггеры, присутствующие в реляционном представлении.

Доступ к данным с помощью языка SQL продолжает играть важную роль, так как многие существующие приложения и инструменты используют SQL в качестве языка запросов. Для облегчения разработки приложений БД в Cache предусмотрено встраивание SQL в методы и программы. Встроенный SQL может быть использован для реализации сложных запросов к базам данных и для представления полученных результатов запросов в виде значений переменных встроенного языка разработки приложений Cache Object Script (COS). Ниже приведен пример использования встроенного SQL-запроса:

new id, Surname
set Surname="Ivanov"
&sql(SELECT Id into :id FROM Person where Surname=:Surname)

Приведенный код ищет по полю Surname таблицы Person поле со значением Ivanov и сохраняет найденный OID объекта в локальной переменной id. Пример демонстрирует использование встроенного SQL-запроса, не основанного на курсоре. В данном случае запрос всегда возвращает только одну строку.

Если же необходимо получить несколько строк из результирующей выборки запроса, следует использовать SQL, основанный на курсоре. Курсор в данном случае служит указателем на одну строку, при выполнении операции FETCH он передвигается к следующей строке.

Сервер прямого доступа к данным Cache Direct

Сервер Cache Direct дает разработчику доступ к многомерным структурам ядра системы. Встроенный в Cache язык программирования COS предоставляет ряд функций для работы с массивами данных, или глобалями, составляющими ядро системы. Прямой доступ к данным позволяет оптимизировать время доступа. Для прямого доступа и работы с многомерными структурами ядра системы можно воспользоваться утилитой эмуляции ASCII-терминала Cache Terminal (рис. 4).

Fig.4
Рис. 4. Утилита Cache Terminal.

Средства администрирования

В стандартной поставке Cache разработчику предлагается два средства администрирования системы - Configuration Manager и Control Panel.

С помощью Configuration Manager можно выполнить следующие функции администрирования.

  • Создать новую БД, удалить или изменить настройки существующей БД (с точки зрения физического хранения БД Cache - это бинарный файл CACHE.DAT; для каждой БД создается свой файл CACHE.DAT в отдельном каталоге).
  • Определить область (Namespace) для существующей БД, т. е. логическую карту, на которой указаны имена многомерных массивов - глобалей и программ файла CACHE.DAT, включая имена каталога и сервера данных для этого файла. При обращении к глобалям используется имя области.
  • Определить CSP-приложение. Для использования CSP-приложений необходимо определить виртуальный каталог на Web-сервере, физический каталог хранения CSP-приложений, а также несколько специфических для CSP настроек, например, класс-предок для CSP-приложений (по умолчанию принимается системный класс %CSP.Page).
  • Определить сетевое окружение Cache. В Cache реализован собственный протокол DCP (Distributed Cache Protocol) для работы с сетью распределенного окружения БД. С помощью интерфейсов Configuration Manager можно определить источники данных в сети, а также определить связи между различными компонентами сети.
  • Настроить систему Cache. Разработчику предоставляется возможность конфигурирования различных компонентов системы, скажем, параметров журналирования, настроек теневых серверов, параметров сервера лицензий, параметров Cache-процессов и др.

Утилита Control Panel предоставляет схожий набор функций администрирования и добавляет ряд новых:

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

Средства разработки приложений

В Cache реализован собственный язык программирования Cache Object Script (COS), представляющий собой расширенную и переработанную версию языка программирования M (ANSI MUMPS).

В первую очередь COS предназначен для написания исходного кода методов класса. Кроме того, в Cache существует понятие Cache-программы. Cache-программа - это не есть составная часть классов, она предназначается для написания приложений для текстовых терминальных систем.

Для создания Cache-программ и классов применяются утилиты Cache Studio (рис. 5) и Cache Architect (рис. 6). С помощью утилиты Cache Studio можно создавать Cache-программы. Для удобства в Cache Studio реализована контекстная подцветка команд, функций и операторов COS.

Fig.5
Рис. 5. Cache Studio.

Утилита Cache Architect предназначена для работы с классами Cache. Разработчику предоставляется ряд мастеров (wizard) для создания новых и редактирования существующих классов, методов, свойств и прочих компонентов классов Cache.

Fig.6
Рис. 6. Cache Architect.

Для доступа к многомерным структурам ядра Cache можно воспользоваться утилитой Cache Explorer (рис. 7). Она предоставляет ряд интерфейсов для просмотра, импорта, экспорта и печати глобалей, классов и программ Cache.

Fig.7
Рис. 7. Cache Explorer.

Cache Server Pages

Концепция серверных страниц Cache (Cache Server Pages, CSP) предусматривает автоматическое создание по запросу пользователя Web-страниц, содержащих требуемую информацию из БД Cache. Вся бизнес-логика CSP-приложений выполняется в непосредственной близости к хранилищу данных Cache. Благодаря этому сокращается объем данных, которыми Web-сервер обменивается с сервером БД, что приводит к выигрышу в производительности по сравнению с другими технологиями создания Web-приложений. Для дополнительного увеличения производительности CSP-приложений при обмене данными между сервером Cache и Web-сервером используются высокоскоростные интерфейсы API.

Серверные страницы Cache представляют собой текстовые HTML-файлы, расширяемые тегами приложений Cache (Cache Application Tags, или CATs). Можно создавать CSP-приложения с помощью стандартных средств разработки HTML-страниц (Cache предоставляет add-in модуль для полной интеграции с Macromedia DreamWeaver) или обыкновенного текстового редактора.

В листинге 1 приведен пример небольшого CSP-приложения, которое выводит значения свойств объекта, хранящегося в БД Cache.

Листинг 1

<html>
<head></head>
<body> 
  <script language="Cache" runat="Server">
    set obj=##class(Sample.Person).%OpenId(1)
    write obj.Name,"<br>"
    write obj.Age,"<br>"
    do obj.%Close()
  </script>
</body>
</html>

Разработчик также может создавать собственные теги приложений Cache.

При открытии CSP-страницы в браузере Cache автоматически преобразует CSP-страницу в класс Cache (по умолчанию классом-предком для CSP-классов выступает системный класс %CSP.Page). CSP-класс - это не просто способ представления кода. Это отражение полноценной объектной модели CSP-приложения - вы можете использовать все преимущества объектного подхода, в частности наследование и полиморфизм.

После преобразования CSP-страницы в класс Cache этот класс можно редактировать c помощью Object Architect.

Для изучения CSP рекомендуется рассмотреть примеры, содержащиеся в стандартном комплекте Cache. Для этого необходимо установить Cache и в браузере обратиться по адресу http://127.0.0.1:1972/csp/samples/menu.csp

Версии и поддерживаемые платформы

На момент написания статьи последними версиями СУБД Cache были 4.0 и 4.1.1. На рынке высокопроизводительных СУБД Cache позиционируется как eDBMS, т. е. как СУБД, ориентированная на работу в сети Интернет и интрасетях. Разработчику предоставляется обширный набор функций, реализующих большинство стандартных Интернет-протоколов, таких, как SMTP, HTTP и POP3, имеется также развитая технология разработки динамических Web-приложений CSP. При установке система проверяет наличие Web-сервера и выполняет автоматическое конфигурирование соответствующей подсистемы.

Утилиты администрирования и инструментарий разработки приложений в версиях 4.0. и 4.1.1. схожи, существенные различия касаются лишь формата хранения данных на диске и использования ОЗУ компьютера временными библиотеками. Так, в версии 4.1.1 блок данных, который считывается с диска, может иметь объем 8 Кбайт, в то время как в версии 4.0. максимальный размер блока равен 2 Кбайт. Разумеется, при считывании блоков данных большего размера с жесткого диска сокращается количество операций ввода-вывода, что приводит к повышению производительности системы. Кроме того, в версии 4.1.1 оптимизированы функции журналирования, использования блокировок и других функций.

Список платформ, поддерживаемых Cache 4.1.1, приводится в табл. 2.

Таблица 2. Совместимость Cache 4.1.1.

Платформа Операционная система Unicode ODBC SQL- шлюз
Alpha OpenVMS 7.2, 7.3 +    
Alpha True64 UNIX 5.1 +    
HP HP/UX 11i      
IBM P Series AIX 4.3.3, 5.1 +    
Red Hat Linux (Intel) Red Hat Linux 7.1 + +  
Sun Solaris (SPARC)* Solaris 2.8 +    
SuSE Linux (Intel) SuSE Linux 7.1 + +  
Microsoft Windows Windows 95/98/ME/NT 4 (SP4, SP5, SP6)/2000 + + +
*Только для 64-разрядных.

Cache поддерживает множество национальных языков как на уровне хранимых данных, так и на уровне локализации утилит. Кроме того, специальная утилита CNLS позволяет создавать собственные таблицы трансляции из одного набора символов в другой, задавать различные способы вывода непечатаемых символов и предоставляет ряд других возможностей. При инсталляции в среде Windows Cache автоматически определяет региональные настройки ОС и устанавливает соответствующую схему локализации. Также предоставляется возможность установки Unicode (16bit) версии Cache. Стоит отметить, что для русского языка поддерживаются две таблицы кодировок - Windows-1251 и ISO 8859-5.

Серверные компоненты CSP работают с такими Web-серверами, как MS IIS/PWS, Apache 1.3.12, Netscape/Sun iPlanet 4.0, Compaq Secure Web Server 1.0.

Как уже было сказано, Cache может выступать в роли шлюза к реляционным базам данных (РБД). Официально поддерживаются РБД Microsoft SQL Server (7.0 и 2000) и Oracle 8,9i.

Минимальные требования к аппаратному обеспечению для работы под ОС Windows включают процессор Intel Pentium, 64 Мбайт ОЗУ, 100 Мбайт свободного места на диске, сконфигурированный протокол TCP/IP с фиксированным IP-адресом. Наличие Web-сервера необязательно. Для тестирования CSP-приложений можно воспользоваться встроенным в СУБД Cache Web-сервером. Однако применять его для реальной работы не рекомендуется.

При установке Cache под Windows можно выбрать один из следующих вариантов установки:

  • Standard. Устанавливаются сам сервер БД Cache, ActiveX-компоненты, CSP-компоненты, инструментарий разработки и администрирования СУБД, документация.
  • Client. Устанавливаются клиентские компоненты администрирования и разработки приложений Cache.
  • Custom. Выборочная установка компонентов СУБД Cache.

После выбора варианта установки программа инсталляции Cache запрашивает информацию о размерности кодировки - 8-битовая или Unicode (16 бит). Выбор кодировки целиком и полностью зависит от требований разработчика. Следует помнить, что Cache автоматически конвертирует БД из 8-битового формата в Unicode, однако обратную конвертацию придется проводить вручную.

Завершая знакомство

В статье описана лишь малая часть того, что реализовано в Cache. Помимо описанных интерфейсов система включает ODBC- и JDBC-драйверы для представления данных из СУБД Cache в виде реляционных таблиц и работы с ними. Имеются также стандартные ActiveX-компоненты, которыми можно воспользоваться при создании пользовательского приложения в среде Visual Basic. Кроме того, предоставляется мастер создания форм Cache Form Wizard, облегчающий разработку пользовательских форм в среде Visual Basic.

В Cache реализованы интерфейсы CALLIN/CALLOUT, предназначенные для прямого вызова функций СУБД Cache из программ на C и для вызова функций операционной системы из Cache. Предоставляется интерфейс для работы с функциями DLL- библиотек.

Комплект Cache содержит модуль интеграции со средой проектирования информационных систем Rational Rose. При этом UML-диаграмму классов можно экспортировать напрямую в БД Cache. Разработчик получает возможность создавать описания классов Cache на языках Java или С++.

На середину лета анонсирован выход новой, пятой версии Cache. Бета-версию продукта можно загрузить с сайта InterSystems (http://www.intersystems.com). В ней имеются следующие новшества:

  • интегрированная среда разработки Cache Studio с развитым графическим отладчиком. Функции Cache Studio и Object Architect предыдущих версий объединены в рамках единой среды разработки приложений. С помощью графического отладчика можно отлаживать методы классов и программ Cache, а также Web-страниц CSP;
  • поддержка XML, а также языков описания XML-структур Schema, DTD. Новая версия поддерживает обмен (экспорт-импорт) данных и структур данных с внешними XML/Schema/DTD-документами;
  • поддержка SOAP;
  • оптимизация времени выборки данных путем индексирования по технологии BitMap;
  • новый язык описания бизнес-логики приложений на сервере - Cache Basic.