|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Вот есть такой теоретический вопрос о реляционных связях между гетерогенными структурами данных. Матюк страшный, но на самом деле всё просто и такая проблема довольно часто возникает на практике, например в интернет-магазинах, всевозможных CRM-системах и не только. Суть проблемы можно пояснить на примере того же банального интернет-магазина. Есть множество таблиц разных товаров, потому что набор свойств (атрибутов) у них разный. Например, булка хлеба и како-нибудь девайс. Вопрос - как положить в корзину и то, и другое, и пятое-десятое? Самое простое, что приходит в голову - это в таблице корзины выделить одно поле под айди товара, а другое - под ... (барабанная дробь) ... НАЗВАНИЕ ТАБЛИЦЫ, к которой относится этот айдишник. Но это же костыль-костыльный... Потому что никаких реляционных связей тут не построишь. Мне в голову приходит только два типичных решения - это либо использования паттерна EAV (entity, attribute, value), либо все уникальные атрибуты каждого из видов товара держать в поле с особым типом данных - JSON/JSONB, как в БД PostgreSQL. Тогда, естесственно, сущность (таблица) будет одна и её можно спокойно класть в корзину. Так вот интересно, существуют ли какие то более элегантные решения этой проблемы? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 03:25 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersЕсть множество таблиц разных товаров, потому что набор свойств (атрибутов) у них разный. "Множество таблиц2 - глупость несусветная. Есть стандартное решение. Таблица товаров Таблица свойств. Таблица связей (чаще всего групп связей) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 04:00 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Погуглите проблему. Десятки раз она обсасывалась. https://zlob.in/2013/01/struktura-tablic-dlya-kataloga-tovarov-internet-magazina/ ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 04:05 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Про supertype-subtype слышали? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 08:06 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
982183"Множество таблиц2 - глупость несусветная. Множество таблиц - это и есть паттерн Flat tables, который описан в приведенной вами ссылки (кстати, спасибо за ссылку) 982183Таблица связей (чаще всего групп связей) А вот про таблицу связей можно подробнее? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 17:14 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Ennor TiegaelПро supertype-subtype слышали? Описанный мной костыль и есть паттерн supertype-subtype, разве нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 17:15 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersEnnor TiegaelПро supertype-subtype слышали? Описанный мной костыль и есть паттерн supertype-subtype, разве нет? Нет. В означенном паттерне нет никаких tablename ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 17:32 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот МатроскинНет. В означенном паттерне нет никаких tablename Атрибут TableName в моём случае играет роль Type, суть одна. Это антипаттерн, так как смешиваются данные и метаданные. Другими словами, средствами РСУБД невозможно исключить ситуацию, когда в двух и более таблицах подтипа внешний ключ указывает на одну запись супертипа. В этом случае изменение типа приводит к нарушению ссылочной целостности ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 17:58 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Заведите общего предка для продуктов с двумя (пока) полями id primary key, name unique Наложите на ProductA ProductB FK reference на эту общую таблицу Эта же таблица будет удобна для поиска (в нее можно напихать индексированных полей для быстрого поиска) по всем товарам. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 18:24 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerers Это антипаттерн, так как смешиваются данные и метаданные. Не более, чем при использовании суррогатного ключа в таблице. Может, суррогатный ключ - это тоже антипаттерн? :) registerers Другими словами, средствами РСУБД невозможно исключить ситуацию, когда в двух и более таблицах подтипа внешний ключ указывает на одну запись супертипа. В этом случае изменение типа приводит к нарушению ссылочной целостности Тоже мне, бином Ньютона - включаете поле Type в ключ, накладываете на него соответствующие ограничения в каждой из subtype-таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 18:28 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersТак вот интересно, существуют ли какие то более элегантные решения этой проблемы? Вынести атрибуты товаров в универсальную структуру: атрибут-значение. Делать по таблице на каждый вид товара -- это наверное самое тупое, что вообще только можно выдумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 23:02 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
На самом деле EAV, не так уж и плох, да много join, посмотрите magneto, с jsonb не так все радужно, как малюют, так как вероятно наборы справочников вам все равно придется хранить (дополнительные дубли), + при записи jsonb данные необходимо валидировать, это удобно делать при помощи схем (к примеру одна схема на несколько типов), но допустим json-schema сырая, до xml-schema ещё как до Китая. С динамической моделью данных при работе с jsonb/json-schema тоже не все гладко ... Да и при текущей реализации jsonb это больше одно поле = один объект, иначе замучаетесь разворачивать все таки до работы со сложными графами сущностей все очень сыро, правда в 10 обещают улучшить, но это завязка на конкретную СУБД хоть и открытую.... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.09.2017, 23:21 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Bspleskда много join join в EAV - тормоза для тех, кому лень программировать обработку наборов данных на клиенте. Дельфийским мышекликателям настоятельно не рекомендую. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 01:13 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersМножество таблиц - это и есть паттерн Flat tables, который описан в приведенной вами ссылки (кстати, спасибо за ссылку) Там же и описываются громадные недостатки этого метода. registerersА вот про таблицу связей можно подробнее? А связь номенклатуры и атрибутов вы хранить где думаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 04:54 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersмножество таблиц разных товаров, потому что набор свойств (атрибутов) у них разный На каждый товар - отдельная таблица? Кому и как такое могло в голову прийти? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 07:23 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
На каждую группу товаров. Технология "Flat tables" как было описано в ссылке выше :) Вещь конечно узко специфичная. Я не сталкивался. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 08:13 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
И тут уже оказывается всё обсасывалось. 17550595 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 08:17 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
982183 https://zlob.in/2013/01/struktura-tablic-dlya-kataloga-tovarov-internet-magazina/ Я голосую за 6НФ. Почему-то по ссылке нет этого варианта. Вроде у Avito используется такой подход, но это не точно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 09:35 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerersEnnor TiegaelПро supertype-subtype слышали? Описанный мной костыль и есть паттерн supertype-subtype, разве нет?Вообще ничего общего. Делается одна таблица, условно говоря Products, которая выступает корнем вашей товарной иерархии. Туда можно поместить атрибуты, общие для всех (или почти всех) видов товаров: название, внутренний код, вес, Д*Ш*В, (возможно) цена и т.д. На эту таблицу ссылаются все остальные товарные категории, причем первичный ключ из нее можно наследовать и использовать в качестве ключа в самих дочках. На эту же таблицу будет ссылаться корзина. Только вот, зачем у вас корзина ссылается на заказы? Во всех магазинах, какие я видел, если товар лежит в корзине, значит заказ на него еще не существует, ммм? Корзину лучше сделать М:М связкой между Products и Customers, как у всех. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 10:12 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
registerers982183Таблица связей (чаще всего групп связей) А вот про таблицу связей можно подробнее? гуглите "Нормальная Форма" ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2017, 11:06 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Кот МатроскинМожет, суррогатный ключ - это тоже антипаттерн? :) Да, суррогатный ключ - это тоже метаданные, но не смотря на то, что этот атрибут содержится в сущностях наряду с другими, в РСУБД, ключи обеспечены механизмами обеспечения ссылочной целостности через наложение ограничений (constraints). Кот Матроскинвключаете поле Type в ключ, накладываете на него соответствующие ограничения в каждой из subtype-таблиц Интересно, как вы себе представляете эти "соответствующие ограничения"?)) Вот, например, физическая модель, из которой видно, что любая из subtype-таблиц может ссылаться на одну и ту же запись в supertype-таблице: Кстати, если это не костыль, то напишите JOIN-запрос для такого кейса))) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2017, 15:03 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
По поводу тезиса "делать по таблице на каждый вид товара - это самое тупое, что только можно придумать", отвечу сразу, чтоб закрыть этот вопрос. Есть такая штука, как компромисс между гибкостью и производительностью. Если гибкость не нужна, то юзаем Flat Tables, если нужна - EAV, NoSQL etc. И. кстати, кроме НФ есть ещё такое понятие как денормализация , которую как раз и применяют для оптимизации производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2017, 15:13 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovBspleskда много join join в EAV - тормоза для тех, кому лень программировать обработку наборов данных на клиенте. Дельфийским мышекликателям настоятельно не рекомендую. это как? выгребать все данные потаблично и джойнить на клиенте?? о_О ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2017, 15:19 |
|
Реляционка тут бессильна?
|
|||
---|---|---|---|
#18+
982183Там же и описываются громадные недостатки этого метода. registerersА вот про таблицу связей можно подробнее? А связь номенклатуры и атрибутов вы хранить где думаете? Не совсем понимаю, о чём вы. Вместо тысячи слов лучше нарисуйте пример диаграммы на draw.io ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2017, 15:24 |
|
|
start [/forum/topic.php?fid=32&msg=39518968&tid=1540132]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
166ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 296ms |
0 / 0 |