Атрибуты и модель данных#
Общая позиция#
Проектный разработчик не должен добавлять атрибут в существующий типовой класс напрямую без анализа способа реализации.
Перед добавлением атрибута необходимо определить:
зачем нужен атрибут;
где он будет храниться;
кто будет его заполнять;
где он будет отображаться;
участвует ли он в фильтрации;
участвует ли он в отчетах;
участвует ли он в интеграциях;
требуется ли индекс или внешний ключ;
должен ли атрибут переживать обновления типовой поставки без конфликтов.
Характеристика через интерфейс#
Если дополнительное проектное поле добавляется через интерфейс, оно оформляется как объектная или универсальная характеристика. Такой способ не добавляет атрибут в ODM/ORM-модель класса и не требует изменения схемы БД.
Такой подход подходит для:
дополнительных аналитических признаков;
проектных комментариев;
признаков, используемых в интерфейсе;
данных, которые различаются по типам объекта;
значений по умолчанию и дополнительных проверок, настраиваемых через интерфейс;
полей, которые нужно быстро добавить без поставки нового кода.
Для таких полей используется объектная или универсальная характеристика с проектным суффиксом _z. Правила именования проектных характеристик описаны в разделе Проектное именование.
Атрибут ODM через код#
Если поле должно стать частью устойчивой модели данных класса, оно добавляется через ODM и поставляется как часть проектного модуля.
Такой подход обязателен, если:
атрибут нужен в массовой обработке;
атрибут участвует в бизнес-логике Api или Pkg;
атрибут используется в частых отчетах или сложных запросах;
атрибут должен индексироваться;
атрибут является внешним ключом;
атрибут должен участвовать в транзакционной логике;
по атрибуту требуется выполнять производительную фильтрацию;
атрибут входит в интеграционный контракт.
Для проектного атрибута ODM также используется суффикс _z. Правила именования проектных атрибутов описаны в разделе Проектное именование.
При добавлении через ODM необходимо:
Добавить атрибут в проектный ODM-файл.
Выполнить генерацию исходного кода.
Выполнить генерацию или миграцию таблицы поддерживаемым способом.
Проверить сгенерированные Dpi/Dvi и прикладные Api/Avi.
Добавить отображение атрибута в выборки и карточки, если это требуется.
Добавить тестирование логики, использующей атрибут.
JSON-атрибуты и формат дат#
Если дата хранится в JSON, она должна сохраняться в едином формате:
dd.mm.yyyy hh24:mi:ss
При формировании JSON на стороне БД дату необходимо явно преобразовывать через to_char с заданным форматом. При чтении даты из JSON в запросе необходимо использовать to_date с заданным форматом.
Не следует рассчитывать на неявное преобразование даты средствами БД. На результат может влиять настройка формата даты в СУБД, например DateStyle.
Если JSON формируется SQL-запросом, даты необходимо явно приводить к формату, который ожидает прикладный парсер. Если дата была сформирована через неявное преобразование БД, последующая обработка JSON в прикладном коде может завершиться ошибкой.
Создание нового проектного класса#
Новый проектный класс создается, если требуется самостоятельная проектная сущность, которая должна храниться в отдельной таблице и иметь собственную бизнес-логику.
Для нового класса необходимо определить:
назначение класса;
супертип класса;
состав атрибутов;
связи с другими классами;
коллекции;
бизнес-объект, если класс входит в состав бизнес-объекта;
выборки и отображения;
права доступа;
необходимость аудита;
необходимость участия в интеграциях и репликации;
правила установки начальных данных.
Выбор супертипа класса#
Супертип выбирается по назначению класса:
Супертип |
Когда использовать |
|---|---|
|
для справочников и списочных сущностей |
|
для документов с жизненным циклом и состояниями |
|
для табличных частей и подчиненных данных |
|
для коллекций с переменной ссылкой на родителя |
|
для журналов и больших массивов записей с ограниченной логикой |
|
для переиспользуемой логики без собственной таблицы |
|
для общей структуры или логики, подключаемой к разным классам |
Генерация кода#
После изменения ODM выполняется генерация исходного кода.
При генерации создаются доменные и прикладные элементы:
Dpi— доменная автономная логика;Api— прикладная автономная логика;Dvi— доменная интерактивная логика;Avi— прикладная интерактивная логика;Dvm— доменная разметка выборки;Avm— прикладная разметка выборки;POJO/ARO-объекты интеграции с ORM.
Доменная часть перезаписывается при кодогенерации. Проектная логика должна размещаться в прикладной части.
Запрещено размещать ручной проектный код в файлах, которые перезаписываются кодогенератором.
Команду Generate Tables Force запрещено выполнять от папки application, папки модуля или пакета. Ее можно использовать только по конкретным ODM-файлам и только при понимании последствий.
Запрет на ручное изменение БД#
Физическое изменение структуры таблиц напрямую в БД без отражения в проектных исходниках запрещено.
Если проектное изменение требует изменения схемы БД, оно должно быть воспроизводимо:
через ODM;
через миграционный пакет;
через SQL-скрипт миграции;
через другой поддерживаемый механизм поставки.
Ручное изменение БД допустимо только как разовая диагностическая или аварийная операция, если оно согласовано и зафиксировано отдельно. Такое изменение не считается полноценной проектной поставкой и должно быть воспроизведено в коде или миграции, если оно должно сохраниться.