powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Реляционка тут бессильна?
25 сообщений из 169, страница 1 из 7
Реляционка тут бессильна?
    #39518944
registerers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот есть такой теоретический вопрос о реляционных связях между гетерогенными структурами данных. Матюк страшный, но на самом деле всё просто и такая проблема довольно часто возникает на практике, например в интернет-магазинах, всевозможных CRM-системах и не только.

Суть проблемы можно пояснить на примере того же банального интернет-магазина. Есть множество таблиц разных товаров, потому что набор свойств (атрибутов) у них разный. Например, булка хлеба и како-нибудь девайс. Вопрос - как положить в корзину и то, и другое, и пятое-десятое? Самое простое, что приходит в голову - это в таблице корзины выделить одно поле под айди товара, а другое - под ... (барабанная дробь) ... НАЗВАНИЕ ТАБЛИЦЫ, к которой относится этот айдишник. Но это же костыль-костыльный... Потому что никаких реляционных связей тут не построишь.



Мне в голову приходит только два типичных решения - это либо использования паттерна EAV (entity, attribute, value), либо все уникальные атрибуты каждого из видов товара держать в поле с особым типом данных - JSON/JSONB, как в БД PostgreSQL. Тогда, естесственно, сущность (таблица) будет одна и её можно спокойно класть в корзину.

Так вот интересно, существуют ли какие то более элегантные решения этой проблемы?
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39518946
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerersЕсть множество таблиц разных товаров, потому что набор свойств (атрибутов) у них разный.
"Множество таблиц2 - глупость несусветная.
Есть стандартное решение.
Таблица товаров
Таблица свойств.
Таблица связей (чаще всего групп связей)
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39518951
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Погуглите проблему.
Десятки раз она обсасывалась.

https://zlob.in/2013/01/struktura-tablic-dlya-kataloga-tovarov-internet-magazina/
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39518968
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про supertype-subtype слышали?
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519361
registerers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183"Множество таблиц2 - глупость несусветная.

Множество таблиц - это и есть паттерн Flat tables, который описан в приведенной вами ссылки (кстати, спасибо за ссылку)

982183Таблица связей (чаще всего групп связей)

А вот про таблицу связей можно подробнее?
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519364
registerers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor TiegaelПро supertype-subtype слышали?
Описанный мной костыль и есть паттерн supertype-subtype, разве нет?
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519380
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerersEnnor TiegaelПро supertype-subtype слышали?
Описанный мной костыль и есть паттерн supertype-subtype, разве нет?

Нет. В означенном паттерне нет никаких tablename
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519405
registerers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот МатроскинНет. В означенном паттерне нет никаких tablename

Атрибут TableName в моём случае играет роль Type, суть одна. Это антипаттерн, так как смешиваются данные и метаданные. Другими словами, средствами РСУБД невозможно исключить ситуацию, когда в двух и более таблицах подтипа внешний ключ указывает на одну запись супертипа. В этом случае изменение типа приводит к нарушению ссылочной целостности
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519424
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заведите общего предка для продуктов с двумя (пока) полями id primary key, name unique
Наложите на ProductA ProductB FK reference на эту общую таблицу
Эта же таблица будет удобна для поиска (в нее можно напихать индексированных полей для быстрого поиска) по всем товарам.
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519427
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerers Это антипаттерн, так как смешиваются данные и метаданные.

Не более, чем при использовании суррогатного ключа в таблице. Может, суррогатный ключ - это тоже антипаттерн? :)
registerers Другими словами, средствами РСУБД невозможно исключить ситуацию, когда в двух и более таблицах подтипа внешний ключ указывает на одну запись супертипа. В этом случае изменение типа приводит к нарушению ссылочной целостности
Тоже мне, бином Ньютона - включаете поле Type в ключ, накладываете на него соответствующие ограничения в каждой из subtype-таблиц.
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519546
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerersТак вот интересно, существуют ли какие то более элегантные решения этой проблемы?

Вынести атрибуты товаров в универсальную структуру: атрибут-значение.
Делать по таблице на каждый вид товара -- это наверное самое тупое, что вообще только можно выдумать.
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519561
Bsplesk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На самом деле EAV, не так уж и плох, да много join, посмотрите magneto, с jsonb не так все радужно, как малюют, так как вероятно наборы справочников вам все равно придется хранить (дополнительные дубли), + при записи jsonb данные необходимо валидировать, это удобно делать при помощи схем (к примеру одна схема на несколько типов), но допустим json-schema сырая, до xml-schema ещё как до Китая. С динамической моделью данных при работе с jsonb/json-schema тоже не все гладко ... Да и при текущей реализации jsonb это больше одно поле = один объект, иначе замучаетесь разворачивать все таки до работы со сложными графами сущностей все очень сыро, правда в 10 обещают улучшить, но это завязка на конкретную СУБД хоть и открытую....
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519585
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bspleskда много join

