|
|
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Уважаемые спецы! Подскажите, как люди выбирают из базы коллекцию объектов, если объект содержит другие объекты? Вот например, объект класса Документ, содержит в себе коллекцию объектов класса СтрокаДокумента. В базу я их замапплю в две таблицы Documents и DocumentRows, связь между ними один ко многим. А вот теперь я хочу выбрать на клиента коллекцию объектов Документ. Как мне такое проделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2007, 20:58 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Атас какой. С чем это ты работаешь? "замаплю", "объекты", "коллекции" Это ты бросай. Тут тебе за объектный подход башку живо открутят и заставят Кодда читать. (Таблички, связи, PK/FK - это понятно) Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 03:16 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Подсказка В базе не хранятся объекты В базе хранятся их данные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 03:58 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
уважаемый Fuzzy, не слышали ли про такую технологию в Java как Hibernate ? Очень советую поглядеть на принцип её устройства ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 04:53 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Парни, ну чего накинулись? Я задал простой вопрос, хотел бы получить простой ответ. Вам что, никогда не нужно было вытянуть из базы коллекцию объектов, данные которых хранились бы в нескольких таблицах, как я выше описал? Про гибернейт конечно слышал, но меня интересуют технические подробности -- какие именно селекты выполняются? Может, кто ссылкой поможет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 10:38 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
авторВам что, никогда не нужно было вытянуть из базы коллекцию объектов, данные которых хранились бы в нескольких таблицах, как я выше описал? Можете себе представить - никогда. Данные вытягиваю ежедневно, а вот "коллекции обьектов" - нет. авторкакие именно селекты выполняются? Те, которые напишешь. Nobody faults but mine... (LZ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 12:36 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
FuzzyПарни, ну чего накинулись? Я задал простой вопрос, хотел бы получить простой ответ. Вам что, никогда не нужно было вытянуть из базы коллекцию объектов, данные которых хранились бы в нескольких таблицах, как я выше описал? Про гибернейт конечно слышал, но меня интересуют технические подробности -- какие именно селекты выполняются? Может, кто ссылкой поможет? Решение зависит от СУБД. Оракл поддерживает хранение и извлечение объекта с вложенной коллекцией одним запросом. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 13:05 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Ещё раз, прочитайте мой вопрос внимательно -- прошу поделиться опытом тех, кто когда-нибудь сталкивался с необходимостью выбрать из базы коллекцию объектов, и, не пользуясь гибернейтом или чем-то подобным, сам писал для этого селекты. Тех же, кто этого никогда не делал, а также тех, кто не понимает, зачем это нужно, а также тех, кто вообще ничего не знает и не понимает, прошу тему не засорять. (Может, я не том разделе пишу? Уважаемые модераторы, прошу перекинуть тему туда, где на неё могут ответить конструктивно! Спасибо!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 13:09 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
mcureenab, спасибо за ответ! А если база не поддерживает такой прикол, то как тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 13:11 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
JedaitoПодсказка В базе не хранятся объекты В базе хранятся их данные Данные, это абстракция. Для хранения данных, их нужно определённым образом организовать. Объект - область памяти и методы работы с ней. В реляционной БД объекты - записи в таблицах, методы - API для работы с курсорами и SQL запросы. Сохранение состояния объета в БД означет копирование значений части атрибутов этого объекта в другой объект, который сохраняется в БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 13:20 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Fuzzyвыбрать из базы коллекцию объектов, и, не пользуясь гибернейтом или чем-то подобным, Fuzzyобъект класса Документ, содержит в себе коллекцию объектов класса СтрокаДокумента. В базу я их замапплю в две таблицы Documents и DocumentRows, связь между ними один ко многим Каждый объект Document должен уметь сам загрузить свои DocumentRows (т.е. выполнить select * from DocumentRows where DocumentID=@id, обойти в цикле результат, по каждой записи создать DocumentRow и поместить в свой список) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 13:35 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
mcureenabСохранение состояния объета в БД означет копирование значений части атрибутов этого объекта в другой объект, который сохраняется в БД. Это её личное дело, что она у себя создаёт. От пользователя она должна принять, и пользователю вернуть, состояние объекта в определённый момент времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 13:40 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
FuzzyА если база не поддерживает такой прикол, то как тогда? Положим есть тип. Код: plaintext 1. 2. 3. Преобразуем объектное представление данных в реляционное. Получаем две таблицы: Код: plaintext 1. 2. Где oid - системный идентификатор объекта, owner - ключ для связи коллекции и её владельца. Чтобы реконструировать из БД объект придётся написать два запроса. Код: plaintext 1. 2. 3. 4. into - это ключевое слово PL/SQL означает, что запрос выполняется и возвращает строку в указанную переменную (тут o.a или o.b). bulk collect - означает, что в o.b будут выбраны все записи, возвращаемые запросом. Если и этого "прикола" нет в той или иной форме, придётся для выборки записей в коллекцию использовать цикл явно. ОРСУБД Оракл работает примерно так же, только скрывает эти тонкости от пользователя. С Hibernate не работал, но полагаю, что и он работает примерно так же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 13:42 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
mv... Тут тебе за объектный подход башку живо открутят и заставят Кодда читать. Форум называется "Проектирвание БД", и не ограничивается только реляционными БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 13:46 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Jedaito, mcureenab, спасибо за ответы! Однако, они касаются восстановления из базы ОДНОГО объекта, содержащего коллекцию подчинённых объектов. Я согласен, для одного объекта способ нормальный: выполнил селект с фильтром для главного объекта, создал главный объект, затем выполнил второй селект с фильтром по главному объекту для подчинённых объектов, пробежался по нему циклом и создал коллекцию подчинённых объектов (для ясности -- коню понятно, что заниматься этим должен уметь сам главный объект). Но вопрос-то был о том, что мне нужно получить коллекцию "ГЛАВНЫХ" объектов, т.е. каждый из которых содержит ещё по коллекции подчинённых объектов, а может, и не по одной! Легко представить, во что выльется для бедного SQL-сервака такое дело -- по запросу для каждой подчинённой коллекции, верно? Т.е. куча мелких запросов, на которых он и ляжет. Как это победить, я примерно представляю, но не хотелось бы велосипед изобретать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 15:13 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Рекомендую посмотреть библиотеку CSLA (www.lhotka.net).В довесок к ней есть прекрасная книга. Меня она устраивает гораздо больше, чам Hibernate и иже с ними. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 15:27 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
SeVa, спасибо за ответ, но мне не нужна сейчас сторонняя библиотека. Я предпочитаю сам всё написать для своих объектов -- мне виднее, как их надо правильно мапить в базу, а чего там библиотека делает, Бог её знает. Заходил на их сайт, но не нашёл, где там описывается поведение этой либы в моём примере, может, дадите более конкретную ссылку? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 15:37 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
FuzzyНо вопрос-то был о том, что мне нужно получить коллекцию "ГЛАВНЫХ" объектов Свести задачу к предыдущей. Сделать объект, например, Журнал документов. FuzzyЛегко представить, во что выльется для бедного SQL-сервака такое дело -- по запросу для каждой подчинённой коллекции, верно? Т.е. куча мелких запросов, на которых он и ляжет. Много маленьких запросов из параллельных потоков может оказаться даже наоборот быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 17:24 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Jedaito, откуда мнение, что много мелких запросов быстрее, чем один большой? Я раньше думал, что очень наоборот. Серверу же нужно время, чтобы запрос 1) получить по сетке, 2) распарсить, 3) построить план выполнения, 4) запустить и т.д. и т.п. Если запрос один, то всё это нужно сделать один раз. А если их тысячи, то соответственно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 18:11 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
FuzzyJedaito, откуда мнение, что много мелких запросов быстрее, чем один большой? Я раньше думал, что очень наоборот. Серверу же нужно время, чтобы запрос 1) получить по сетке, 2) распарсить, 3) построить план выполнения, 4) запустить и т.д. и т.п. Если запрос один, то всё это нужно сделать один раз. А если их тысячи, то соответственно. 1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся. 2. Что мешает в одном запросе выбрать записи сразу для множества главных объектов, а на стороне клиента рассортировать их по своим коллекциям? 3. Коллекции коллекций это слишком сложно. Используй декомпозицию и ссылки. Пусть объект содержит коллекцию ССЫЛОК на объекты, которые в свою очередь содержат коллекции. Оракл, например, подерживает сети объектов и умеет выбирать объекты по ссылкам ещё до того, как они понадобятся в программе. На клиенте, если потребуется, эту модель можно преобразовать в более подходящую. 4. Не изобретай велосипед. Если тебе что то непонятно, это не значит, что это плохо или не то. Гораздо проще понять существующее отлаженное решение, чем придумать и реализовать без ошибок своё, тем более, что знаний в этой области у тебя ещё маловато. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 18:53 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 19:02 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
mcureenab 1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся. Не понял, как это сделать практически? mcureenab 2. Что мешает в одном запросе выбрать записи сразу для множества главных объектов, а на стороне клиента рассортировать их по своим коллекциям? Так и собираюсь сделать, если не найдётся способ лучше mcureenab 3. Коллекции коллекций это слишком сложно. Используй декомпозицию и ссылки. Пусть объект содержит коллекцию ССЫЛОК на объекты, которые в свою очередь содержат коллекции. Ясное дело, что только так и надо. Но всё равно придётся по крайней мере один раз создать подчинённые объекты, вытянув данные из базы. Вопрос, как это сделать с минимальными затратами. mcureenabОракл, например, подерживает сети объектов и умеет выбирать объекты по ссылкам ещё до того, как они понадобятся в программе. На клиенте, если потребуется, эту модель можно преобразовать в более подходящую. Я не собираюсь работать с Ораклом, к сожалению. Да и не хочу привязываться к какой-то определённой базе. Хочется универсального решения, шаблонного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 19:15 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
Fuzzy mcureenab 1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся. Не понял, как это сделать практически? Смотри конкретный API доступа к БД и СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 19:17 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
SeVa, ну и какие селекты для этого будет мутить эта либа? Можно уточнить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 19:18 |
|
||
|
Как выбрать из базы коллекцию объектов?
|
|||
|---|---|---|---|
|
#18+
mcureenab Fuzzy mcureenab 1. Много маленьких запросов можно поместить в хранимую процедуру и выполнять их на стороне сервера, так что 1,2,3 делать каждый раз не придётся. Кроме того, запрос иногда можно выполнить сразу для массива id объектов, так что накладные расходы значительно сократятся. Не понял, как это сделать практически? Смотри конкретный API доступа к БД и СУБД. А в общем случае? Вот нужно мне вытянуть 150 главных объектов. Что мне в хранимку передать? И что она мне вернёт? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.01.2007, 19:20 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=34273358&tid=1544757]: |
0ms |
get settings: |
8ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 227ms |
| total: | 366ms |

| 0 / 0 |
