|
|
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Не знал как обозвать тему поточнее, надеюсь частично суть в заголовке передал, теперь подробно: Есть таблица_1 в БД, содержит записи, которые в проекте читаются как объекты, ну тут все как у всех :) Есть таблица_2 с пользователями, id, name и прочее. Задача: закрепить объект из таблицы_1 за несколькими записями из таблицы_2 При этом не хотелось бы заводить таблицу_3, для связи этих двух таблиц и вот почему, см. ниже. Проблема в следующем: 1. Использую для выгребания данных из БД Hibernate. 2. Приложение написано с использованием Vaadin, то есть весь UI на нем. 3. Таблица_1 содержит более 1000 записей, на самом деле и больше 10000, но не суть, главное что больше 1000 точно. Простой select from таблица_1 с некоторыми условиями аля where что-то там в этой таблице is false, может выгребать без проблем 10000+ записей и отображать их в таблице Vaadin без проблем, скорость прокрутки и отображения данных при этом отличная. 4. Как только я прикручивал (это было давно и в другом проекте) таблицу_3 для связи этих двух таблиц и делал запрос, который бы отображал записи "закрепленные" за конкретными id из таблицы_2, то есть записи конкретного пользователя, то тут начинались тормоза. Потому что, сначала мы берем объект из таблицы_1, потом проверяем по таблице_3 связь с таблицей_2 ну и тянется эта цепочка запросов. Если записей 300-400 еще ничего, но в районе 1000 начинаются тормоза и при прокрутке таблицы в UI и при первичном формировании таблицы при первой загрузке UI c таблицей Vaadin. 5. Было принято решение создать в таблице_1 текстовое поле именуемое usersIds, в котором содержится строка с перечислением id тех пользователей, которые, скажем так, закрепили за собой объект из таблицы_1. Пример данных из этого поля: 1,2,15,45,65,23,14 и т.д. 5.1 При запросе в базе выгребались все объекты из таблицы_1 и затем List<таблица_1> перебирался на наличие в этом поле айдишника того юзера, который сейчас делает запрос на отображение только тех записей за которыми "закреплен" и вываливалось в таблицу UI. Все это мне не нравится, так как чувствую что это не правильно, не модно и т.д., но это работает, и работает быстро, в старом проекте от которого я уже отошел. Сейчас появилась подобная задача и я не знаю, стоит ли делать точно так же или, может быть, есть какие-то наработки в этом вопросе, которые бы ускорили отображение данных в UI? Может есть кардинально другой способ, о котором я не знаю, отойти от использования промежуточной таблицы и получить приемлемую скорость? Может вообще сам Hibernate где-то подкручивается, под это дело, я с ним толком не разобрался, так как пробовал выгребать данные с помощью JDBC и получал практически такую же картину. п.с. в классах с сущностями, я уже использую ленивую подгрузку, но в случае использования таблицы_3 все равно наблюдаются тормоза, поэтому сделал то, что в пункте 5. Настройки таблицы Vaadin такие как, первоначальная подгрузка энного кол-ва строк, буферизация строк за пределами таблицы и еще какие-то, я тоже пробовал, но это так же тормозит либо при первой загрузке либо при прокрутке, т.е. так и так тормозит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 10:07 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
Я туплю что ли с утра. Не вижу объяснения в чем проблема с тем чтобы сделать Foreign Key в таблица_2 со ссылкой на Primary Key из таблица_1. И почему так трудно дать внятные названия таблицам? Коммерческая тайна? Не дай бог, сопрут имена таблиц? Ваш подход №5 иногда используют для оптимизации выборки. Но, действительно ли такая оптимизация нужна в вашем случае, это вопрос к вам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 10:31 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
таблица_1 это список заявок, ну можно и список счетов его назвать не суть важно это пусть будет называться Request с полем user_request_id (при условии, что добавили 3-ю таблицу, см.ниже) таблица_2 пусть будет User таблица_3 пусть будет User_Request с полями request_id и user_id один объект Request должен быть в выборке как у User'а c id 1, так и с id 3, так и у юзера с любым другим id, но, к примеру, в выборку для юзера с id = 6 он не должен попадать. Когда делаем выборку из Request с вложенным запросом для пользователя с id=1 аля select * from Request as r where r.id in (select request_id from User_Request as ur where ur.user_id = 1) Вот тогда таблица Vaadin начинает тупить. В общем, я сам, по ходу дела, туплю, запрос такого вида я, вроде как, и не писал, а писал используя HQL, задавая в качестве запрашиваемых полей и полей после where сами объекты из сущностей, и вот тогда у меня тянулись запросы по цепочке приводя к жутким тормозам... Давно это было, надо бы реализовать и посмотреть как будет вытаскиваться. Еще дополнительную нагрузку создают всяческие вычисления при выводе данных в таблицу Vaadin типа: "покрасить часть текста в поле в красный, если от даты создания заявки до желаемой даты, когда она должна быть закрыта, прошло больше чем треть времени на текущий момент" :)) и прочее. Ладно, пока отложу этот вопрос, сегодня доберусь до этих классов и попробую что-то изобразить :) "Не вижу объяснения в чем проблема с тем чтобы сделать Foreign Key в таблица_2 со ссылкой на Primary Key из таблица_1. " По этому поводу: таблица User она не растет в ходе закрепления за заявками определенных пользователей, список пользователей пополняется из другого интерфейса. По сути это пользователи системы, со своими логинами и паролями для входа. И так не получится прицепить нескольких пользователей к той или иной заявке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 11:18 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
BlazkowiczВаш подход №5 иногда используют для оптимизации выборки. Но, действительно ли такая оптимизация нужна в вашем случае, это вопрос к вам. А есть еще какие-нибудь подобные фичи? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 11:19 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
Nixic, Не пиши так много. Ответь коротко. - ты хоть раз писал FK? - разве у одной заявки несколько юзверей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 11:51 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
NixicА есть еще какие-нибудь подобные фичи? :) Вы кучу всего пишете, хотя есть всего два лаконичных термина, объясняющих суть проблемы. С одной стороны это нормальные формы\нормализация. Чем именно она вам не угодила не понятно. Почему не завести таблицу? Почему не завести внешний ключ? Ответ у вас только один "При этом не хотелось бы заводить таблицу_3". Это такое технически аргументированное решение - "мне не хочется"? С другой стороны есть "подобные фичи". Я бы даже две таких фичи назвал. Первая это "денормализация". Вбиваешь в гугле - получаешь 100500 статей. Переводишь на английский - получаешь ещё столько же. Вторая такая фича это заклание ACID в жертву производительности. Тоже приём отказа от чего-то традиционного в пользу эффективности для отдельно взятой специализированной задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 11:55 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
Nixic, И эта. Почему вопрос в Java а не в форумах по БД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 11:55 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
BlazkowiczNixic, И эта. Почему вопрос в Java а не в форумах по БД? Потому что может быть кто-то начал что-то говорить про Hibernate, я там, конечно настройки какие-то делал, но.. мало ли что всплыло бы о нем в процессе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 12:25 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
Nixic, Не смешивай Модель и тормоза ваадин. Это не по теме тут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 12:32 |
|
||
|
Список объектов закрепленный за несколькими id
|
|||
|---|---|---|---|
|
#18+
NixicПотому что может быть кто-то начал что-то говорить про Hibernate, я там, конечно настройки какие-то делал, но.. мало ли что всплыло бы о нем в процессе. ORM основывается на общепринятых практиках, это нормализация и ACID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2016, 12:42 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39352487&tid=2123466]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 195ms |
| total: | 345ms |

| 0 / 0 |
