powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как выбрать из базы коллекцию объектов?
25 сообщений из 90, страница 1 из 4
Как выбрать из базы коллекцию объектов?
    #34270770
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые спецы!
Подскажите, как люди выбирают из базы коллекцию объектов, если объект содержит другие объекты? Вот например, объект класса Документ, содержит в себе коллекцию объектов класса СтрокаДокумента. В базу я их замапплю в две таблицы Documents и DocumentRows, связь между ними один ко многим. А вот теперь я хочу выбрать на клиента коллекцию объектов Документ. Как мне такое проделать?
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34270947
Фотография mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Атас какой.

С чем это ты работаешь?
"замаплю", "объекты", "коллекции"

Это ты бросай. Тут тебе за объектный подход башку живо открутят и заставят
Кодда читать.


(Таблички, связи, PK/FK - это понятно)


Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34270957
Jedaito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подсказка
В базе не хранятся объекты
В базе хранятся их данные
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34270963
anjey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уважаемый Fuzzy, не слышали ли про такую технологию в Java как Hibernate ?
Очень советую поглядеть на принцип её устройства ;)
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34271339
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парни, ну чего накинулись? Я задал простой вопрос, хотел бы получить простой ответ.
Вам что, никогда не нужно было вытянуть из базы коллекцию объектов, данные которых хранились бы в нескольких таблицах, как я выше описал?
Про гибернейт конечно слышал, но меня интересуют технические подробности -- какие именно селекты выполняются? Может, кто ссылкой поможет?
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34271819
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВам что, никогда не нужно было вытянуть из базы коллекцию объектов, данные которых хранились бы в нескольких таблицах, как я выше описал?
Можете себе представить - никогда. Данные вытягиваю ежедневно, а вот "коллекции обьектов" - нет.
авторкакие именно селекты выполняются?
Те, которые напишешь.

Nobody faults but mine... (LZ)
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34271963
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FuzzyПарни, ну чего накинулись? Я задал простой вопрос, хотел бы получить простой ответ.
Вам что, никогда не нужно было вытянуть из базы коллекцию объектов, данные которых хранились бы в нескольких таблицах, как я выше описал?
Про гибернейт конечно слышал, но меня интересуют технические подробности -- какие именно селекты выполняются? Может, кто ссылкой поможет?

Решение зависит от СУБД. Оракл поддерживает хранение и извлечение объекта с вложенной коллекцией одним запросом.

Код: plaintext
select value(o) from obj_table o;
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34271978
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё раз, прочитайте мой вопрос внимательно -- прошу поделиться опытом тех, кто когда-нибудь сталкивался с необходимостью выбрать из базы коллекцию объектов, и, не пользуясь гибернейтом или чем-то подобным, сам писал для этого селекты.
Тех же, кто этого никогда не делал, а также тех, кто не понимает, зачем это нужно, а также тех, кто вообще ничего не знает и не понимает, прошу тему не засорять.
(Может, я не том разделе пишу? Уважаемые модераторы, прошу перекинуть тему туда, где на неё могут ответить конструктивно! Спасибо!)
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34271984
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab, спасибо за ответ!
А если база не поддерживает такой прикол, то как тогда?
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34272012
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JedaitoПодсказка
В базе не хранятся объекты
В базе хранятся их данные

Данные, это абстракция. Для хранения данных, их нужно определённым образом организовать. Объект - область памяти и методы работы с ней. В реляционной БД объекты - записи в таблицах, методы - API для работы с курсорами и SQL запросы.

Сохранение состояния объета в БД означет копирование значений части атрибутов этого объекта в другой объект, который сохраняется в БД.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34272067
Jedaito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fuzzyвыбрать из базы коллекцию объектов, и, не пользуясь гибернейтом или чем-то подобным,
Fuzzyобъект класса Документ, содержит в себе коллекцию объектов класса СтрокаДокумента. В базу я их замапплю в две таблицы Documents и DocumentRows, связь между ними один ко многим

