我有一个使用MySQL后端的PHP应用程序。这是一个只有大约100个用户的内部应用程序--我们不会每秒收到数千个请求或类似的东西。
目前在我们的数据库中,我已经创建了所谓的“主”视图。这些视图连接所有查找表并执行任何基于行的计算。例如,在一个表中,我们将存储引用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());
...有什么“最好”的方法吗?还是最好的方法,简单地说,什么起作用?
发布于 2014-10-29 19:13:02
应该使用数据库来利用联接和聚合。这是它擅长的地方。影响连接或要求连接/聚合作为计算的工件的计算通常应该在数据库本身中完成。
对于低延迟/加载/基数操作,或者当相同的基数据集基数/大小相似时,通常并不重要。
在这种情况下,日期-diff(在同一记录中的两个字段之间的数学)可以在客户机上执行;但是如果连接依赖于它,则可能不是这样。
发布于 2014-10-29 19:05:15
我在数据库里尽可能多地报告。我是一个OOP的拥护者,但是为了得到一个单独的SUM() sql调用所提供的相同的数字,我需要遍历数百个或数千个DB调用和对象创建,这是愚蠢的。
另外:你的问题很可能会结束,因为你在征求意见。别把这当回事。
发布于 2014-10-29 19:05:52
始终在DB结束时进行数据库计算。它也会给你带来巨大的性能提升。
了解一些DB概念,如PROCEDURE和FUNCTION
https://stackoverflow.com/questions/26638442
复制相似问题