Brief: физическая модель
Карта физической модели
Подробная карта одной области — хранения данных в базе. Общая карта элементов находится в Brief, описание механизмов — в разделах Таблицы, Материализации и Индексы.
Эта статья не входит в набор, который всегда передается ассистенту, и запрашивается по мере необходимости.
Что попадает в базу
- Первичные (
DATA) свойства — хранятся всегда. - Вычисляемые свойства с опцией
MATERIALIZED— хранятся и обновляются автоматически при изменении данных, от которых зависят. - Принадлежность объекта классу — хранится так же, как первичное свойство, в поле
_CLASS_ИмяТаблицы. - Признак полноты таблицы — при необходимости хранится в поле
_FULL_ИмяТаблицы.
Свойство можно материализовать тогда и только тогда, когда наборов объектов с не NULL значением у него конечное число.
Таблицы
- Таблица объявляется инструкцией
TABLEсо списком классов ключей:TABLE skuStock (Sku, Stock);. - Ключевые поля называются
key0, ...,keyN, остальные поля хранят значения свойств. - Таблица свойства задается опцией
TABLEв опциях свойства. Если она не задана, платформа выбирает существующую таблицу с тем же числом ключей и ближайшими классами ключей; опцияNODEFAULTисключает таблицу из такого выбора. - Если подходящей таблицы нет, создается таблица с именем
_auto_<идентификатор класса>_..._<идентификатор класса>. FULLозначает, что таблица содержит все существующие объекты классов своих ключей; это используется только для оптимизации выполнения (INNER JOINвместоLEFT JOIN) и на логику не влияет.
Имена в базе
Имена таблиц и полей зависят от политики именования, задаваемой параметром запуска db.namingPolicy.
| Политика именования | Имя таблицы | Имя поля |
|---|---|---|
| Полная с сигнатурой (по умолчанию) | Пространство_Таблица | Пространство_Свойство_Класс1_..._КлассN |
| Полная без сигнатуры | Пространство_Таблица | Пространство_Свойство |
| Короткая | Таблица | Свойство |
Имя поля для конкретного свойства можно задать явно.
Индексы
- Индексировать можно только материализованные свойства.
- Индекс по одному свойству задается опцией
INDEXED, индекс по произвольному списку полей одной таблицы — инструкциейINDEX. - Составной индекс может включать и материализованные свойства, и параметры, указывающие на ключевые поля; он должен содержать хотя бы одно материализованное свойство, все свойства в нем должны храниться в одной таблице и использовать один и тот же набор параметров.
- Типы
LIKEиMATCHсоздают специализированные индексы для одноименных операторов;MATCHдля строкового поля работает при наличии trigram/full-text поддержки у текущего адаптера базы, а для поля типаTSVECTORсоздает GIN-индекс по самому полю. - Автоматически создаются уникальный индекс по всем ключам таблицы и индексы по суффиксам ключей
keyK, ...,keyN.
Пересчет
Хранимые значения материализованного свойства пересчитываются из его определения оператором RECALCULATE — это нужно, когда значения могли разойтись с определением, например после изменения определения или прямого исправления данных.
Примеры
TABLE sku (Sku) FULL;
TABLE skuDate (Sku, DATE);
price = DATA NUMERIC[10,2] (Sku, DATE);
sum = GROUP SUM sum(OrderDetail od) BY order(od) MATERIALIZED;
orderDate = DATA DATE (Order) INDEXED;
INDEX supplier(Sku s, DATE d), s, price(s, d), d;