Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как выбрать из базы коллекцию объектов? / 25 сообщений из 90, страница 1 из 4
21.01.2007, 20:58
    #34270770
Fuzzy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать из базы коллекцию объектов?
Уважаемые спецы!
Подскажите, как люди выбирают из базы коллекцию объектов, если объект содержит другие объекты? Вот например, объект класса Документ, содержит в себе коллекцию объектов класса СтрокаДокумента. В базу я их замапплю в две таблицы Documents и DocumentRows, связь между ними один ко многим. А вот теперь я хочу выбрать на клиента коллекцию объектов Документ. Как мне такое проделать?
...
Рейтинг: 0 / 0
22.01.2007, 03:16
    #34270947
mv
mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать из базы коллекцию объектов?
Атас какой.

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

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


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


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

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

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

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

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

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

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

Это её личное дело, что она у себя создаёт. От пользователя она должна принять, и пользователю вернуть, состояние объекта в определённый момент времени.
...
Рейтинг: 0 / 0
22.01.2007, 13:42
    #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
22.01.2007, 13:46
    #34272115
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать из базы коллекцию объектов?
mv...
Тут тебе за объектный подход башку живо открутят и заставят
Кодда читать.


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

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

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

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

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

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

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

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

4. Не изобретай велосипед. Если тебе что то непонятно, это не значит, что это плохо или не то. Гораздо проще понять существующее отлаженное решение, чем придумать и реализовать без ошибок своё, тем более, что знаний в этой области у тебя ещё маловато.
...
Рейтинг: 0 / 0
22.01.2007, 19:02
    #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
22.01.2007, 19:15
    #34273353
Fuzzy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать из базы коллекцию объектов?
mcureenab
1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся.
Не понял, как это сделать практически?

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

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

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


Смотри конкретный API доступа к БД и СУБД.
...
Рейтинг: 0 / 0
22.01.2007, 19:18
    #34273359
Fuzzy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как выбрать из базы коллекцию объектов?
SeVa, ну и какие селекты для этого будет мутить эта либа? Можно уточнить?
...
Рейтинг: 0 / 0
22.01.2007, 19:20
    #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]