在哪里执行数据计算:在对象或数据库中?

时间:2014-10-29 18:56:06

标签: php mysql oop

我有一个使用MySQL后端的PHP应用程序。这是一个内部应用程序,只有大约一百个用户 - 我们每秒都没有收到数千个请求或类似的东西。

目前在我们的数据库中,我创建了所谓的“主”视图。这些视图连接所有查找表并执行任何基于行的计算。例如,在表中我们将存储引用member_id表的members。在视图中,我将从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());
...

有“最好”的方法吗?或者最简单的方法是什么?

3 个答案:

答案 0 :(得分:2)

应使用数据库来利用加入聚合。这是它擅长的地方。 影响连接的计算需要连接/聚合作为计算的工件通常应在数据库本身中完成。

对于低延迟/负载/基数操作,或者当相同的基本数据集基数/大小相似时,它通常只是不重要。

在这种情况下,date-diff(同一记录中两个字段之间的数学运算)可以在客户端上完成;但如果连接依赖于它,则可能不一致。

答案 1 :(得分:0)

我在数据库中尽可能多地报告。我是一个巨大的OOP支持者,但是通过数百或数千个数据库调用和对象创建只是为了获得与单个SUM()sql调用提供的数字相同的数字,这简直是愚蠢的。

另外:您的问题可能会因为您要求提出意见而被关闭。不要亲自接受。

答案 2 :(得分:0)

始终在DB端自己进行数据库计算。它也将为您带来巨大的性能提升。

了解一些数据库概念,例如PROCEDURE&amp; FUNCTION