Rules: физическая модель
Область действия
Рекомендации по хранению данных в базе — таблицам, материализациям и индексам. Общие обязательные правила находятся в Rules; эта статья не входит в набор, который всегда передается ассистенту, и запрашивается по мере необходимости.
Таблицы
-
Таблицы следует объявлять явно для каждого используемого набора классов ключей, а свойства с этим набором параметров — размещать в них опцией
TABLE. Автоматически созданной таблицы_auto_...в логике быть не должно: ее имя определяется классами параметров, поэтому изменение сигнатуры свойства приводит к переносу данных в другую таблицу. -
Свойства с одинаковым набором параметров, которые обычно читаются вместе, следует хранить в одной таблице: тогда их чтение не требует соединения таблиц.
-
Опцию
NODEFAULTследует использовать для таблиц узкого назначения, в которые свойства должны попадать только явно. -
Опцию
FULLследует указывать для таблицы, которая содержит все объекты классов своих ключей. Она влияет только на способ выполнения запросов, поэтому указывать ее для таблицы, которая заполнена не для всех объектов, нельзя. -
Политику именования следует выбирать на старте проекта. Короткая политика делает имена в базе читаемыми, но при большом количестве материализованных свойств требует явных имен полей, чтобы имена оставались уникальными.
Материализации
-
Материализовать следует агрегированные свойства, которые читаются или используются в условиях фильтрации значительно чаще, чем меняются данные, от которых они зависят.
-
Материализовать не следует свойства, у которых значение не
NULLдля бесконечного числа наборов объектов, — такое свойство материализовать нельзя. Типичный случай — свойство с параметром встроенного класса, например датой, не ограниченным условием. -
Материализация цепочки промежуточных свойств умножает работу при изменении данных: следует материализовать результат, который действительно читается, а не каждый шаг вычисления.
-
Свойство, зависящее от часто меняющихся данных и читаемое редко, материализовать не следует — обновление хранимых значений будет выполняться при каждом изменении.
-
После изменения определения материализованного свойства или прямого исправления данных в базе хранимые значения следует пересчитать оператором
RECALCULATE.
Индексы
-
Индексы следует создавать для свойств, по которым выполняется фильтрация или поиск в формах и запросах, и не следует создавать «на всякий случай»: каждый индекс обновляется при каждом изменении значений его полей.
-
Индексировать можно только материализованные свойства, поэтому индекс по вычисляемому свойству требует его материализации — и решение о ней принимается по правилам предыдущего раздела, а не ради индекса.
-
Составной индекс следует создавать, когда фильтрация идет сразу по нескольким полям одной таблицы; порядок полей в нем должен соответствовать порядку, в котором эти поля ограничиваются.
-
Индекс, дублирующий автоматически создаваемые, создавать не следует: уникальный индекс по всем ключам таблицы и индексы по суффиксам ключей уже существуют.
-
Для полей, по которым выполняется поиск операторами
LIKEиMATCH, следует использовать одноименные типы индексов, а не обычный индекс.
Примеры
TABLE order (Order);
TABLE orderDetail (OrderDetail);
TABLE skuStock (Sku, Stock);
date = DATA DATE (Order) INDEXED;
sum (OrderDetail d) = quantity(d) * price(d) MATERIALIZED;
sum (Order o) = GROUP SUM sum(OrderDetail d) BY order(d) MATERIALIZED;
INDEX customer(Order o), date(o);