此問題旨在成爲軟件/平臺不可知的。我只是在尋找通用的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