Перейти к содержанию

EAV

EAV (Entity-Attribute-Value, Сущность-Атрибут-Значение) - это гибкая модель данных, предназначенная для хранения нечетких или специальных атрибутов для сущности, когда количество и суть атрибутов сложно определить.

Эту модель так же встретить можно под такими названиями - OAV (object-attribute-value), вертикальная модель, открытая схема.

Выглядит это так:

Суть в том, что у нас есть таблицы с сущностями и атрибутами, на которые мы ссылаемся в третьей таблице со значениями, где мы для каждого атрибута и сущности можем установить необходимое нам значение или несколько (создав несколько строк).

Где используется?

Самый банальный пример - товары в интернет-магазине.

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

Таким образом, EAV используют там, где нужна максимальная гибкость и универсальность, с точки зрения структуры данных. В таком случае, мы можем менять количество свойств (атрибутов) у сущности без изменения таблицы, присваивать свойствам несколько значений.
При правильном применении избыточность практически не наблюдается, но EAV не всегда умеют готовить.

Из минусов можно отметить то, что для вставки и обновления данных необходимо использовать несколько запросов, иногда может быть проблема с обеспечением целостности данных. Иногда, для обеспечения целостности, возможные атрибуты жестко привязывают к типу сущностей.

Альтернативы

Практически во всех новых реляционных БД можно хранить сущности в виде JSON. Для упрощения и избежания лишних связей и проблем со вставками можно воспользоваться jsonb колонками.

Ссылки