powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
19 сообщений из 19, страница 1 из 1
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39079276
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вначале были 2 таблицы object_table и person_table.

В первый день захотелось людям помечать object из object_table своими персональными маркерами и завели они таблицу object_person_marker. Но задавать связь явно для каждой пары object - person показалось им неразумным, потому как значения маркеров по умолчанию очевидны для каждого здравомыслящего человека. И придумали они следующее правило: если человек не назначил маркер для object (либо его значение совпадает со значением по умолчанию), то и незачем хранить его в таблице object_person_marker.

Однако на второй день люди захотели сделать выборки и сортировки по маркерам и постигло их горе великое, потому как не знают они простого способа организовать запросы одновременно и по существующим и по несуществующим маркерам (может через VIEW какие-нибудь...) и гадать им приходится как все это отразится на производительности запросов...

Помогите, люди добрые! Может кто сталкивался с проблемой схожей?
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39079286
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78, рассказываешь о каких-то людях. А что ты делаешь в всем этом?

о какой-производительности идет речь? Там есть хотя-бы 1 млн записей,, чтобы это ставить как вопрос или речь идет о выборе 5 сек подождать или 6?
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39079289
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iscrafmSantex78, рассказываешь о каких-то людях. А что ты делаешь в всем этом?
не думал, что это важно, но я и есть один из этих людей, да и людей, на самом деле, не так много :-).
iscrafmо какой-производительности идет речь? Там есть хотя-бы 1 млн записей, чтобы это ставить как вопрос или речь идет о выборе 5 сек подождать или 6?
планируется что будет много записей, поэтому и приходится выпендриваться ибо реальное число маркеров гораздо меньше количества count(object)*count(person).
Ну и при добавлении нового пользователя не хочется вносить много изменений в БД.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39079299
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78,

традиционно выбирается "ведущее" множество и left join на добавленные маркеры. Если ссылка на маркер не нулевая, то информация берется из таблицы маркеров, а если null, то из общей.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39079314
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iscrafmSantex78,
традиционно выбирается "ведущее" множество и left join на добавленные маркеры. Если ссылка на маркер не нулевая, то информация берется из таблицы маркеров, а если null, то из общей.

Спасибо, что подтвердили мою мысль о том, что проблема должна решаться left join-ом.
Похоже что зря я начал тему и проблема у меня в другом - в том как left join транслируется из jpql в native sql. Видимо я немного запаниковал и подумал, что этот подход не работает, а значит придется городить костыли.
Извините за отнятое время.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39079318
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78планируется что будет много записейНу вот сгенирируйте это "много" количесвто записей и погоняйте запросы с LEFT JOIN, или с UNION, посмотрите планы выполнения
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39079333
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAНу вот сгенирируйте это "много" количесвто записей и погоняйте запросы с LEFT JOIN, или с UNION, посмотрите планы выполнения
На самом деле вопрос производительности left join-а меня не сильно беспокоит - я рад что производители БД взяли эту функцию на себя :-). Вопрос производительности меня волновал для других вариантов, которые, как я думал, могут быть предложены.
Насчет union-ов - ими пользоваться вообще никакого желания нет, так как в чистых JPA запросах они, к сожалению, не предусмотрены, по крайней мере, в версии 2.0, с которой я сейчас работаю.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39079336
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78skyANAНу вот сгенирируйте это "много" количесвто записей и погоняйте запросы с LEFT JOIN, или с UNION, посмотрите планы выполнения
На самом деле вопрос производительности left join-а меня не сильно беспокоит - я рад что производители БД взяли эту функцию на себя :-). Вопрос производительности меня волновал для других вариантов, которые, как я думал, могут быть предложены.Хорошо. Сравните LEFT JOIN со всеми другими вариантами, что Вы там себе напридумывали.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39080783
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И все таки left-join-ом тут все проблемы не решаются.
left join присоединяет записи только в том случае, когда их нет в БД, поэтому если одна персона уже установила метку на какой-либо object, то для другой записи о маркерах для этого object c нулевыми значениями к запросу уже не прикрепятся.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39080850
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78И все таки left-join-ом тут все проблемы не решаются.
left join присоединяет записи только в том случае, когда их нет в БДЧто за глупость?

Santex78поэтому если одна персона уже установила метку на какой-либо object, то для другой записи о маркерах для этого object c нулевыми значениями к запросу уже не прикрепятся.Походу Вам нужен RIGHT JOIN :) Ну или поменять object_table и person_table в своих запросах местами.

Почитайте что-ли справку о джоинах.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39080875
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78И все таки left-join-ом тут все проблемы не решаются.
left join присоединяет записи только в том случае, когда их нет в БД, поэтому если одна персона уже установила метку на какой-либо object, то для другой записи о маркерах для этого object c нулевыми значениями к запросу уже не прикрепятся.