Каждый объект Document должен уметь сам загрузить свои DocumentRows (т.е. выполнить select * from DocumentRows where DocumentID=@id, обойти в цикле результат, по каждой записи создать DocumentRow и поместить в свой список)
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34272082
Jedaito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mcureenabСохранение состояния объета в БД означет копирование значений части атрибутов этого объекта в другой объект, который сохраняется в БД.

Это её личное дело, что она у себя создаёт. От пользователя она должна принять, и пользователю вернуть, состояние объекта в определённый момент времени.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34272094
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FuzzyА если база не поддерживает такой прикол, то как тогда?

Положим есть тип.

Код: plaintext
1.
2.
3.
t_obj (
 a number, -- скалярный атрибут
 b table of number -- неупорядоченная коллекция чисел с неограниченным размером
)

Преобразуем объектное представление данных в реляционное.
Получаем две таблицы:

Код: plaintext
1.
2.
obj(oid number primary key, a number)

obj_b(owner references obj, val number)

Где oid - системный идентификатор объекта, owner - ключ для связи коллекции и её владельца.

Чтобы реконструировать из БД объект придётся написать два запроса.

Код: plaintext
1.
2.
3.
4.
o t_obj; -- объявление реконструируемого объекта

select a into o.a from obj where oid=:x;

select val bulk collect into o.b from obj_b where owner=:x;

into - это ключевое слово PL/SQL означает, что запрос выполняется и возвращает строку в указанную переменную (тут o.a или o.b).
bulk collect - означает, что в o.b будут выбраны все записи, возвращаемые запросом. Если и этого "прикола" нет в той или иной форме, придётся для выборки записей в коллекцию использовать цикл явно.

ОРСУБД Оракл работает примерно так же, только скрывает эти тонкости от пользователя. С Hibernate не работал, но полагаю, что и он работает примерно так же.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34272115
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mv...
Тут тебе за объектный подход башку живо открутят и заставят
Кодда читать.


Форум называется "Проектирвание БД", и не ограничивается только реляционными БД.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34272501
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jedaito, mcureenab, спасибо за ответы!

Однако, они касаются восстановления из базы ОДНОГО объекта, содержащего коллекцию подчинённых объектов. Я согласен, для одного объекта способ нормальный: выполнил селект с фильтром для главного объекта, создал главный объект, затем выполнил второй селект с фильтром по главному объекту для подчинённых объектов, пробежался по нему циклом и создал коллекцию подчинённых объектов (для ясности -- коню понятно, что заниматься этим должен уметь сам главный объект).

Но вопрос-то был о том, что мне нужно получить коллекцию "ГЛАВНЫХ" объектов, т.е. каждый из которых содержит ещё по коллекции подчинённых объектов, а может, и не по одной! Легко представить, во что выльется для бедного SQL-сервака такое дело -- по запросу для каждой подчинённой коллекции, верно? Т.е. куча мелких запросов, на которых он и ляжет.

Как это победить, я примерно представляю, но не хотелось бы велосипед изобретать
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34272550
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекомендую посмотреть библиотеку CSLA (www.lhotka.net).В довесок к ней есть прекрасная книга.
Меня она устраивает гораздо больше, чам Hibernate и иже с ними.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34272594
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa, спасибо за ответ, но мне не нужна сейчас сторонняя библиотека. Я предпочитаю сам всё написать для своих объектов -- мне виднее, как их надо правильно мапить в базу, а чего там библиотека делает, Бог её знает.
Заходил на их сайт, но не нашёл, где там описывается поведение этой либы в моём примере, может, дадите более конкретную ссылку?
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34273031
Jedaito
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FuzzyНо вопрос-то был о том, что мне нужно получить коллекцию "ГЛАВНЫХ" объектов
Свести задачу к предыдущей. Сделать объект, например, Журнал документов.

