2014-10-29 65 views
0

我有一個使用MySQL後端的PHP應用程序。這是一個只有100多個用戶的內部應用程序 - 我們沒有每秒獲得數千個請求或類似的東西。何處對數據執行計算:在對象中還是在數據庫中?

當前在我們的數據庫中,我創建了我所謂的「主」視圖。這些視圖加入所有查找表並執行任何基於行的計算。例如,在表格中,我們將存儲參考members表的member_id。在這個視圖中,我將從members表中刪除所有列。我會爲所有查找表執行此操作。對於基於行的計算,這些通常是簡單的計算,例如兩個日期之間的天數差異。我有這些主視圖,因爲它使得編寫查詢(特別是報表)非常容易,因爲我的所有聯接都已經完成,並且已經進行了任何簡單的計算。

我的問題是 - 這是做到這一點的最好方法嗎?例如,我不會在視圖內執行所有這些計算,而是將這些計算移到我的課程中。所以,在我的例子以上,代替具有用於計算兩個日期(flock_age)之間的差值在所述視圖中的列,我會簡單地在我的類寫的方法來執行此計算:

<?php 
class FlockEx extends Flock 
{ 
    public function getFlockAge() 
    { 
     $date1 = new \DateTime($this->getDatePlaced()); 
     $date2 = new \DateTime($this->getDatePickedUp()); 

     $difference = $date1->diff($date2); 

     return $difference->days; 
    } 
} 

而代替加入所有這些查找表的,我會簡單地創建這些類,而不是新的實例:

<?php 
$flockdb = new FlockDB(); 
$flock = $flockdb->getFlockById(4); 

$memberdb = new MemberDB(); 
$member = $memberdb->getMemberById($flock->getMemberId()); 
... 

是否有一個「最佳」的方式來做到這一點?或者,最簡單的方法是什麼?

+1

恕我直言....我會盡我所能做數據庫中的任何事情,只要它能夠彎曲數據庫的肌肉。 – 2014-10-29 19:02:52

回答

2

數據庫應該被用來利用加入聚集。這是它擅長的地方。計算結果影響加入要求連接/聚合作爲工件通常應該在數據庫本身完成。

對於低延遲/負載/基數操作,或者當相同的基本數據集基數/大小相似時,它通常不重要。

在這種情況下,date-diff(同一記錄中兩個字段之間的數學)在客戶端上很好;但如果一個連接依賴於它,可能不會。

0

我在數據庫中儘可能多地報告。我是一個龐大的面向對象的支持者,但是通過數百或數千次數據庫調用和對象創建只是爲了獲得與單個SUM()SQL調用將提供的數量相同的數字而已。

另外:您的問題可能會因爲您要求意見而關閉。不要個人承擔。

+0

我知道這是基於意見的,但我不知道任何其他方式去尋找答案。感謝您的輸入。 – Jeff 2014-10-29 19:20:08

0

總是在DB端自己做數據庫計算。它也會給你帶來巨大的性能提升。

瞭解一些DB的概念,如PROCEDURE & FUNCTION

相關問題