Объектная модель

Используется схема обобщения (наследования) с общим для всех абстрактным предком (суперклассом) Object. Любой класс в системе является прямым или дальним потомком (подклассом) класса Object. Множественное наследование не поддерживается.

По умолчанию используется схема отображения 2 «класс – таблица», то есть каждый класс отображается на новую таблицу, связь 1:1 с таблицей суперкласса (предка) осуществляется по ключу-идентификатору ObjectID; атрибуты суперкласса не переносятся в подкласс за исключением ключа. На самом деле, метод отображения на таблицы на данном этапе не так важен, поскольку снаружи классы будут видны только как проекции.

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

Приложения, работающие с БД, не имеют прямого доступа к таблицам: они взаимодействуют только с проекциями или вызывают хранимые процедуры.

Объекты имеют унифицированную и сквозную систему идентификации. Атрибут ObjectID класса Object является уникальным не только в пределах базы данных (узла), но и всей системы. Таким образом, решается проблема физической репликации данных между узлами распределенной системы при отсутствии дубликатов на уровне ключей. О логических дубликатах можно почитать в статье "Управление качеством данных на основе алгоритмов нечеткого поиска".

Взаимодействие с объектом осуществляется посылкой ему сообщения. Ядром системы для каждого класса поддерживается набор сообщений (событий), обработку которых может дополнить или изменить прикладной программист. Обработчик реализуется хранимой процедурой с заданной сигнатурой, например <Имя класса>_<событие>_<обработчик>.
Вызов обработчиков производится ядром в соответствии с иерархией дерева классов: по сути, все обработчики являются виртуальными методами. Прикладной программист может добавлять свои типы событий.

Все манипуляции с объектами происходят посредством операций с проекциями или прямой посылкой сообщений. Проекции допускают весь стандартный набор операций для обычных таблиц: выборку, вставку, модификацию и удаление. Подобные операции рассматриваются, как посылка сообщений (создать, изменить, удалить) всем объектам, попавшим во множество, определяемое SQL-запросом.

Таким образом, обработка объектов через проекции будет ориентирована на множества, а не последовательность операций, присущих популярным императивным объектно-ориентированным языкам типа Java, Delphi, C# и другим. Ведь SQL – декларативный язык: вы только задаете «что сделать», а «как сделать» - решает интерпретатор на уровне СУБД. Впрочем, работа через посылку сообщений отдельным объектам позволяет использовать и традиционный императивный стиль программирования.