Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7]      все
 Re: Реляционка тут бессильна?  [new]
registerers
Member

Откуда:
Сообщений: 47
АнатоЛой
registerers
Кстати, если это не костыль, то напишите JOIN-запрос для такого кейса)))

Что именно хотите видеть в результатах? И допишите реальные реквизиты у таблиц...


Дано: таблица супер-типа и множество таблиц под-типов (например, видов товаров)
Требуется: вывести все записи из таблицы супер-типа с заджоиненным произвольным полем (например, именем) из каждой таблицы под-типа

Я понимаю, что запрос должен быть чем то вроде этого:
SELECT sub1.field FROM supertable AS super JOIN subtable1 AS sub1 ON sub1.id = super.id WHERE super.type = 'sub1'
UNION
SELECT sub2.field FROM supertable AS super JOIN subtable2 AS sub1 ON sub2.id = super.id WHERE super.type = 'sub2'
UNION
SELECT sub3.field FROM supertable AS super JOIN subtable3 AS sub1 ON sub3.id = super.id WHERE super.type = 'sub3'

Но ведь вопрос в том, что нужно заранее знать, какие типы под-типы существуют, а реляционная теория не позволяет абстрагировать эту задачу на произвольные наборы под-типов. Вот если бы существовал условный механизм объединения подобный таковому в случае слияния, что-то вроде "UNION ON" тогда другой вопрос. А так, выглядит, что реляционная теория неполна.

P.S. Надеюсь на конструктивный диалог, в отличие от некоторых товарищей, комментировавших выше.
22 сен 17, 01:34    [20814236]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33571
registerers
MasterZiv
пропущено...


Ты спрашивал -- я тебе ответил. Кстати, то же ответили тебе прямо или косвенно намекали на это некоторые другие
отвечающие.

Вопрос исчерпан, тему можно закрывать.
Есть другие вопросы -- задавай отдельно.

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

А вообще, да, смотрю оффтоп потёк ручьём... По поводу главной темы топика, благодарю всех, что помогли уточнить суть вопроса, а именно - то, что в реляционной теории не существует способа ограничить возможность ссылаться двум и более дочерним сущностям на одну родительскую. И только родительская определяет свою принадлежность к той или иной дочерней сущности, тогда как все остальные, на нее ссылающиеся - мусорные. Введение дискриминатора в состав ключа, как предлагал известный персонаж из Простоквашино в посте 20787976 ещё более костыльное решение, нигде такого не встречал...

В общем, подытожим. Вывод такой, что нельзя однозначно ответить на вопрос топика - "да" или "нет". Реляционка позволяет реализовать отношения вида тип-подтип, но контроль за ограничениями, о которых говорилось выше, ложится на приложение.

З.Ы. А по логике корзины - целесообразно создать отдельный топик, тема довольно интересная, но здесь это оффтоп.



ты фантазёр, однако...
22 сен 17, 06:10    [20814278]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33571
skyANA
MasterZiv
пропущено...


в виде связи 1-к-0..1 между 2-мя таблицами

И так и эдак бывает. В примере выше у меня Документ - это абстрактная сущность.



родитель один у , скажем двух классов.
его связь с каждой из дочерних таблиц один к ноль или один, потому что записей в обоих дочерних классах может не быть , т.е. в каждом наследнике запись либо она, либо её нет вообше.
поэтому и 1:0..1 , а не "бывает так и эдак" .
22 сен 17, 06:17    [20814279]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33571
registerers
АнатоЛой
пропущено...

Что именно хотите видеть в результатах? И допишите реальные реквизиты у таблиц...


Дано: таблица супер-типа и множество таблиц под-типов (например, видов товаров)
Требуется: вывести все записи из таблицы супер-типа с заджоиненным произвольным полем (например, именем) из каждой таблицы под-типа

Я понимаю, что запрос должен быть чем то вроде этого:
SELECT sub1.field FROM supertable AS super JOIN subtable1 AS sub1 ON sub1.id = super.id WHERE super.type = 'sub1'
UNION
SELECT sub2.field FROM supertable AS super JOIN subtable2 AS sub1 ON sub2.id = super.id WHERE super.type = 'sub2'
UNION
SELECT sub3.field FROM supertable AS super JOIN subtable3 AS sub1 ON sub3.id = super.id WHERE super.type = 'sub3'

