2011-11-05 86 views
1

我真的迷失在這種情況下。我正在嘗試將自定義MVC框架應用於我的Web應用程序。從組織SQL查詢出現混淆。好的,下面是這種情況:php mvc商業邏輯 - 需要建議

UserRepository,ThreadRepositoryPostRepository都是保存與它們相關的SQL查詢的存儲庫。例如,在ThreadRepository我有getThread功能,通過它的ID從數據庫中獲取一個線程,在UserRepository我有getUser功能等等......

不過,說我在我的網頁檢索帖子,其帖子和提交者。當我應用上面的邏輯時,我必須明確地呼叫getUsergetThreadgetPost。如果我不使用MVC,那麼我可能會創建這樣一個SQL查詢:

SELECT * FROM user 
LEFT JOIN thread on userid = tuserid /* Thread user id = user id */ 
LEFT JOIN post on pthreadid = threadid /* Post thread id = thread id */ 

瞧,我會檢索所有需要的東西,在一個單一的查詢。但是在這種情況下,即使我編寫這樣的SQL,我應該在哪個存儲庫中放置它?我的意思是,它的尷尬看到如下代碼:

$pr = new PostRepository(); 
$user = $pr->getPostAlongItsThreadAndItsSubmitter($postid); 

來吧,看看這個,首先所有的代碼是不明確的。您必須查看PostRepository以發現用戶正在從那裏檢索,這實際上不太可能是您作爲第三人看起來的第一位。其次,它不是可擴展的。將來,隨着應用程序的增長,我必須在檢索用戶統計數據或用戶朋友或用戶消息時應用相同的邏輯。那麼這將是複雜的。另一方面,如果我調用上面提到的函數(例如getUser)來單獨檢索帖子,它的線程和提交者,那麼這意味着我將不得不犧牲很多性能,因爲我正在製作(至少)三種不同的mysql查詢來檢索一些可以通過簡單連接成功管理的基本內容。 (在這裏,我假設3個查詢比簡單的連接慢,這就是我搜索時所看到的)

最後,我真正問的是如何組織業務邏輯,以便我可以檢索一個帖子,它所屬的線程及其提交容易(實際上,這可以是很難,只要它滿足下面的選項),而這個過程是:

  1. 清澈的第三方的人(如其他開發人員會被招募到隊)
  2. 表現明智
  3. 可擴展

所有的評論和意見都非常感謝。

PS:我知道這是不是一個這是什麼這是爲什麼問題,但請,我真的需要在這種情況下幫助,所以不要在點擊關閉,只是因爲它不是一個問題,可以用一句話回答。如有必要請請我改進問題。

+0

爲什麼你不能總是提交它的提交者和線程?基本上所有關於帖子和緩存的信息。在這種情況下,您只需要一個方法 - >'getPost()'。 – egis

回答

1

首先,這看起來像是您的數據庫抽象不會抽象連接的表:您在數據庫抽象中缺少一個實現,該實現與示例SQL SELECT ... JOIN查詢等效。

所以我將這個定位爲您的基本問題。

當您使用數據庫抽象時,您可以抱怨每個抽象層都帶有價格(三分貝查詢而不是一個)或者在這裏吸取教訓:每個抽象都帶有一個價格。

否:設計上沒有銀彈。

所以如果你能通過教育新的開發者來解決你的問題(例如你實際上有你編寫的軟件的規範,對吧?)那有什麼不好?這將完成這項工作。

最後,您將有一個函數執行JOIN SQL查詢。但是你的名字。該函數將返回從數據存儲中查詢的三個對象。但是你把它打開。

抽象的好處是,你的業務邏輯裏面你沒有需要處理與數據存儲,但你只是用你的(也許你爲它找到一個更好的名字)功能:

$pr = new PostRepository(); 
$user = $pr->getPostAlongItsThreadAndItsSubmitter($postid); 

但我想知道爲什麼你用PostRepository返回$user,也許這只是因爲你無法真正下定決心。

無論如何,您的數據存儲抽象看起來非常冗餘,因爲所有類都是相似的,只是名稱不同而不同。也許你只是有一個DataRepository和可能的DataQuery對象哪些方法可以返回單個對象(Recordset like Pattern)或這些對象的列表。