Рис. 3. История объектов
Рис. 3 иллюстрирует изменение объекта класса Шина, ставшее возможным после введение дополнительного параметра Нить. В таком случае объект Шина 1, определенный значениями идентификационных параметров О1, М1, получает значение параметра Дата смерти в момент изменения, а на смену этому объекту-предшественнику возникают 2 объекта-последователя Шина 2, Шина 3 с тем же значением параметра Обозначение, но с другими значениями параметра Модель, а также со значениями дополнительного параметра Нить. Момент рождения этих объектов-последователей определяется моментом смерти объекта-предшественника. Отметим, что в общем случае несколько объектов-предшественников могут заменяться некоторым количеством объектов-последователей. Заметим также, что если значение дополнительного параметра определить для всех объектов класса, то такой параметр можно перевести в группу обязательных главных неидентификационных параметров (MNPO) без изменения истории объектов. В этом случае при добавлении нового объекта в класс определение значения этого параметра станет обязательным (для дополнительных параметров это не так). Если же параметр перевести в группу главных идентификационных параметров, то потребуется изменение класса и всех объектов, что также потребует отношения истории.
При помощи отношения взаимодействия (см. [1, 3]) определяются все изменения в базе данных. В частности, это изменения, определяющие историю объектов и классов. Рис. 4 иллюстрирует схему взаимодействия, в которой участвуют объекты четырех классов:
Рис. 4. Схема взаимодействия
• объект класса Откуда имеет роль источника взаимодействия;
• объект класса Куда имеет роль направления взаимодействия;
• объект класса Что имеет роль объекта взаимодействия;
• объект класса Как имеет роль процесса взаимодействия.
Рис. 5 иллюстрирует взаимодействие, при котором происходит добавление дополнительного параметра Нить в класс Шина. В этом случае источником взаимодействия является пользователь, который вызывает это взаимодействие, в качестве направления взаимодействия выступает Система, в качестве объекта взаимодействия - класс Шина, представляющий собой объект схемы метауровня (см. далее), а в качестве процесса взаимодействия - класс Изменение параметров класса.
Рис. 5. Взаимодействие объектов
Отметим, что указанная схема взаимодействия является достаточно общей для описания любых процессов изменения информации в базе данных. Так, оно используется не только для манипулирования всеми данными пользователем, но и для таких процессов, как продажа продукции (источник - продавец, направление - покупатель, объект взаимодействия - продукция, процесс взаимодействия - класс Продажа, определяющий программные действия изменения данных) или изготовления детали (источник - сырье, направление - деталь, объект взаимодействия - станок, процесс взаимодействия - класс Изготовление, определяющий объект Рабочий, изготавливающий деталь и программные действия изменения данных).
3.Описание метауровня хранения данных
Поскольку необходима организация динамической СУБД, в которой могут изменяться не только объекты, но и их типы, определяемые изменением классов и параметров, то для описания классов объектов, параметров объектов и связей (отношений) классов и объектов используется метауровень, который представляет собой реляционную базу данных с набором таблиц, содержащих в себе все нужные значения. При этом выбор в качестве платформы реляционной СУБД может быть сделан позже на основе анализа удачности выбора той или иной платформы для метауровня. В таблицах метауровня мы как объекты будем представлять информацию о классах как объектах. Поскольку параметры каждого класса могут меняться, то информацию о параметрах классов мы также будем представлять в других таблицах, связывая их с таблицей классов реляционными связями. Объекты каждого класса будем держать в отдельных таблицах, связывая их с классами таблицы классов. Подобным образом поступим и со значениями параметров объектов, помещая их в отдельные таблицы, связанные с соответствующими таблицами параметров и объектов реляционными связями. Отметим, что каждый класс, параметр, объект имеет свой уникальный идентификатор (IdClass, IdParamter, IdObj) для установления упомянутых связей между таблицами, а также 2 атрибута Дата рождение и Дата смерти, определяющими период жизни соответствующего данного (при изменении класса, параметра, объекта их объектные идентификаторы также изменяются).
На рис. 6 приведена схема организации метауровня DIM. Поясним ее.
Главными в модели являются таблица Class классов объектов, таблица объектов соответствующего класса Obj_IdClass, где IdClass - идентификатор класса, Parameters, определяющая параметры объектов, и значение каждого параметра объекта (через таблицу типа Val_IdParameter). При этом каждый класс, объект, параметр определяются уникальным идентификатором соответственно IdClass, IdObject и IdParameter.
Таблица Class классов объектов определяется для каждого класса:
• объектный идентификатор класса;
• имя класса, через поле NameClass;
• его родительские и дочерние классы (через таблицы ClassInheritance наследования - граф наследования с дугами типа TypeGroup);
• классы, которые включены, и классы, в которые включен данный класс (через таблицу ClassIn- clusion - граф включения классов);
• классы взаимодействия (через таблицу ClassInteraction);
• уровень класса в графе наследования LevelInheritance;
• тип класса TypeClass;
• метка списка помеченных объектов класса; хранится в поле MarkList;
• связи данного класса, хранятся в поле RelRef, представляющий собой объект типа Map, в котором содержатся ключ - идентификатор связанного класса и значение - виды связей;
• параметры класса (через таблицу Parameter, так как все имена параметров уникальны и прикреплены к какому-то классу и через таблицу GroupParam);
• объекты класса (через таблицу Obj_IdClass);
• историю класса (через таблицу ClassHistory).
Отметим, что связи класса с другими классами можно получать как через таблицы классов ClassInheri- tance, ClassInclusion, ClassInteraction, ClassHistory (основной способ хранения информации о связях класса), так и через поле RelRef (дополнительный способ для ускорения получения этой информации).
Для того чтобы дублирование информации в поле RelRef не привело к коллизиям, перед каждым изменением какой-либо связи в одной из перечисленных четырех таблиц информация в поле RelRef помечается как недействительная, а после изменения обновляется. Такой режим ведет к сохранению целостности базы данных.
Таблица Obj_IdClass объектов класса определяет для каждого объекта:
• идентификатор объекта IdObject;
• поле Mark для пометки объекта, участвующего в выборке, если стоит значение 0 или null - объект не помечен, он не участвует в выборке, если 1, то объект помечен;
• NextIdObject - объектный идентификатор следующего объекта в списке помеченных объектов; через это поле осуществляется альтернативная организация списка, которая обеспечивается внешним индексом по этому полю на ту же таблицу;
• префикс IdClass из названия таблицы является идентификатором класса, объекты которого добавлены в данную таблицу; связь включения между объектами определяется либо в таблице ObjInclusion_IdIncluding_IdIncluded_IdInclusion, либо в таблице ObjInclusion_IdIncluding_IdIncluded, где вместо IdIncluding, IdIncluded, IdInclusion находятся идентификаторы классов: включающего, включения, связи включения;
Рис. 6. Схема метауровня
• связь наследования между объектами определяется в следующих таблицах ObjInheri- tance_IdParent_IdChild, где вместо IdParent, IdChild находятся идентификаторы классов;
• параметры объекта (через таблицы GroupParam и Parameters);
• значение параметров через таблицу с именами Val_IdParameter, где вместо IdParameter находится идентификатор параметра;
• список значений параметра в соответствующий момент времени через таблицу с именем Val- Time_IdParameter, где вместо IdParameter находится идентификатор параметра;
• связанные через таблицу ObjInteraction_IdF_IdT_IdW_IdH взаимодействия объекты, где IdF, IdT, IdW, IdH - идентификаторы объектов, имеющих соответственно роли Откуда, Что, Куда, Как.
Таблица Parameters определяет параметры объектов и для каждого параметра:
• объектный идентификатор IdParameter;
• его имя;
• тип (через таблицу Types);
• значение каждого параметра IdParameter каждого объекта IdObject через таблицы с именами типа Val_IdParameter;
• список значений динамического параметра IdParameter в определенный момент времени DateTime для каждого объекта IdObject через таблицы с именами типа ValTime_IdParameter.
Поле LevelInheritance класса определяет уровень класса в графе наследования, представляемого таблицей ClassInheritance:
0 - класс является изолированной вершиной графа наследования;
1 - класс является корневым в наследовании;
2 - класс не является ни корневым, ни висячим в графе наследования;
3 - класс является висячим в наследовании.
Поле TypeClass класса определяет тип класса:
0 - класс объектов, не являющихся связями других объектов;
1 - класс объектов, являющихся связями в отношении включения других объектов;
2 - класс объектов, являющихся связями во взаимодействии других объектов.
Каждый класс может содержать 3 группы параметров с именами:
MIPO - Main Identification Parameters of Objects - TypeGroup = 0;
MNPO - Main Nonidentification Parameters of Objects - TypeGroup = 1;
APO - Addinional Parameters of Objects - TypeGroup = 2.
Эти группы параметров определяют спецификацию объектов класса. При этом параметры из списка MIPO являются идентификационными (любые 2 объекта класса не должны иметь одинаковый набор этих значений); параметры из списка MNPO являются другими обязательными параметрами объектов класса, а параметры из списка APO необязательные для того или иного объекта класса. Обязательным является наличие хотя бы одной из групп параметров MIPO или MNPO.