2010-05-04 93 views
0

我想知道填充具有子對象集合的對象的最佳方式,並且每個子對象都可以有一個對象集合,從數據庫中不需要對數據庫進行多次調用即可獲得每個對象的子對象。基本上採用分層格式,例如客戶有訂單,每個訂單都有訂單項目。最好是以xml格式(SQL Server 2005)檢索數據,還是通過將相關表連接在一起然後將該數據映射到對象來檢索數據集?在此先感謝您的幫助。從數據庫填充對象圖

+0

對同一主題的問題,有希望的答案:HTTP://計算器。com/questions/2409228/generate-structured-xml-document-from-hierarchical-table-data-t -sql – 2010-05-04 17:09:10

回答

1

有很多的變數仍然存在:

  1. 是同一類型的子對象?如果是這樣,你可以同時選擇它們,然後在對象映射圖層中設置父/子關係。
  2. 孩子的物體可以有自己的孩子嗎?如果嵌套是無限制的,那麼除非獲得所有數據,否則無法同時獲得所有數據。

您當然可以在所有的客戶 - >訂單 - >訂購項目上加入一切,並在代碼中打破一切,但似乎這樣會在重複的父行中產生大量的開銷,在處理這個大混亂的工作。

試圖避免進行多次呼叫可能是一種過早的優化。對數據庫進行太多調用會帶來性能問題嗎?

編輯:根據您的意見,您應該能夠做到每個層級一個查詢:

Select * from orders 
where orders.customerid = my_customer_id 

--Do一些ORM映射,使子對象的列表ids--

Select * from child_order_object 
where child_order_object_id in (list of child object ids) 

--Do一些ORM映射和鏈接子對象以前父objects--

...

--Repeat更多幾層

你應該能夠讓每個關係的水平,而不是查詢的爆炸性增長只是一個查詢由得到的只是一個對象ID。

+0

不,子對象的類型不同。是的,當我需要一次性檢索大量數據時,它會導致性能問題,而且我認爲這不是有效的方式。可以說客戶有30個訂單,並且假設每個訂單都有另外一個子訂單項集合,也就是60個調用來檢索客戶的所有訂單(每個訂單有兩個數據庫調用),完全填充子對象。這只是一個用來解釋問題的例子。 – RKP 2010-05-04 17:35:10

+0

我們在我們的項目中沒有使用任何ORM工具,因此目前不可能將所有現有數據訪問代碼轉換爲使用該工具。所以我想或者我需要檢索一個連接的數據集,然後解析它來構造對象的層次結構或從數據庫中獲取一個xml。無論如何感謝信息。 – RKP 2010-05-24 13:18:29

1

您可以查看ORM s,例如NHibernateEntity Framework,它們是專門針對這種情況而設計的。

+0

ORM仍然會對數據庫進行多次調用,對嗎? – 2010-05-04 17:07:05

+2

@Tiberiu Ana - 只能說NHibernate,但可以通過使用預先獲取或在HQL語法中指定連接來避免多個數據庫調用。 – 2010-05-04 17:09:09

+0

我想看看那個證明。除非它使用遞歸查詢,或者它一次讀取表中的每個對象,否則它將不得不多次訪問數據庫。我不認爲很多NHibernate支持的數據庫都支持遞歸查詢。 – 2010-05-04 17:13:00