Bitrix Best Practice SQL
Скилл помогает понять, какие нужно использовать SQL/DB best practices. Используй его только для задач, где есть работа с базой данных: схема, SQL-запросы, ORM-модели, выборки, запись, миграции данных, индексы, транзакции или другие DB-boundary решения.
Как использовать
- Определи, действительно ли задача затрагивает SQL, ORM или хранение данных.
- Выдели конкретную DB-область задачи: чтение, запись, схема, миграция, производительность, консистентность или безопасность запроса.
- Открой только те rule-файлы, которые напрямую относятся к этой DB-области.
- Сначала следуй более строгим правилам репозитория и ограничениям модуля.
- Предпочитай framework-native и Bitrix-native паттерны работы с данными вместо самодельных SQL- и storage-абстракций.
Выбор rule-файла
Когда читать rules/query-execution.md
Читай rules/query-execution.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\Application::getConnection(),Bitrix\Main\DB\ConnectionилиgetSqlHelper();query(),queryScalar(),queryExecute(),add(),addMulti()илиBitrix\Main\DB\Result;Bitrix\Main\DB\SqlExpression, placeholders?s,?i,?f,?#,?@или ручную сборку SQL из частей;SqlHelper::quote(),forSql(),prepareInsert(),prepareUpdate(),convertToDb*()илиgetTopSql();- замену legacy
$DB/CDatabaseна D7 DB API; - выбор между raw SQL через
Connectionи более высокоуровневым framework-native DB path.
Когда читать rules/orm-datamanager-map.md
Читай rules/orm-datamanager-map.md, если задача затрагивает хотя бы одну из этих областей:
- класс
*Table extends Bitrix\Main\ORM\Data\DataManager; getTableName(),getConnectionName(),getMap(),getUfId(),postInitialize()илиsetDefaultScope();- описание полей через
Bitrix\Main\ORM\Fields\Fieldи наследников вместо legacy array map; Reference,OneToMany,ManyToMany,configureJoinType(),configureCascade*Policy()именно на уровне декларации сущности;- primary key, autocomplete, validators, save/fetch modifiers, title и default values в entity map;
- выбор между typed field objects и старым массивом в
getMap().
Когда читать rules/orm-objectify.md
Читай rules/orm-objectify.md, если задача затрагивает хотя бы одну из этих областей:
Bitrix\Main\ORM\Objectify\EntityObject,Collection,createObject(),createCollection(),wakeUpObject()илиwakeUpCollection();get(),require(),remindActual(),fill(),isFilled(),isChanged(),collectValues();- работу с relation graph через
addTo(),removeFrom(),removeAll()или collection lifecycle; Collection::walk(),filter(),find(),merge(),hasByPrimary()илиgetByPrimary();- выбор между Objectify-объектами и массивами результата;
- object state (
RAW,ACTUAL,CHANGED,DELETED) и in-memory поведение ORM.
Когда читать rules/orm-query-filter.md
Читай rules/orm-query-filter.md, если задача затрагивает хотя бы одну из этих областей:
DataManager::query(),getList(),getRow(),getByPrimary()илиgetCount();Bitrix\Main\ORM\Query\Query,Query::filter(),ConditionTree,where*,having*,logic()или nested filters;fetchObject(),fetchCollection(),fetch(),fetchAll()и выбор между object fetch и массивами;- runtime fields,
registerRuntimeField(),Query::expr(),ExpressionFieldв query-path; buildFilterSql(),disableDataDoubling(), private fields, aggregation/object-fetch restrictions;- выбор между modern query builder и legacy filter array.
Когда читать rules/orm-persistence-write.md
Читай rules/orm-persistence-write.md, если задача затрагивает хотя бы одну из этих областей:
DataManager::add(),update(),delete(),addMulti(),updateMulti()или object/collectionsave();DeleteByFilterTrait::deleteByFilter(),MergeTrait::merge()или low-level ORM write helpers;Bitrix\Main\ORM\Data\AddStrategy,InsertIgnore,Merge,MergeByDefaultTrait,InsertIgnoreByDefaultTrait,AddMergeTraitилиAddInsertIgnoreTrait;- выбор между обычной ORM-записью, batch-операцией, merge/upsert и delete-by-filter;
- события ORM при записи,
ignoreEvents, cache cleanup и caveats batch persistence; - массовая запись или обновление нескольких строк через ORM lifecycle.