БесплатноБесплатный прототип ключевой страницы и черновик ТЗ при старте проекта

Хранение характеристик товаров: EAV vs JSONB vs отдельные таблицы

Хранение характеристик товаров на 1С-Битрикс: EAV инфоблоков, JSON, отдельные таблицы и Highload-блоки

Каталог рос незаметно: сначала пара тысяч товаров с десятком свойств, потом сотни тысяч позиций и полсотни характеристик у каждой. И вот умный фильтр, который раньше отвечал мгновенно, задумывается на секунды, а страница категории еле собирается. Корень проблемы почти всегда один — модель хранения характеристик, выбранная в самом начале и не рассчитанная на такой объём.

В этой статье разберём три подхода к хранению характеристик товаров в контексте 1С-Битрикс: EAV, на котором построены инфоблоки, отдельные таблицы и Highload-блоки, а также хранение в JSON. Посмотрим, как каждый влияет на фильтр и скорость, и когда что применять. Если каталог уже тормозит, начать стоит с диагностики — это аудит и оптимизация 1С и связки сайта с учётной системой.

Коротко

  • Инфоблоки Битрикс построены на EAV: гибко добавлять свойства, но тяжёлые запросы при выборках.
  • Highload-блоки хранят данные в нормальных колонках и хорошо индексируются — для больших справочников.
  • JSON уместен для редких описательных атрибутов, не участвующих в фильтрации.
  • На большом каталоге ключ к скорости фильтра — фасетный индекс, то есть денормализация ради выборки.

Почему хранение характеристик — это про производительность

Характеристики товара кажутся простой вещью: цвет, размер, бренд, вес. Но именно от того, как они физически лежат в базе, зависит скорость двух самых нагруженных сценариев магазина — вывода каталога и работы умного фильтра. Одна и та же логическая структура «товар и его свойства» может быть реализована так, что фильтр летает, или так, что он падает под нагрузкой.

Проблема в конфликте требований. Бизнесу нужна гибкость: заводить новые свойства на лету, без участия разработчика. Базе данных для скорости нужна жёсткая структура: колонки с индексами, по которым быстро выбирать. Эти требования тянут в разные стороны, и каждая модель хранения — это компромисс между ними. Понимание компромисса и позволяет выбрать верно.

EAV: как устроены свойства инфоблоков

EAV (Entity-Attribute-Value) — модель, в которой характеристики хранятся не столбцами таблицы товаров, а отдельными строками вида «товар — свойство — значение». Именно на ней построены инфоблоки 1С-Битрикс: значения свойств лежат в служебных таблицах и связываются с элементом по идентификатору.

Сильная сторона EAV — гибкость. Новое свойство добавляется через интерфейс, без изменения схемы базы и без миграций: контент-менеджер заводит характеристику, и она сразу доступна. Для магазина, где ассортимент и его атрибуты постоянно меняются, это огромное удобство.

Плата — производительность выборок. Чтобы собрать товар со всеми свойствами или отфильтровать по нескольким характеристикам, нужны джойны по таблице значений: каждое свойство — это ещё одно соединение. На небольшом каталоге незаметно, на крупном — превращается в тяжёлые запросы. Поэтому Битрикс поверх EAV строит дополнительные оптимизации, о которых ниже.

От номенклатуры до витрины каталога Номенклатуратовары из 1ССвойства и SKUхарактеристикиКарточкафото, описаниеИндекспоиск и фильтрКаталогвитрина клиенту
Схема: номенклатура из 1С обрастает свойствами и торговыми предложениями, наполняется контентом карточки и индексируется — так формируется витрина, по которой ищут и фильтруют.

Отдельные таблицы и Highload-блоки

Противоположность EAV — нормальная реляционная таблица, где каждая характеристика это отдельная колонка со своим индексом. Выборка и фильтрация по такой структуре максимально быстры: база делает то, для чего создана. Минус — жёсткость: чтобы добавить свойство, нужно менять схему.

В 1С-Битрикс этот подход воплощён в Highload-блоках. Это отдельные сущности, данные которых хранятся в собственной таблице с колоночной структурой и хорошо индексируются. Их применяют там, где EAV-свойства инфоблока начинают буксовать:

Работать с Highload-блоками удобно через D7 ORM — про этот слой мы подробно писали в статье D7 ORM в Битрикс: типизированные сущности, связи и запросы делают код с большими справочниками поддерживаемым.

JSON: когда это оправдано

Третий подход — хранить набор характеристик в одном поле как JSON. Штатно Битрикс работает поверх MySQL, где нет полноценного JSONB как в PostgreSQL, но есть тип JSON и функции для работы с ним. Соблазн понятен: свалить все разнородные атрибуты в одно поле и не плодить свойства.