join в EAV - тормоза для тех, кому лень программировать обработку наборов данных на
клиенте. Дельфийским мышекликателям настоятельно не рекомендую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519597
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerersМножество таблиц - это и есть паттерн Flat tables, который описан в приведенной вами ссылки (кстати, спасибо за ссылку)
Там же и описываются громадные недостатки этого метода.
registerersА вот про таблицу связей можно подробнее?
А связь номенклатуры и атрибутов вы хранить где думаете?
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519616
Незнайка.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerersмножество таблиц разных товаров, потому что набор свойств (атрибутов) у них разный
На каждый товар - отдельная таблица?
Кому и как такое могло в голову прийти?
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519630
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На каждую группу товаров.
Технология "Flat tables" как было описано в ссылке выше :)
Вещь конечно узко специфичная. Я не сталкивался.
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519633
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И тут уже оказывается всё обсасывалось.
17550595
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519676
Ares_ekb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
982183 https://zlob.in/2013/01/struktura-tablic-dlya-kataloga-tovarov-internet-magazina/
Я голосую за 6НФ. Почему-то по ссылке нет этого варианта. Вроде у Avito используется такой подход, но это не точно.
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519712
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerersEnnor TiegaelПро supertype-subtype слышали?
Описанный мной костыль и есть паттерн supertype-subtype, разве нет?Вообще ничего общего.

Делается одна таблица, условно говоря Products, которая выступает корнем вашей товарной иерархии. Туда можно поместить атрибуты, общие для всех (или почти всех) видов товаров: название, внутренний код, вес, Д*Ш*В, (возможно) цена и т.д.

На эту таблицу ссылаются все остальные товарные категории, причем первичный ключ из нее можно наследовать и использовать в качестве ключа в самих дочках.

На эту же таблицу будет ссылаться корзина. Только вот, зачем у вас корзина ссылается на заказы? Во всех магазинах, какие я видел, если товар лежит в корзине, значит заказ на него еще не существует, ммм? Корзину лучше сделать М:М связкой между Products и Customers, как у всех.
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39519745
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerers982183Таблица связей (чаще всего групп связей)

А вот про таблицу связей можно подробнее?
гуглите "Нормальная Форма"
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39520499
registerers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот МатроскинМожет, суррогатный ключ - это тоже антипаттерн? :)
Да, суррогатный ключ - это тоже метаданные, но не смотря на то, что этот атрибут содержится в сущностях наряду с другими, в РСУБД, ключи обеспечены механизмами обеспечения ссылочной целостности через наложение ограничений (constraints).

Кот Матроскинвключаете поле Type в ключ, накладываете на него соответствующие ограничения в каждой из subtype-таблиц
Интересно, как вы себе представляете эти "соответствующие ограничения"?))
Вот, например, физическая модель, из которой видно, что любая из subtype-таблиц может ссылаться на одну и ту же запись в supertype-таблице:


Кстати, если это не костыль, то напишите JOIN-запрос для такого кейса)))
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39520506
registerers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу тезиса "делать по таблице на каждый вид товара - это самое тупое, что только можно придумать", отвечу сразу, чтоб закрыть этот вопрос. Есть такая штука, как компромисс между гибкостью и производительностью. Если гибкость не нужна, то юзаем Flat Tables, если нужна - EAV, NoSQL etc. И. кстати, кроме НФ есть ещё такое понятие как денормализация , которую как раз и применяют для оптимизации производительности.
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39520509
registerers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovBspleskда много join

join в EAV - тормоза для тех, кому лень программировать обработку наборов данных на
клиенте. Дельфийским мышекликателям настоятельно не рекомендую.

это как? выгребать все данные потаблично и джойнить на клиенте?? о_О
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39520511
registerers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
982183Там же и описываются громадные недостатки этого метода.
registerersА вот про таблицу связей можно подробнее?
А связь номенклатуры и атрибутов вы хранить где думаете?
Не совсем понимаю, о чём вы. Вместо тысячи слов лучше нарисуйте пример диаграммы на draw.io
...
Рейтинг: 0 / 0
Реляционка тут бессильна?
    #39520525
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
registerersэто как? выгребать все данные потаблично и джойнить на клиенте??

Нет: делать PIVOT на клиенте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 169, страница 1 из 7
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Реляционка тут бессильна?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]