В EAV структура следующая(Сократил сущности для простоты понимания)
Item
-id
Attribute
-id
-name
-is_filter
Value
- id
- attribute_id
- value
Item_Value
-item_id
-value_id
Я хочу перенести это в сущность Item и хранить в jsonb.
Но возникают проблема. Одна из них целостность данных.
В случае использования EAV мы меняем Value в таблице Value и это значение измениться для всех Item. Но как это реализовать в jsonb ? и перенести эту струтуру
Если ты говоришь о нормализации - то никак. JSON не предполагает никаких ссылочных связей внутрь документа. Считай что JSON - это денормализованная копия БД. Как с этим жить - большой вопрос. И его надо обсуждать поняв что тебе на самом деле нужно. Потому что конвертация EAV в JSON это какая-то странная очень узкая задача. Может тебе на самом деле это и не надо.
Мне смущается что у меня будет такая проблема
{
{'Model': Samsung},
{'Model': Samsung}
}
Образно говоря нету целостности данных это раз. Ибо в одном переименовываем самсунг, в другом он остается.. Вторая проблема, это когда будет делаться фильтр на сайте, мне нужно получить все значения, но при этом уникальные. Что тоже накладные расходы. Вот и ломаю голову. Перечитал кучу статей и рекомендуют вместе EAV юзать jsonb
Александр, Что реализовать? Там есть пример, просто переносите на вашу модель.
Проверку целостности? Так же как и обычно.
Все проверки в СУБД - это последний барьер защиты. Если вы всегда полагается на них, то у вас проблемы с бизнес логикой.
Если именно, про что в EAV, можно поменять имя свойства, и оно везде поменяется. Ну вы можете извратиться в JSON и хранить ID свойств полей. Но нужно вам этом? Как часто компании меняют названия? Раз в 10 лет? Ничего не мешает вам написать скрипт, который постепенно переименует в полях нужное значение.
П.С На самом деле у вас точно такая же проблема будет и в EAV, потому что чтобы EAV работал хотя бы чуточку быстрее вам придётся его кэшировать. Ну и представьте сбросить кэш для 1 млн товаров :)
mayton2019, Проблема в jsonb как мне выбрать все фильтры мои - поля, и как проверять фильтер это или нет. Раньше была таблица chatacteristics где были все характеристики и там было поле is_filter