Однако JSON уместен в узком случае — для редких, описательных, разнородных атрибутов, которые не участвуют в фильтрации и сортировке. Например, технические подробности, которые показываются в карточке, но по ним никто не фильтрует. Для полей, по которым идёт фильтр, JSON — плохой выбор: индексировать и выбирать по вложенным значениям сложнее и медленнее, чем по обычным колонкам, а умный фильтр Битрикс с таким хранением штатно не работает.

Правило: если по характеристике нужно фильтровать, сортировать или искать — ей место в индексируемом свойстве или Highload-блоке, а не в JSON. JSON — только для того, что просто показывается.

Сравнение трёх подходов

Сведём подходы в таблицу по ключевым для магазина критериям.

КритерийEAV (свойства инфоблока)Highload / таблицыJSON-поле
Гибкость добавленияВысокаяНизкая (нужна миграция)Высокая
Скорость фильтрацииСредняя (нужен фасет)ВысокаяНизкая
ИндексацияЧерез фасетный индексНативная по колонкамОграниченная
Объём данныхДо крупного с оптимизациейМиллионы записейНебольшой
Интеграция с фильтромПолная (штатно)Через справочники/свойстваНет
Роль в проектеОсновные свойстваБольшие справочникиОписательные атрибуты

Из таблицы виден главный вывод: не бывает «лучшего» подхода в вакууме. EAV выигрывает в гибкости, таблицы — в скорости, JSON — в простоте для несущественных данных. Реальные проекты комбинируют их.

Как модель влияет на умный фильтр

Умный фильтр (catalog.smart.filter) — самый чувствительный к модели хранения компонент. Он строит запросы по выбранным характеристикам, и на каждое свойство в EAV приходится дополнительное соединение с таблицей значений. Когда пользователь отмечает пять-шесть свойств на каталоге в сотни тысяч товаров, «наивный» запрос по EAV становится неприемлемо медленным.

Поэтому производительность фильтра определяется не только тем, много ли у вас свойств, но и тем, как они хранятся и индексируются. Для интенсивной фильтрации на большом каталоге EAV без дополнительной оптимизации не годится — нужен фасетный индекс. Для характеристик, вынесенных в Highload-блоки и справочники, выборка идёт быстрее за счёт нормальной индексации.

Фасетный индекс и денормализация

Чтобы примирить гибкость EAV со скоростью фильтра, Битрикс использует фасетную индексацию. Это предрассчитанная структура — по сути таблица соответствий «свойство-значение — товар», по которой умный фильтр выбирает подходящие позиции без тяжёлых джойнов по таблице значений.

По природе это денормализация: данные о свойствах дублируются в форме, удобной для фильтра, ради скорости выборки. Важные следствия:

Фасетный индекс — стандартный и обязательный инструмент для больших каталогов. Без него любая красивая модель хранения упрётся в медленный фильтр.

Гибридная модель на практике

На реальных проектах побеждает не одна модель, а их осознанное сочетание. Типовое разделение выглядит так:

  1. Фильтруемые характеристики — свойства инфоблока с фасетом. Цвет, размер, бренд, диапазоны — то, по чему покупатель фильтрует, лежит в индексируемых свойствах.
  2. Большие справочники — Highload-блоки. Обширные списки значений и данные с высокой нагрузкой на выборку выносятся в отдельные таблицы.
  3. Описательные атрибуты — JSON или простые поля. То, что только показывается в карточке и не участвует в фильтре.
  4. Торговые предложения — под варианты. Свойства, различающие SKU (размер, цвет), ведутся в торговых предложениях.

Ключ — осознанность: каждая характеристика попадает туда, где её сильные стороны важнее слабых. Такое разделение проектируют заранее, а не выправляют потом, когда каталог уже вырос и фильтр встал.

Связь с обменом 1С по CommerceML

В магазине на Битрикс характеристики почти никогда не заводятся только руками — они приходят обменом с учётной системой по CommerceML и ложатся в свойства инфоблоков и торговых предложений. Поэтому модель хранения нельзя выбирать в отрыве от того, как данные выгружаются из 1С.

Ошибки обмена — отдельная больная тема: «плавающие» коды и рассинхрон структуры ломают и данные, и фильтр. Наведение порядка в этой связке — часть работ по автоматизации, в том числе автоматизации на 1С.

Как выбрать модель под проект

Практический алгоритм выбора для каждой характеристики:

  1. По ней фильтруют? Да — индексируемое свойство инфоблока с фасетом или Highload-блок. Нет — простое поле или JSON.
  2. Сколько значений в справочнике? Тысячи и больше с нагрузкой на выборку — Highload-блок.
  3. Как часто меняется структура? Часто — гибкость EAV. Стабильно и много данных — таблица.
  4. Откуда приходят данные? Согласуйте модель с выгрузкой из 1С по CommerceML.
  5. Каков объём каталога? Сотни тысяч позиций — обязательны фасетный индекс и вынос тяжёлого в Highload.

Если каталог планируется большим, архитектуру хранения закладывают на старте и проверяют на реалистичном объёме данных, а не на десятке тестовых товаров.

Частые ошибки

