2015-04-04 48 views
0

我有一個產品對象也聚集了幾個「對象數組」 屬性,類別,顏色,大小等現在 我有一個包含對每個對象數據庫的表... 產品,屬性,類別,顏色,尺寸等 現在我的查詢檢索產品列表有7-8個連接,因爲我的數據庫有一些其他表包含產品的多對多關係其相關實體。PHP - 填充聚合對象 - 最佳實踐

一切都很好。現在問題出現在我從PDO檢索數據時需要填充我的產品 - 以及它的所有聚合對象。 我需要做很多嵌套循環來填充我的產品對象數組,這是一個非常繁瑣的活動,也似乎不是一個很好的編程實踐(直觀)。

我不想使用任何ORM,因爲在我看來,ORM對於這些連接數量效率非常低。

什麼是處理這種情況的最佳實踐。

非常感謝您的時間。

編輯:(基於KIKO軟件評論)

凡我大部分的產品檢索查詢的條款,將包含條件,關係到其聚集的實體,和我之前寫的,我有一些多對多關係也是如此。所以這意味着我已經在使用數據庫資源「甚至」,如果我去懶加載。那麼,在這種情況下,如果加載我的結果的子集,急切加載會是更好的選擇?如果是這樣,我的原始問題再次保持不變;我能否逃避太多的嵌套循環來加載聚合對象?

感謝

回答

0

你應該有獲取和設置的東西像proterties,名作,顏色和大小的產品對象的方法。我通常所做的只是在實際需要時才檢索這些對象。所以只有當你使用get例程。通過這種方式,您可以快速創建新產品對象,因爲它不會通過檢索所有數組來減慢速度,特別是在您甚至不使用它們時。

正如您在評論中指出的那樣,請致電延遲加載:您只需檢索所需內容。

我看不出有什麼理由急切加載數據庫數據。換句話說:儘快加載所有內容。唯一的原因可能是,如果你能做得比延遲加載的數據,並且你知道你可能需要所有的數據。

我認爲你可以在PDO中做很多事情來加快從不同表格中檢索多行(除了正常的數據庫優化)。 fetchAll()可能會比fetch()略快,但這將是微不足道的。所以最好的策略仍然是延遲加載

有幾種方法可以執行延遲加載。每當調用get方法時,您只能檢索請求的行,或者您可以一次檢索關聯平板電腦中所有需要的行。當需要檢索很多行時,第一種方法更加高效,並且您可能只需要其中的幾個。第二種方法是最好的選擇,當沒有很多行被檢索時,無論如何您可能需要大部分行。

所以具體使用方法取決於您的需求,但在所有情況下,延遲加載可能是最佳實踐。

+0

謝謝你的解決方案,我可以看看它是否適合根據需要。如果我需要急切加載,是否還有其他解決方法? 其次,檢索過程的原因通常會減慢:從數據庫檢索數據或循環訪問每個記錄以填充對象? (如果數據庫表的大小不是太大) – developer 2015-04-04 18:54:42

+0

你的第一個問題應該在答案中得到回答,而不是在評論中回答。至於你的第二個問題:數據庫訪問的速度遠遠低於將檢索到的數據存儲在php對象中的任何事情。所以每當你不需要訪問數據庫時,你都不應該這樣做。數據庫訪問可以通過很多因素加速,例如:服務器的位置,服務器的速度,索引,正確的數據標準化等等。只是使用連接並不能真正幫到那麼多。但是,每當有疑問衡量它! – 2015-04-04 19:20:59

+1

我已根據您的意見編輯了我原來的問題。謝謝你給我一個方向。 – developer 2015-04-04 19:52:07