2

我正在研究一些使用MVC框架的PHP項目,儘管它們都有不同的從數據庫中檢索對象的方式,但似乎沒有什麼比用手寫SQL查詢更快,並且減少查詢數量。什麼是MVC模型中有效的數據訪問的良好平衡?

例如,我的網絡項目之一(由初級開發者編寫)執行超過100個查詢,只是加載主頁。原因是在一個地方,一個方法會加載一個對象,但是稍後在代碼的更深處,它會加載一些與第一個對象相關的其他對象。

這導致了問題的其他部分,人們在表格的某個部分只需要幾列數值而另一部分需要其他部分的情況下正在做什麼?現在(在同一個項目中),每個對象都有一個get()方法,它會執行一個「SELECT *」(或者明確列出表中的所有列),以便在任何時候因爲任何原因需要該對象時,你得到了整個事情。

因此,換句話說,你聽到所有人都在談論如何SELECT *是壞的,但如果您嘗試使用自帶的框架ORM類,它要做到這一點,通常。你堅持選擇ORM與SELECT *手動編寫特定的SQL查詢?在我看來,我們堅持在便利和效率之間,如果我手寫查詢,如果添加一列,我很可能不得不將它添加到代碼中的多個位置。

很抱歉的長期問題,但我解釋的背景,得到其他開發商的一些思維方式,而不是可能是具體的解決方案。我知道我們總是可以使用像Memcached這樣的東西,但我寧願在進入之前優化我們所能做的。

感謝您的任何想法。

+0

感謝您的回答!它幾乎證實了我的想法...... ORM並不是爲速度而設計的,而是爲了便於使用......就像貶低「編程」的lanuners並希望更好的程序員一樣。 :) – Poldon 2009-04-30 20:57:23

回答

2

首先,假設你是在SQL和架構設計精通,也有極少數情況下,任何抽象層,消除你的SQL語句將超過手工編寫SQL的效率。通常情況下,最終會導致數據訪問不理想。

對於僅僅生成一個網頁的100個查詢,沒有任何理由。

第二,如果你正在使用PHP的面向對象的功能,你將有對象的集合好抽象,並映射到SQL加入了各種擴展屬性。但要記住的重要一點是編寫最好的抽象對象,而不考慮SQL策略。

當我寫PHP代碼這種方式,我總是覺得我能夠映射每個網頁的數據要求非常少,如果非常有效的SQL查詢我的模式是正確的,我的類是適當的。不僅如此,而且我的經驗是,這是最簡單,最快速的實施方式。將框架內容放在PHP類和一個很好的精簡DAL(注意:不嵌入SQL或dbms調用)之間的中間是我可以想到的最好的例子來說明「泄漏抽象」的概念。

0

我對你的問題有點遺憾,但是如果你正在尋找一種數據庫訪問的方式,你可以通過幾種方式來完成。您的MVC可以使用隨數據庫訪問抽象提供的Zend框架,您可以使用它。

還要記住,您應該設計好自己的系統,以確保數據庫中不存在爭用,因爲您的查詢全部分散在php頁面中,並且可能會鎖定表,導致整個Web應用程序性能下降並變得更慢隨着時間的推移。

這就是爲什麼有時候可以使用存儲過程的原因,因爲它在一個地方,可以在我們需要的時候進行調整,儘管其他人可能會爭辯說,如果查詢語句位於前端,調試更容易。

0

沒有ORM框架,甚至會接近手寫SQL速度方面,雖然100次的查詢顯得不現實的(也許你有一點誇張),即使你有ORM框架編寫代碼的創造者,它總是遠離優秀的舊SQL的速度。

我的建議是,看一下整個畫面不僅速度:

  • 該框架是否提高了代碼的可讀性?

  • 您的團隊是否願意編寫SQL並將其與代碼混合?

  • 你真的明白如何優化框架查詢嗎? (我認爲每個對象的get()不是獲取它們的最佳方式)

  • 框架的查詢(優化之後)是否存在瓶頸?

我從來沒有開發的PHP什麼,但我認爲你可以在應用程序的深入剖析後可能混合了這兩種方法(ORM和普通的SQL),你能確定真正的瓶頸和然後替換手寫SQL的ORM代碼(通常在ruby中使用ActiveRecord,然後用一些新的文檔分析應用程序,最後如果你有一個複雜的AR查詢,你替換某些SQL)

Regads

0

相信你的經驗。

要不在代碼中重複自己,您可以使用自己的SQL編寫一些簡單的模型函數。這就是我一直在做的事情,我對此感到滿意。

許多「便利」的東西是爲那些需要魔法的人編寫的,因爲他們不能親手做,或者沒有經驗。

畢竟這是一個風格問題。

不要猶豫,添加自己的圖層或與自己的東西交換或擴展給定的圖層。保持清潔,做出好的設計和一些文件,以便稍後再回來時感覺到家。

相關問題