Как перенести EAV на jsonb в postgres?
В 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 - Александр, ану дай статью где такое рекомендуют.
- mayton2019, https://docs.evolveum.com/midpoint/projects/midsca...
https://habr.com/ru/post/475178/ - Александр, и правильно что рекомендуют. Лучше JSONB ничего нет, особенно когда касается скорости.
JSON - это по сути NoSQL, а там целостность данных ложится на плечи программиста, а не СУБД.
https://coussej.github.io/2016/01/14/Replacing-EAV...EAV проигрывает jSONB на несколько порядков.
- tukreb, но как это реализовать ?)
- Александр, Что реализовать? Там есть пример, просто переносите на вашу модель.
Проверку целостности? Так же как и обычно.
Все проверки в СУБД - это последний барьер защиты. Если вы всегда полагается на них, то у вас проблемы с бизнес логикой.
Если именно, про что в EAV, можно поменять имя свойства, и оно везде поменяется. Ну вы можете извратиться в JSON и хранить ID свойств полей. Но нужно вам этом? Как часто компании меняют названия? Раз в 10 лет? Ничего не мешает вам написать скрипт, который постепенно переименует в полях нужное значение.П.С На самом деле у вас точно такая же проблема будет и в EAV, потому что чтобы EAV работал хотя бы чуточку быстрее вам придётся его кэшировать. Ну и представьте сбросить кэш для 1 млн товаров :)
- mayton2019, Проблема в jsonb как мне выбрать все фильтры мои - поля, и как проверять фильтер это или нет. Раньше была таблица chatacteristics где были все характеристики и там было поле is_filter
- Александр,
Раньше была таблица chatacteristics где были все характеристики и там было поле is_filter
А куда щас эта таблица делась?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для переноса EAV (Entity-Attribute-Value) модели данных на jsonb в PostgreSQL, вам потребуется выполнить несколько шагов.
1. Создайте новое поле типа jsonb в вашей таблице, которое будет хранить все атрибуты сущности в виде JSON объекта. Например, если у вас есть таблица "entity" с полями "id" и "attributes", то вы можете создать новое поле "attributes_jsonb".
2. Напишите скрипт для переноса данных из старой EAV структуры в новую jsonb структуру. Вам потребуется извлечь все атрибуты из таблицы EAV и собрать их в JSON объект, который будет сохранен в новом поле jsonb.
Пример SQL запроса для создания нового поля "attributes_jsonb" и переноса данных:
ALTER TABLE entity ADD COLUMN attributes_jsonb JSONB; UPDATE entity SET attributes_jsonb = jsonb_object_agg(attribute_name, attribute_value) FROM ( SELECT id, attribute_name, attribute_value FROM eav_table ) eav WHERE entity.id = eav.id GROUP BY id;
3. После того как данные успешно перенесены, вам нужно будет обновить вашу логику приложения, чтобы работать с новой jsonb структурой данных. Теперь вам не нужно будет делать дополнительные запросы к таблице атрибутов, так как все атрибуты будут храниться в одном JSON объекте.
4. Не забудьте провести тестирование вашего приложения после переноса данных, чтобы убедиться, что все работает корректно.
Это основные шаги, которые вам нужно выполнить для переноса EAV на jsonb в PostgreSQL. Не забудьте создать резервную копию данных перед выполнением любых изменений в базе данных.