Решается, все решается.
Просто в качестве "левой" части Вам надо использовать не person и не object, а произведение
этих таблиц (ну либо подмножество этого произведения, нужное Вам в запросе).
И тогда если для конкретного person И конкретного object маркер не находится - то берется
значение по умолчанию.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39080905
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78И все таки left-join-ом тут все проблемы не решаются.
left join присоединяет записи только в том случае, когда их нет в БД, поэтому если одна персона уже установила метку на какой-либо object, то для другой записи о маркерах для этого object c нулевыми значениями к запросу уже не прикрепятся.
непонятен ответ, но он вообще неправильный. Скорее всего у вас какие-то проблемы с выбором внешнего ключа как такового.
Подобные задачи как раз прекрасно решаются left join, он по сути это решает
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39081089
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот Матроскин, спасибо за конструктивный ответ, похоже, что все это из-за малого опыта в sql. Почему то ограниченный разум не позволял мне использовать inner и outer join в одном запросе :-).
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39084243
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAЧто за глупость?
Сделаю вид, что я этого не слышал, возможно что то я недопонимаю, затем и на форуме.
skyANAПочитайте что-ли справку о джоинах.
Это к тому же.

Подведу небольшой итог обсуждения:
skyANAПоходу Вам нужен RIGHT JOIN :) Ну или поменять object_table и person_table в своих запросах местами.
Ни то, ни другое.

Кот Матроскин Просто в качестве "левой" части Вам надо использовать не person и не object, а произведение этих таблиц
Тоже неверно :-).

Кот Матроскин (ну либо подмножество этого произведения, нужное Вам в запросе).
И тогда если для конкретного person И конкретного object маркер не находится - то берется
значение по умолчанию.
А вот это был ключ к правильному ответу - нужно просто left join-ить с подмножеством.
В итоге SQL должен выглядеть примерно так:
Код: plsql
1.
 SELECT * FROM object_table t1 LEFT JOIN (SELECT * FROM object_person_marker WHERE person_id=?) t2 ON t1.object_id = t2.objct_id WHERE ... ORDER BY ...


Беда в том, что в JPQL нельзя join-ить подмножества - join-ится только по индексам в object map, поэтому придется скорее всего юзать нативный SQL :-(
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39084525
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78,

В смысле "неверно"?
Вот такой запрос отработает и вернет то что Вам нужно для всех обьектов
Код: sql
1.
2.
3.
4.
5.
6.
select * 
from (select person.person_id, object.object_id
        from person, object) t
      left join object_person_marker  opm
      on opm.object_id = t.Object_id and
          opm.Person_Id = t.person_ID
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39086327
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кот МатроскинВот такой запрос отработает и вернет то что Вам нужно для всех обьектов

Беру свои слова назад. И действительно будет работать. И даже есть соблазн создать представление (view) на основе этого запроса.
Однако тут возникает еще вопрос по поводу производительности. Если в системе порядка 1 млн объектов и 10 000 пользователей, при этом каждый пользователь работает не более чем, скажем, с 7 500 объектами, разумно ли создавать сначала 10 млрд пар, чтобы затем выбрать из них не более чем 7 500 объектов? мне кажется нет... или я не прав?
Тем не менее Ваш ответ был для меня очень полезен. Спасибо.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39086440
Кот Матроскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78Кот МатроскинВот такой запрос отработает и вернет то что Вам нужно для всех обьектов

Беру свои слова назад. И действительно будет работать. И даже есть соблазн создать представление (view) на основе этого запроса.
Однако тут возникает еще вопрос по поводу производительности. Если в системе порядка 1 млн объектов и 10 000 пользователей, при этом каждый пользователь работает не более чем, скажем, с 7 500 объектами, разумно ли создавать сначала 10 млрд пар, чтобы затем выбрать из них не более чем 7 500 объектов? мне кажется нет... или я не прав?

Разумеется нет - поэтому я и сказал дальше
(ну либо подмножество этого произведения, нужное Вам в запросе).
Вы же можете в подзапрос добавить любые фильтрующие условия, и получать в нем такое количество пар, которое Вам нужно.
Если у Вас всегда происходит отбор пользователей только по конкретным person_id и никаких условий на другие поля таблицы person накладываться не может - тогда Вам действительно не очень нужна таблица person в запросе и Ваш запрос будет вполне рабочим.
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39086572
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Santex78Если в системе порядка 1 млн объектов и 10 000 пользователей
местная социальная сеть?
...
Рейтинг: 0 / 0
Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
    #39086599
Santex78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Стандартная корпоративная муть, типа самописной СЭД и обмен поручениями, сами пишем для того чтобы интегрировалась с остальной самописной мутью. В общем развлекаемся.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как организовать SQL (в идеале JPQL) запросы для неявной связи "многий ко многим"?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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