FuzzyЛегко представить, во что выльется для бедного SQL-сервака такое дело -- по запросу для каждой подчинённой коллекции, верно? Т.е. куча мелких запросов, на которых он и ляжет.
Много маленьких запросов из параллельных потоков может оказаться даже наоборот быстрее.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34273182
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jedaito, откуда мнение, что много мелких запросов быстрее, чем один большой? Я раньше думал, что очень наоборот. Серверу же нужно время, чтобы запрос 1) получить по сетке, 2) распарсить, 3) построить план выполнения, 4) запустить и т.д. и т.п. Если запрос один, то всё это нужно сделать один раз. А если их тысячи, то соответственно.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34273305
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FuzzyJedaito, откуда мнение, что много мелких запросов быстрее, чем один большой? Я раньше думал, что очень наоборот. Серверу же нужно время, чтобы запрос 1) получить по сетке, 2) распарсить, 3) построить план выполнения, 4) запустить и т.д. и т.п. Если запрос один, то всё это нужно сделать один раз. А если их тысячи, то соответственно.

1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся.

2. Что мешает в одном запросе выбрать записи сразу для множества главных объектов, а на стороне клиента рассортировать их по своим коллекциям?

3. Коллекции коллекций это слишком сложно. Используй декомпозицию и ссылки. Пусть объект содержит коллекцию ССЫЛОК на объекты, которые в свою очередь содержат коллекции. Оракл, например, подерживает сети объектов и умеет выбирать объекты по ссылкам ещё до того, как они понадобятся в программе. На клиенте, если потребуется, эту модель можно преобразовать в более подходящую.

4. Не изобретай велосипед. Если тебе что то непонятно, это не значит, что это плохо или не то. Гораздо проще понять существующее отлаженное решение, чем придумать и реализовать без ошибок своё, тем более, что знаний в этой области у тебя ещё маловато.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34273325
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.Что делает эта "либа" подробно описано в книге автора.Можно скачать CSLA, там есть учебный проект - PTracker, в котором показаны основные моменты.
2. В отличии от всех ORM, работа с БД полностью прозрачна и построена на хранимых процедурах.
3. Все, что необходимо в твоем случае с CSLA реализуется просто, и позволяет работать именно с бизнес объектами, а не с кальками структуры БД.Необходимо будет создать 4 объекта:
- class Documents : Csla.BusinessListBase<Documents, Document> (список Документов)
- class Document : Csla.BusinessBase<Document> (сам Документ) со свойством DocumentRows
- class DocumentRows : Csla.BusinessListBase<DocumentRows, DocumentRow>
- class DocumentRow : Csla.BusinessBase<DocumentRow>
и 2 хранимые процедуры:
- для списка документов
- и деталировки по DocumentId
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34273353
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab
1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся.
Не понял, как это сделать практически?

mcureenab
2. Что мешает в одном запросе выбрать записи сразу для множества главных объектов, а на стороне клиента рассортировать их по своим коллекциям?
Так и собираюсь сделать, если не найдётся способ лучше

mcureenab
3. Коллекции коллекций это слишком сложно. Используй декомпозицию и ссылки. Пусть объект содержит коллекцию ССЫЛОК на объекты, которые в свою очередь содержат коллекции.
Ясное дело, что только так и надо. Но всё равно придётся по крайней мере один раз создать подчинённые объекты, вытянув данные из базы. Вопрос, как это сделать с минимальными затратами.

mcureenabОракл, например, подерживает сети объектов и умеет выбирать объекты по ссылкам ещё до того, как они понадобятся в программе. На клиенте, если потребуется, эту модель можно преобразовать в более подходящую.
Я не собираюсь работать с Ораклом, к сожалению. Да и не хочу привязываться к какой-то определённой базе. Хочется универсального решения, шаблонного.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34273358
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fuzzy mcureenab
1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся.
Не понял, как это сделать практически?


Смотри конкретный API доступа к БД и СУБД.
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34273359
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa, ну и какие селекты для этого будет мутить эта либа? Можно уточнить?
...
Рейтинг: 0 / 0
Как выбрать из базы коллекцию объектов?
    #34273361
Fuzzy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenab Fuzzy mcureenab
1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся.
Не понял, как это сделать практически?


Смотри конкретный API доступа к БД и СУБД.

А в общем случае? Вот нужно мне вытянуть 150 главных объектов. Что мне в хранимку передать? И что она мне вернёт?
...
Рейтинг: 0 / 0
25 сообщений из 90, страница 1 из 4
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как выбрать из базы коллекцию объектов?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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