此问题旨在成为软件/平台不可知的。我只是在寻找通用的SQL代码。获取存储在RDBMS中的对象的树的最佳方法
考虑下面的表(例如的缘故很简单):
Table: Authors id | name 1 | Tyson 2 | Gordon 3 | Tony etc Table: Books id | author | title 1 | 1 | Tyson's First Book 2 | 2 | Gordon's Book 3 | 1 | Tyson's Second Book 4 | 3 | Tony's Book etc Table: Stores id | name 1 | Books Overflow 2 | Books Exchange etc Table: Stores_Books id | store | book 1 | 1 | 1 2 | 2 | 4 3 | 1 | 3 4 | 2 | 2
正如你所看到的,有Book
S和Author
S,和许多-TO-间的一种一对多的关系Book
s和Store
s之间有很多关系。
问题一:什么是最好的查询加载一个作者和他们的书籍(和书籍出售)到一个面向对象的程序,其中每一行代表一个对象实例?
问题二:什么是最好的查询加载整个对象树到一个面向对象的程序,其中每一行代表一个对象实例?
这两种情况很容易通过延迟加载来想象。在任何一种情况下,您都可以通过一个查询获取作者,然后只要您需要他们的图书(以及销售图书的商店),您就可以使用另一个查询来获取该信息。
是延迟加载的最佳方式来做到这一点,或者我应该使用连接并在创建对象树时解析结果(试图加载数据)?在这种情况下,为了尽可能简化解析,数据库的最佳连接/目标输出是什么?
据我所知,在急切加载的情况下,我需要在解析数据时管理某种类型的字典或某种类型的索引。这是真的吗?还是有更好的办法?
你的伪代码给了我一个局部变量作用域的想法。只要我告诉数据库根据一个已知标准对输出进行排序(例如作者和书籍,如你的示例),那么我不必保留本地索引/对象字典,因为我可以引用“ currentAuthor”。 – KPthunder
是的,就是这样。您可能甚至不需要告诉数据库通过a.id对列进行排序,因为它将按照该顺序返回它们,除非您告诉它以其他方式排序。 (我不确定数据库是否能够保证这种行为,但这就是他们的行为。) – ratsbane
这里有一个后续问题。如果“书籍”和“作者”也是多对多的(除了“书籍”和“商店”),怎么办?然后我需要一个应用程序端索引/字典,对吧? – KPthunder