Справка по извлечению данных объекта из нескольких таблиц - PullRequest
1 голос
/ 22 сентября 2011

Извините, если я не слишком хорошо формулирую это, но позвольте мне попытаться объяснить, что я делаю.У меня есть главный объект класса A, который имеет несколько объектов классов B, C, D и E.

, таких как:

Class ObjectA
{
     ObjectB[] myObjectBs;
     ObjectC[] myObjectCs;
     ObjectD[] myObjectDs;
     ObjectE[] myObjectEs;
 }

, где отображение A --- B равно 1для многих, для B, C, D и E. То есть все объекты B, C, D, E связаны только с одним объектом A.

Я храню данные для всех этих объектов вбазы данных, с таблицей A, содержащей все данные для экземпляров класса A и т. д.

Теперь, когда я получаю данные для этого во время выполнения на лету, я выполняю 5 различных запросов для каждого объекта.

(очень упрощенный псевдокод)

objectA=sql("select * from tableA where id=#id#");
objectA.setObjectBs(sql("select * from tableB where a_id=#id#");
objectA.setObjectCs(sql("select * from tableC where a_id=#id#");
objectA.setObjectDs(sql("select * from tableD where a_id=#id#");
objectA.setObjectEs(sql("select * from tableE where a_id=#id#");

, если это имеет смысл.

Теперь, мне интересно, это самый эффективный способ сделать это?Я чувствую, что должен быть способ получить всю эту информацию в 1 запросе, но делать что-то вроде "select * from a, b, c, d, e, где a.id = # id # и b.a_id = # id #и c.a_id = # id # и d.a_id = # id # и e.a_id = # id # "даст набор результатов со всеми столбцами A, B, C, D, E для каждой строки, и тамбудет гораздо больше строк, которые мне понадобятся.

Если бы существовал только один массив объектов (например, просто ObjectBs), это можно было бы сделать с помощью простого соединения, а затем обработать моей платформой базы данных.Если бы отношения были A (один) .... B (много) и B (один) .... C (много), это можно было бы сделать с двумя соединениями и работой.Но для A (один) .... B (много) и A (один) .... C (много) и т. Д. Я не могу придумать хороший способ сделать соединения или вернуть эти данные, не имея слишком много строк,как и в случае объединений, если у A есть 10 B и 10 C, он вернет 100 строк, а не 20.

Итак, в настоящее время я делаю это с 5 различными вариантами выбора, наиболее эффективным (которыйкажется, что это не так), или есть ли лучший способ сделать это?

Кроме того, если бы я должен был захватить большой набор из них сразу (скажем, 5000 ObjectAs и все связанные B, C, Dи Es), есть ли способ сделать это без выполнения множества последовательных запросов один за другим?

Ответы [ 2 ]

0 голосов
/ 12 октября 2011

Существует огромная проблема с производительностью при выборе N + 1 (отметьте https://github.com/balak1986/prime-cache-support-in-ibatis2/blob/master/README).. Поэтому, пожалуйста, не используйте его, если нет другого способа добиться этого.

К счастью, у iBatis есть свойство groupBy, который создан именно для отображения данных для такого рода сложного объекта. Проверьте пример из http://www.cforcoding.com/2009/06/ibatis-tutorial-aggregation-with.html

0 голосов
/ 23 сентября 2011

Вы можете попробовать iBatis, используя N + 1 Select Lists

http://ibatis.apache.org/docs/dotnet/datamapper/ch03s05.html

Hth.

...