2014-10-29 61 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

相关问题