Концепция объектной модели Ultima-S

Ultima-S - это объектно-реляционная БД, работающая в модели документов. Ultima-S является объектно-реляционной БД ориентированной на обработку объектов в представлении документов, т.е. имеются особые базовые механизмы для работы с формами, свойствами (персональными меню) объектов, а также организации объектов в древовидные справочники.

Иными словами Ultima-S ориентирована на уровне объектной модели под интерфейс Explorer (Проводник), как в MS OutLook и т.д. Средствами объектной техники существующие объекты могут изменяться путем наследования, а также путем перехвата обработки их событий. Сами исходные текстов объектов в этом случае не изменяются.

Ultima-S поддерживает классический объектно-ориентированный метод разработки и RAD-технологию. Альтернативным механизмом типичной объектно-ориентированной техники с наследованием в Ultima-S имеются механизмы для использования RAD-технологии. В этом случае объект предоставляет пользователю возможность написать обработчик некоего своего события. Оба подхода сравнимы примерно как разработка компонент и визуальное программирование в Delphi. В данной работе подробно рассматриваются базовые объектные механизмы Ultima-S, средства ее настройки с использованием RAD будут освящены ниже.

Ultima-S содержит код обработчиков событий в хранимых процедурах MS SQL. Все объекты Ultima-S полностью реализованы в хранимых процедурах MS SQL. При этом часть процедур объекта является обработчиками его событий. Заголовки процедур-обработчиков стандартизированы. Таким образом, объекты Ultima-S полностью базируются со всей своей логикой в MS SQL. Что позволяет достичь низкого сетевого трафика с клиентов, а также повысить надежность системы. Клиент БД не имеет в себе логики объекта, поэтому не в состоянии разрушить данные объекта, например при применении устаревшей версии клиента или неверной его настройки. Еще о поддержки целостности БД см. ниже об объектном протоколе обмена.

Ultima-S имеет процессор событий, который вызывает каскад обработчиков событий для данного класса. Например, хранимая процедура с названием edit_getp_MyClass_ является обработчиком события getp (Get Properties, получить свойства объекта) для класса MyClass. Процессор событий Ultima-S при обработке события getp для экземпляра MyClass или его потомка сканирует таблицу процедур sysobjects в поиске хранимых процедур-обработчиков данного события, как для данного класса, так и для его предков. Все найденные процедуры вызываются. Слово 'edit' в заговке процедуры указвает на моду события. Это позволяет иметь несколько обработчиков одного события на объекте, т.е. перехватывать нужные события объектов своими обработчиками (пример будет рассмотрен ниже).

Объекты Ultima-S предназначенные для гибких настроек выполнены для работы с ними в режиме RAD. В этом случае в важнейшие места работы объекта с проблемной точки зрения оформляются как события на манер событий компонент Delphi, т.е. можно указать для конкретного действия объекта конкретную хранимую процедуру его описывающую прямо из интерфейса пользователя Ultima-S. Например, объект-шаблон формирования проводок имеет событие "вызов алгоритма", оформленное в виде графы в шаблоне. Если в графу вписать название хранимой процедуры, то шаблон вызовет ее. В этой процедуре может быть описан специфический алгоритм формирования проводки. Данный механизм является упрощенным вариантом процессора событий Ultima-S, поэтому далее не рассматривается.

Объекты в Ultima-S инкапсулированы друг от друга и от клиента БД через объектный протокол обмена. Объекты полностью отвечают за свое представление на клиенте и при совместном использовании через объектный протокол обмена данными, доступа в таблицы объектов нет. Клиент не имеет доступа к таблицам объектов на уровне секретности сервера, внутри БД это соглашение поддерживается на уровне дисциплины программирования. Все классы Ultima-S "друзья" (friend classes), это целесообразно с целью повышения производительности системы и убыстрения (удешевления) разработки объектов (объекты могут использовать SQL-запросы к друг другу).
Объектный протокол обмена состоит в следующем. Если необходимо получить данные об объекте, вызывается его событие read (прочесть объект). Обработчик(и) события помещает в некую буферную таблицу Detailed описание полей объекта (формы объекта), при этом объект и ядро в праве контролировать секретность (сообщать или не сообщать данные). Далее клиент БД или другой объект, анализируя Detailed могут, узнать о данных объекта, они могут попробовать изменить данные объекта изменив Detailed и, вызвав событие put (записать в объект). Обработчик(и) события с учетом секретности объекта могут записать данные в его таблицы. Во всех случаях работы через объектный протокол обмена данные (таблицы) объекта не известны пользователю и защищены секретностью MS SQL (он не имеет доступа ко всем таблицам кроме таблиц объектного протокола). Аналогично таблице Detaled существует таблица Properties служащая для получения свойств объекта по событию getp (Get Properties).

Объектный протокол Ultima-S дает выигрыш в производительности на медленных линиях Internet и RAS.

Применение объектного протокола обмена данными вызывает дополнительную нагрузку на сервер. Однако при работе через медленные линии удаленного доступа (Internet, RAS) получается выигрыш в скорости обмена. Дело в том, что посылается не масса мелких команд с клиента с подтверждениями обратно, а одна большая команда возвращающая все данные в единой таблице. Такой метод позволяет достигнуть повышения скорости обмена через IP-протокол, т.к. чем меньше команд, тем быстрее он работает, а большой и единый блок данных хорошо сжимается через IP Compression.