Чек-лист и вывод

  1. Характеристики классифицированы. Понятно, что фильтруется, что только показывается, где большие справочники.
  2. Фильтруемые свойства индексируются. Включён фасетный индекс, лишнее не индексируется.
  3. Большие справочники в Highload. Объёмные данные вынесены из EAV.
  4. JSON — только для описательного. Никаких фильтруемых полей в JSON.
  5. Модель согласована с 1С. Структура совпадает с выгрузкой по CommerceML.
  6. Переиндексация настроена. Фасет обновляется после массовых изменений и обмена.
  7. Проверено на реальном объёме. Фильтр и каталог протестированы на боевом количестве товаров.

Хранение характеристик — это не абстрактная база данных, а фундамент скорости каталога и фильтра. EAV даёт гибкость, отдельные таблицы и Highload-блоки — скорость, JSON — простоту для несущественного. Ни один подход не универсален; сильные проекты комбинируют их осознанно и опираются на фасетный индекс там, где нужен быстрый фильтр.

Проектируйте модель под реальный объём и под то, как данные приходят из 1С, — и каталог останется быстрым, даже когда вырастет до сотен тысяч позиций с десятками характеристик у каждой.

Частые вопросы

Что такое EAV и почему инфоблоки Битрикс на нём построены?

EAV (Entity-Attribute-Value) — модель, где характеристики хранятся не столбцами, а строками: сущность, атрибут, значение. Инфоблоки 1С-Битрикс используют её, потому что она позволяет добавлять любые свойства товаров без изменения структуры таблиц. Это даёт гибкость: контент-менеджер заводит новое свойство через интерфейс, а не разработчик через миграцию. Плата за гибкость — более сложные и тяжёлые запросы при выборках и фильтрации.

Когда стоит использовать Highload-блоки вместо свойств инфоблока?

Highload-блоки в 1С-Битрикс хранят данные в отдельной таблице с нормальной колоночной структурой и хорошо индексируются. Их применяют для больших справочников и характеристик с миллионами значений, где EAV-свойства инфоблока начинают тормозить. Типичный случай — справочники, привязываемые к товарам, и данные, по которым нужна быстрая выборка и фильтрация на большом объёме.

Можно ли хранить характеристики в JSONB на Битрикс?

Штатно Битрикс работает поверх MySQL, где полноценного JSONB как в PostgreSQL нет, но есть тип JSON и функции для него. Хранить в JSON-поле удобно редко используемые, разнородные атрибуты, которые не участвуют в фильтрации. Для полей, по которым идёт фильтр и сортировка, JSON — плохой выбор: индексировать и выбирать по ним сложнее и медленнее, чем по нормальным колонкам.

Как модель хранения влияет на умный фильтр?

Напрямую. Умный фильтр строит запросы по свойствам товаров, и чем тяжелее модель хранения, тем медленнее фильтр на большом каталоге. EAV-свойства инфоблока требуют джойнов по таблице значений, поэтому для интенсивной фильтрации Битрикс использует индексацию фасетов — отдельную оптимизированную структуру. Без неё фильтр по десяткам свойств на сотнях тысяч товаров будет медленным.

Что такое фасетный индекс в умном фильтре?

Фасетный индекс — это предрассчитанная таблица соответствий «свойство-значение — товар», по которой умный фильтр выбирает подходящие позиции без тяжёлых джойнов по EAV. Битрикс умеет включать индексацию свойств для фильтра, и на большом каталоге это ключевой инструмент производительности. По сути это денормализация ради скорости: данные дублируются в удобной для фильтра форме.

Стоит ли смешивать несколько моделей хранения?

Да, гибридный подход часто оптимален. Основные характеристики, по которым идёт фильтрация, держат как индексируемые свойства инфоблока с фасетным индексом; большие справочники выносят в Highload-блоки; редкие описательные атрибуты можно хранить в JSON-поле. Смешивание оправдано, когда оно осознанно: каждая модель применяется там, где её сильные стороны важнее слабых.

Как обмен с 1С влияет на выбор модели хранения?

Характеристики приходят на сайт обменом по CommerceML и ложатся в свойства инфоблоков и торговых предложений. Модель хранения должна соответствовать тому, как данные выгружаются из 1С: если справочник большой и стабильный, его удобно вести в Highload-блоке; если свойства динамичные — в инфоблоке. Важно, чтобы структура на сайте и в учётной системе были согласованы, иначе обмен ломает данные.

Поделиться:

Каталог тормозит на фильтре и выборках?

Проанализируем модель хранения характеристик, настроим фасетный индекс и Highload-блоки, ускорим фильтр на большом каталоге. Рассчитаем работу по вашему проекту.

Аудит и оптимизация 1С

Редакция B2Bsite

Команда B2Bsite. С 2014 года разрабатываем высоконагруженные каталоги на 1С-Битрикс: проектируем модели хранения характеристик, Highload-блоки и умные фильтры для среднего и крупного бизнеса.

← Все статьи блога