从多个表中检索对象数据帮助
Posted
技术标签:
【中文标题】从多个表中检索对象数据帮助【英文标题】:Retrieving object data from multiple tables help 【发布时间】:2011-09-22 19:52:28 【问题描述】:对不起,如果我的措辞不够好,但让我试着解释一下我在做什么。我有一个 A 类的主要对象,它有多个 B、C、D 和 E 类的对象。
这样:
Class ObjectA
ObjectB[] myObjectBs;
ObjectC[] myObjectCs;
ObjectD[] myObjectDs;
ObjectE[] myObjectEs;
其中 A---B 映射是一对多,对于 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 where a.id = #id# and b.a_id = #id#并且 c.a_id = #id# and d.a_id = #id# and e.a_id = #id#" 将给出一个结果集,其中每行包含 A、B、C、D、E 的所有列,并且有我需要更多的行。
如果只有一个对象数组(例如 ObjectB),则可以通过简单的连接来完成,然后由我的数据库框架处理。如果关系是 A(one)....B(many) 和 B(one)....C(many),则可以通过两个连接和工作来完成。但是对于 A(one)....B(many) 和 A(one)....C(many) 等,我想不出一个在没有太多行的情况下进行连接或返回此数据的好方法,与连接一样,如果 A 有 10 个 B 和 10 个 C,它将返回 100 行而不是 20 行。
那么,我目前的做法是,有 5 种不同的选择,是最有效的(似乎不是),还是有更好的做法?
另外,如果我要一次抓取一大堆(例如,5000 个 ObjectA 和所有相关的 B、C、D 和 E),是否有办法在不运行大量连续的情况下做到这一点?一个接一个的查询?
【问题讨论】:
【参考方案1】:您可以使用 N+1 Select Lists 尝试 iBatis
http://ibatis.apache.org/docs/dotnet/datamapper/ch03s05.html
Hth.
【讨论】:
【参考方案2】: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的示例
【讨论】:
以上是关于从多个表中检索对象数据帮助的主要内容,如果未能解决你的问题,请参考以下文章