Но ведь вопрос в том, что нужно заранее знать, какие типы под-типы существуют, а реляционная теория не позволяет абстрагировать эту задачу на произвольные наборы под-типов. Вот если бы существовал условный механизм объединения подобный таковому в случае слияния, что-то вроде "UNION ON" тогда другой вопрос. А так, выглядит, что реляционная теория неполна.

P.S. Надеюсь на конструктивный диалог, в отличие от некоторых товарищей, комментировавших выше.


Чё там не скачаешь ты фишку нигде ниразу...

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

мне кажется уже в психологии у тебя проблемым ты просто не хочешь понимать то, что видимо понять способен. и этот ментальный барьер только тебе и мешает.
22 сен 17, 06:30    [20814281]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 33571
MasterZiv,
скачаешь/сечёшь
22 сен 17, 06:31    [20814283]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 22804
MasterZiv
skyANA
пропущено...

И так и эдак бывает. В примере выше у меня Документ - это абстрактная сущность.



родитель один у , скажем двух классов.
его связь с каждой из дочерних таблиц один к ноль или один, потому что записей в обоих дочерних классах может не быть , т.е. в каждом наследнике запись либо она, либо её нет вообше.
поэтому и 1:0..1 , а не "бывает так и эдак" .

В примере выше не бывает записи только в таблице fin.Document, то есть не бывает ситуации "либо её нет вообше". Понимаете?

Назовём это "наследование от абстрактного класса" :)
22 сен 17, 07:15    [20814300]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
tip78
Member

Откуда: Москва
Сообщений: 472
я вообще уже запутался, что за "супер-типы" начались? кто это?

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

у "банального интернет-магазина" нет проблем. "Банально" там достаточно знать все ID, которые встречаются, выполнить 1 IN-query и вытащить карту соответствий, которой потом и пользоваться при выводе.
22 сен 17, 12:35    [20815412]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
tip78
Member

Откуда: Москва
Сообщений: 472
забыл добавить, что у вас он НЕ банальный, отсюда и все беды
22 сен 17, 12:49    [20815490]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 22804
tip78
забыл добавить, что у вас он НЕ банальный, отсюда и все беды

Ну он же чёрным по белому написал в первом посте: "Вот есть такой теоретический вопрос о реляционных связях между гетерогенными структурами данных" :)
22 сен 17, 13:13    [20815614]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
registerers
Member

Откуда:
Сообщений: 47
Да уж, я смотрю, тут собрались почти одни снобы и тролли, которым нечего сказать по сути кроме демагогии и переходов на личность собеседника. Надеюсь, что найдётся хоть один адекватный спец в реляционке, который понимает суть проблемы...
22 сен 17, 15:26    [20816394]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
ViPRos
Member

Откуда:
Сообщений: 7967
registerers,

да суть то простая
нельзя указать форинкей к вью
потому приходится делать промежуточную таблицу (Union всех ID всех таблиц)
22 сен 17, 15:52    [20816584]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
registerers
Member

Откуда:
Сообщений: 47
ViPRos
registerers,

да суть то простая
нельзя указать форинкей к вью
потому приходится делать промежуточную таблицу (Union всех ID всех таблиц)


та не, вьюхи тут не при чём
это скорее вопрос о монопольном владении внешним ключом
(похоже на рэпчину))
22 сен 17, 16:02    [20816639]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
tip78
Member

Откуда: Москва
Сообщений: 472
skyANA
tip78
забыл добавить, что у вас он НЕ банальный, отсюда и все беды

Ну он же чёрным по белому написал в первом посте: "Вот есть такой теоретический вопрос о реляционных связях между гетерогенными структурами данных" :)

какой же он теоретический? "наполнить корзину", это самый обязательный вопрос в любом магазине.
не надо было под каждый вид товара создавать отдельную таблицу с его свойствами. Тысячи их.
jsonb добавьте в order_products и зафиксируйте все выбранные свойства. Нельзя там IDы свойств держать, свойства ведь могут и исчезнуть через X лет.
22 сен 17, 16:17    [20816718]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 22804
tip78
skyANA
пропущено...

