EAV работает довольно хорошо, так как вы часто можете отображать значения карты на несколько основных типов. В личном проекте у нас есть таблица с:
entity_id : INTEGER REFERENCES entities(id)
attr_id : INTEGER REFERENCES attributes(id)
value_bool : BOOLEAN
value_int : INTEGER
value_string : VARCHAR
value_text : TEXT
А информация об attr_id хранится в другой таблице, где мы можем найти атрибут
Тип и имя и тому подобное. Кроме того, разница между строкой и текстом заключается в том, что текст может иметь индекс поиска «полный текст», в то время как строка - это только базовое индексирование соответствия.
Когда вы хотите запросить attrbute, вы ищите его в таблице атрибутов, затем создаете запрос, устанавливая правильное условие, например "WHERE attr_id = 12 AND value_string = 'sfds'".
Чтобы ускорить запросы, создайте условный индекс для двух столбцов, например:
CREATE INDEX test ON eav(attr_id, value_int) WHERE value_int IS NOT NULL;
Альтернативой также является наличие пользовательской функции db, которая может индексировать и искать столбец, содержащий поле JSON. Намного тяжелее работать ...