|
|
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Вначале были 2 таблицы object_table и person_table. В первый день захотелось людям помечать object из object_table своими персональными маркерами и завели они таблицу object_person_marker. Но задавать связь явно для каждой пары object - person показалось им неразумным, потому как значения маркеров по умолчанию очевидны для каждого здравомыслящего человека. И придумали они следующее правило: если человек не назначил маркер для object (либо его значение совпадает со значением по умолчанию), то и незачем хранить его в таблице object_person_marker. Однако на второй день люди захотели сделать выборки и сортировки по маркерам и постигло их горе великое, потому как не знают они простого способа организовать запросы одновременно и по существующим и по несуществующим маркерам (может через VIEW какие-нибудь...) и гадать им приходится как все это отразится на производительности запросов... Помогите, люди добрые! Может кто сталкивался с проблемой схожей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 11:28 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78, рассказываешь о каких-то людях. А что ты делаешь в всем этом? о какой-производительности идет речь? Там есть хотя-бы 1 млн записей,, чтобы это ставить как вопрос или речь идет о выборе 5 сек подождать или 6? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 12:13 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
iscrafmSantex78, рассказываешь о каких-то людях. А что ты делаешь в всем этом? не думал, что это важно, но я и есть один из этих людей, да и людей, на самом деле, не так много :-). iscrafmо какой-производительности идет речь? Там есть хотя-бы 1 млн записей, чтобы это ставить как вопрос или речь идет о выборе 5 сек подождать или 6? планируется что будет много записей, поэтому и приходится выпендриваться ибо реальное число маркеров гораздо меньше количества count(object)*count(person). Ну и при добавлении нового пользователя не хочется вносить много изменений в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 12:26 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78, традиционно выбирается "ведущее" множество и left join на добавленные маркеры. Если ссылка на маркер не нулевая, то информация берется из таблицы маркеров, а если null, то из общей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 13:11 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
iscrafmSantex78, традиционно выбирается "ведущее" множество и left join на добавленные маркеры. Если ссылка на маркер не нулевая, то информация берется из таблицы маркеров, а если null, то из общей. Спасибо, что подтвердили мою мысль о том, что проблема должна решаться left join-ом. Похоже что зря я начал тему и проблема у меня в другом - в том как left join транслируется из jpql в native sql. Видимо я немного запаниковал и подумал, что этот подход не работает, а значит придется городить костыли. Извините за отнятое время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 13:35 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78планируется что будет много записейНу вот сгенирируйте это "много" количесвто записей и погоняйте запросы с LEFT JOIN, или с UNION, посмотрите планы выполнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 13:43 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
skyANAНу вот сгенирируйте это "много" количесвто записей и погоняйте запросы с LEFT JOIN, или с UNION, посмотрите планы выполнения На самом деле вопрос производительности left join-а меня не сильно беспокоит - я рад что производители БД взяли эту функцию на себя :-). Вопрос производительности меня волновал для других вариантов, которые, как я думал, могут быть предложены. Насчет union-ов - ими пользоваться вообще никакого желания нет, так как в чистых JPA запросах они, к сожалению, не предусмотрены, по крайней мере, в версии 2.0, с которой я сейчас работаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 14:26 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78skyANAНу вот сгенирируйте это "много" количесвто записей и погоняйте запросы с LEFT JOIN, или с UNION, посмотрите планы выполнения На самом деле вопрос производительности left join-а меня не сильно беспокоит - я рад что производители БД взяли эту функцию на себя :-). Вопрос производительности меня волновал для других вариантов, которые, как я думал, могут быть предложены.Хорошо. Сравните LEFT JOIN со всеми другими вариантами, что Вы там себе напридумывали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2015, 14:29 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
И все таки left-join-ом тут все проблемы не решаются. left join присоединяет записи только в том случае, когда их нет в БД, поэтому если одна персона уже установила метку на какой-либо object, то для другой записи о маркерах для этого object c нулевыми значениями к запросу уже не прикрепятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 06:37 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78И все таки left-join-ом тут все проблемы не решаются. left join присоединяет записи только в том случае, когда их нет в БДЧто за глупость? Santex78поэтому если одна персона уже установила метку на какой-либо object, то для другой записи о маркерах для этого object c нулевыми значениями к запросу уже не прикрепятся.Походу Вам нужен RIGHT JOIN :) Ну или поменять object_table и person_table в своих запросах местами. Почитайте что-ли справку о джоинах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 09:10 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78И все таки left-join-ом тут все проблемы не решаются. left join присоединяет записи только в том случае, когда их нет в БД, поэтому если одна персона уже установила метку на какой-либо object, то для другой записи о маркерах для этого object c нулевыми значениями к запросу уже не прикрепятся. Решается, все решается. Просто в качестве "левой" части Вам надо использовать не person и не object, а произведение этих таблиц (ну либо подмножество этого произведения, нужное Вам в запросе). И тогда если для конкретного person И конкретного object маркер не находится - то берется значение по умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 09:35 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78И все таки left-join-ом тут все проблемы не решаются. left join присоединяет записи только в том случае, когда их нет в БД, поэтому если одна персона уже установила метку на какой-либо object, то для другой записи о маркерах для этого object c нулевыми значениями к запросу уже не прикрепятся. непонятен ответ, но он вообще неправильный. Скорее всего у вас какие-то проблемы с выбором внешнего ключа как такового. Подобные задачи как раз прекрасно решаются left join, он по сути это решает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 10:11 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Кот Матроскин, спасибо за конструктивный ответ, похоже, что все это из-за малого опыта в sql. Почему то ограниченный разум не позволял мне использовать inner и outer join в одном запросе :-). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.10.2015, 12:15 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
skyANAЧто за глупость? Сделаю вид, что я этого не слышал, возможно что то я недопонимаю, затем и на форуме. skyANAПочитайте что-ли справку о джоинах. Это к тому же. Подведу небольшой итог обсуждения: skyANAПоходу Вам нужен RIGHT JOIN :) Ну или поменять object_table и person_table в своих запросах местами. Ни то, ни другое. Кот Матроскин Просто в качестве "левой" части Вам надо использовать не person и не object, а произведение этих таблиц Тоже неверно :-). Кот Матроскин (ну либо подмножество этого произведения, нужное Вам в запросе). И тогда если для конкретного person И конкретного object маркер не находится - то берется значение по умолчанию. А вот это был ключ к правильному ответу - нужно просто left join-ить с подмножеством. В итоге SQL должен выглядеть примерно так: Код: plsql 1. Беда в том, что в JPQL нельзя join-ить подмножества - join-ится только по индексам в object map, поэтому придется скорее всего юзать нативный SQL :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 06:59 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78, В смысле "неверно"? Вот такой запрос отработает и вернет то что Вам нужно для всех обьектов Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.10.2015, 12:14 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинВот такой запрос отработает и вернет то что Вам нужно для всех обьектов Беру свои слова назад. И действительно будет работать. И даже есть соблазн создать представление (view) на основе этого запроса. Однако тут возникает еще вопрос по поводу производительности. Если в системе порядка 1 млн объектов и 10 000 пользователей, при этом каждый пользователь работает не более чем, скажем, с 7 500 объектами, разумно ли создавать сначала 10 млрд пар, чтобы затем выбрать из них не более чем 7 500 объектов? мне кажется нет... или я не прав? Тем не менее Ваш ответ был для меня очень полезен. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 06:20 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78Кот МатроскинВот такой запрос отработает и вернет то что Вам нужно для всех обьектов Беру свои слова назад. И действительно будет работать. И даже есть соблазн создать представление (view) на основе этого запроса. Однако тут возникает еще вопрос по поводу производительности. Если в системе порядка 1 млн объектов и 10 000 пользователей, при этом каждый пользователь работает не более чем, скажем, с 7 500 объектами, разумно ли создавать сначала 10 млрд пар, чтобы затем выбрать из них не более чем 7 500 объектов? мне кажется нет... или я не прав? Разумеется нет - поэтому я и сказал дальше (ну либо подмножество этого произведения, нужное Вам в запросе). Вы же можете в подзапрос добавить любые фильтрующие условия, и получать в нем такое количество пар, которое Вам нужно. Если у Вас всегда происходит отбор пользователей только по конкретным person_id и никаких условий на другие поля таблицы person накладываться не может - тогда Вам действительно не очень нужна таблица person в запросе и Ваш запрос будет вполне рабочим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 10:01 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Santex78Если в системе порядка 1 млн объектов и 10 000 пользователей местная социальная сеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:24 |
|
||
|
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
|
|||
|---|---|---|---|
|
#18+
Стандартная корпоративная муть, типа самописной СЭД и обмен поручениями, сами пишем для того чтобы интегрировалась с остальной самописной мутью. В общем развлекаемся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2015, 11:39 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=39079289&tid=1540453]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
69ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 181ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...