Ну он же чёрным по белому написал в первом посте: "Вот есть такой теоретический вопрос о реляционных связях между гетерогенными структурами данных" :)

какой же он теоретический? "наполнить корзину", это самый обязательный вопрос в любом магазине.
не надо было под каждый вид товара создавать отдельную таблицу с его свойствами. Тысячи их.
jsonb добавьте в order_products и зафиксируйте все выбранные свойства. Нельзя там IDы свойств держать, свойства ведь могут и исчезнуть через X лет.

Магазины появились ещё до jsonb и проблем с добавлением товара в корзину у них нет. Автор таки теоритизирует :)
22 сен 17, 17:15    [20816967]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
registerers
Member

Откуда:
Сообщений: 47
skyANA
tip78
пропущено...

какой же он теоретический? "наполнить корзину", это самый обязательный вопрос в любом магазине.
не надо было под каждый вид товара создавать отдельную таблицу с его свойствами. Тысячи их.
jsonb добавьте в order_products и зафиксируйте все выбранные свойства. Нельзя там IDы свойств держать, свойства ведь могут и исчезнуть через X лет.

Магазины появились ещё до jsonb и проблем с добавлением товара в корзину у них нет. Автор таки теоритизирует :)

Конечно, теоретизирую, я с самого начала говорил, что меня интересует исключительно теория. Я в своей практике рефакторил достаточно разных систем и насмотрелся разного. Проблем с добавлением в корзину нет, но решаются они костыльным способом. Об этом идёт речь. Только введение ограничения монопольного владения внешним ключом могло бы решить проблему. Но, наверное, это будет не в этой Вселенной... Хотя, написать чувакам из рабочей группы ISO/IEC, наверное стоит)) Возможно там будет дискуссия более продуктивная, чем здесь)))
22 сен 17, 21:52    [20817393]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
Бредятина
Member

Откуда: Москва
Сообщений: 1657
registerers
Вот есть такой теоретический вопрос о реляционных связях между гетерогенными структурами данных. Матюк страшный, но на самом деле всё просто и такая проблема довольно часто возникает на практике, например в интернет-магазинах, всевозможных CRM-системах и не только.

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

Картинка с другого сайта.

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

Так вот интересно, существуют ли какие то более элегантные решения этой проблемы?

Сначала, все-таки, нужно ответить себе на вопрос: а почему не все товары в одной таблице?:) Что в этом плохого, конкретно?
23 сен 17, 21:11    [20818338]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
Бредятина
Member

Откуда: Москва
Сообщений: 1657
ViPRos
registerers,

да суть то простая
нельзя указать форинкей к вью
потому приходится делать промежуточную таблицу (Union всех ID всех таблиц)

)))
Во-первых, Вы находитесь в разделе "Проектирование баз данных", а не "Проектирование реляционных баз данных".
Во-вторых, для РМД еще не удалось найти ни одной практической задачи, то есть, ее практическая ценность равна нулю.
23 сен 17, 21:21    [20818354]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
zeon11
Member

Откуда: Сибирь, Кемерово
Сообщений: 1058
Бредятина,

Это-же Ваш человек!
Вы - отрицаете реляционные БД, ТС - сомневается в них. Ему ещё один шаг, и вас тут на форуме будет двое.
24 сен 17, 18:15    [20819072]     Ответить | Цитировать Сообщить модератору
 Re: Реляционка тут бессильна?  [new]
Бредятина
Member

Откуда: Москва
Сообщений: 1657
zeon11
Бредятина,

Это-же Ваш человек!
Вы - отрицаете реляционные БД, ТС - сомневается в них. Ему ещё один шаг, и вас тут на форуме будет двое.

Я ничего не отрицаю, всегда сомневаюсь, и никогда свое мнение не высказываю:) Мнение может обидеть какого-нибудь (совсем не знакомого) человека:) Факты, конечно, тоже могут обидеть, но это уже проблема обиженного. Как правило:)
25 сен 17, 14:36    [20820879]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 [7]      все
Все форумы / Проектирование БД Ответить