Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
«EAV. Вызывает у меня стойкую неприязнь, да и сказано и написано об этом было очень много всего негативного (Кайт, Фаулер, Карвин, Горман). Главный минус в том, что при написании запросов приходится оперировать уже не реальными сущностями («Сотрудник», «Дом», «Клиент», то для чего и предназначен SQL), а объектами, орагнизованными на более низком уровне (извините за сумбур). Поэтому это был самый не желательный вариант.»
"— Бедный язык запросов (ИМХО) + отсутствие джойнов;"
"— Отсутствие схем (хорошая статья недавно была на эту тему "
"— Отсутствие встроенной поддержки ссылочной целостности;"
"— Отсутствие прибамбасов в виде хранимых процедур/функций, триггеров, представлений и многого другого."
"— В моем приложении помимо данных с гибкой(изменяемой) структурой также необходимо хранить обычные статические данные — таблица пользователей, посещений, сотрудников и т.д. Работать с которыми (опять же имхо) гораздо проще и (самое главное) надежнее в обычной реляционной базе (та же самая ссылочная целостность и пр.)."
select price.goods_id from parameters price join categories priceCategory on priceCategory.id=price.category_id and priceCategory.name="Цена" and price.numericValue>100.0 and price.numericValue<200.0 join parameters color join categories colorCategory on colorCategory.id=color.category_id and colorCategory.name="Цвет" and (color.stringValue="Поносный" or color.stringValue="Жёлтый")
select price.goods_id from parameters price join categories priceCategory on priceCategory.id=price.category_id and priceCategory.name="Цена" and price.numericValue>100.0 and price.numericValue<200.0 join parameters color join categories colorCategory on colorCategory.id=color.category_id and colorCategory.name="Цвет" and (color.stringValue="Поносный" or color.stringValue="Жёлтый") join parameters kind join categories kindCategory on kindCategory.id=kind.category_id and kindCategory.name="Изделие" and (kind.stringValue="Чайник" or kind.stringValue="Самовар")
select *
from objects C
where ((xpath('/Изделие/Наименование/text()', O.body))[1]::text::int in ('Чайник', 'Самовар')
and ((xpath('/Изделие/Цвет/text()', O.body))[1]::text::int in ('Желтый', 'Поносный')
and ((xpath('/Изделие/Цена/text()', O.body))[1]::text::int between 100.0 and 200.0;
В-нулевых, для EAV можно и нужно написать хороший ORM, который будет вас абстрагировать от низкоуровневых объектов.
Во-первых, для производительности нужно грамотно настроить индексы и саму db а так же можно делать view's (в оракле) или аналоги в других db.
Не зря, например Magento, на EAV работает.
— Бедный язык запросов (ИМХО) + отсутствие джойнов;
Postgre(no)SQL или снова о хранении данных с гибкой структурой