Вопрос про jsonb

junior17

Новичок
Здравствуйте,

Вопрос немного теоретический. Допустим есть таблицы:

attributes

id, title

products

id, title, attr (jsonb)

В поле attr ключом является название атрибута из таблицы attributes. Допустим название атрибута поменялось, как в таком случае решается проблема ссылочной целостности? Я так понимаю в jsonb внешние ключи не поддерживаются. Просьба опытным товарищам подсказать. Спасибо.
 

junior17

Новичок
А зачем так, почему не id? И почему вообще jsonb, что в значениях?

Вообще, взялся за денормализацию - обеспечивай ссылочную целостность самостоятельно.
Ну допустим в таблице attributes есть список атрибутов

1 Размер экрана
2 Макс. разрешение
3 Тип духовки

В таблице products в столбце attr атрибуты храним в формате json, так как у товаров могут быть произвольные атрибуты

{"Размер экрана": 24, "Макс. разрешение": 800X480}

Или такой подход неправильный?
 

fixxxer

К.О.
Партнер клуба
Или такой подход неправильный?
Это неправильный вопрос. Тут не может быть ничего правильного или неправильного вообще, это не математика. Если работает - то правильно.

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

junior17

Новичок
А зачем вообще тогда таблица attributes?
Для привязки к категориям, есть еще таблица category_and_attributes.

Это сделано для того чтобы:

1) При выборе категории для товара, выводить атрибуты относящиеся к данной категории
2) Фильтр товаров по атрибутам на странице категории. Должны выводиться атрибуты относящиеся к данной категории.
 
Последнее редактирование:

junior17

Новичок
Это неправильный вопрос. Тут не может быть ничего правильного или неправильного вообще, это не математика. Если работает - то правильно.

Вопрос в том, какую ты задачу решаешь. И чем, скажем, не устроил классический EAV. Для денормализации всегда нужна причина.
Я пока что только изучаю, для практики решил сделать что-то на подобии интернет магазина. В данный момент сделал EAV.. Хочется разобраться и с таким подходом. Получается что если поменяем название атрибута в таблице attributes, придется в ручную менять ключи в products.attr?
 
Последнее редактирование:

junior17

Новичок
Ты не ответил на вопрос:
Имеете ввиду так?

{1: 24, 2: 800X480}

Но тогда ведь получается большое количество JOIN-ов? Например на странице фильтра товаров, надо выводить список товаров вместе с характеристиками
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Достаточно знать все id, которые встречаются, сделать один IN-запрос и получить карту соответствий, которой пользоваться при выводе. А если атрибутов не шибко много - можно и вообще все в память читать.

Если там хранить title-ы, то в случае переименования тебе придется обходить весь список товаров, который может быть огромным. В качестве отдельного мысленного упражнения представь себе ситуацию, когда кто-то правит там опечатки по 3 штуки в секунду, а товаров у тебя миллион.
 

junior17

Новичок
Достаточно знать все id, которые встречаются, сделать один IN-запрос и получить карту соответствий, которой пользоваться при выводе. А если атрибутов не шибко много - можно и вообще все в память читать.

Если там хранить title-ы, то в случае переименования тебе придется обходить весь список товаров, который может быть огромным. В качестве отдельного мысленного упражнения представь себе ситуацию, когда кто-то правит там опечатки по 3 штуки в секунду, а товаров у тебя миллион.
Ясно, спасибо за помощь
 
Сверху