Перейти к основному содержимому
Версия: 6.x

How-to: Физическая модель

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

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

CLASS Animal 'Животное';
TABLE animal(Animal);

name 'Наименование' = DATA STRING[50] (Animal);

При стандартной политике именования полей в базе данных будет создана таблица <Пространство имен>_animal, в которой будет ключ key0 с внутренним идентификатором животного и поле <Пространство имен>_name_Animal, в котором будет храниться его наименование.

Для свойств с несколькими параметрами можно создавать таблицу следующим образом:

CLASS Country 'Страна';

TABLE animalCountry (Animal, Country);
population 'Численность' = DATA INTEGER (Animal, Country);

В этом случае будет создана таблица <Пространств имен>_animalCountry, в которой будет два ключа - key0 для животного и key1 для страны. В ней также будет поле <Пространство имен>_population_Animal_Country.

Все остальные свойства с сигнатурой [Animal, Country] будут также помещаться в эту таблицу. Если какое-то свойство необходимо поместить в отдельную таблицу, то можно использовать следующий прием:

TABLE ageAnimalCountry (Animal, Country);
averageAge 'Средний возраст' = DATA NUMERIC[8,2] (Animal, Country) TABLE ageAnimalCountry;

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

Вычисляемые свойства, которые необходимо постоянно хранить в таблице, нужно помечать при помощи ключевого слова MATERIALIZED:

totalPopulation 'Общая численность' (Animal a) = GROUP SUM population(a, Country c) MATERIALIZED;

Таблица, в которой будет храниться это поле, будет выбрано по тому же алгоритму как и для первичных свойств. В данном случае, оно попадет в таблицу <Пространоство имен>_animal.