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
.