如何在不损失SQL请求时间/服务器内存的情况下使用PHP / MySQL实现良好的MVC模式?(良好做法)



我想为我的php控制器实现一个真正的模式MVC。特别是,我想通过在PHP(为业务组织创建的对象)中创建java"bean"等效物来拆分模型和API,并使用这些业务对象进行API。

例如,我的基本目标是成员。 问题是:我在哪里请求我的数据库? 我是否在__construct请求所有成员的财产,我只是使用 getter 访问它们,或者我在__construct中什么都不做,我在每个 getter 函数中调用数据库? 人们告诉我,第一个解决方案更好,但是,如果我只想在我的控制器中提供特定信息,我将创建一个成员,其中包含在构造时计算的所有信息(糟糕的内存管理)。在第两种情况下,如果我想要几个成员属性,我将执行几个SQL请求,这将增加我的服务器执行时间。

第一个解决方案:

public function __construct($ID_membre,$sql)
{
$this->ID_membre = $ID_membre;
$res = mysql_get("select * from membres where ID_membre = $ID_membre",$sql);
if(!$res)
throw new ExceptionsMyDefaultException("no member for this Id");
$this->firstName = $res['first_name'];
$this->lastName = $res['last_name'];
$this->mail = $res['mail'];
$this->gender = $res['gender'];
// ....
$this->sql = $sql;
}
public function getLastName()
{
return $this->lastName;
}
public function getMail()
{
return $this->mail;
}
public function getGender()
{
return $this->gender;
}
// .... 

第二个解决方案:

public function __construct($ID_membre,$sql)
{
$this->ID_membre = $ID_membre;
$res = mysql_get("select count(*) from membres where ID = $ID_membre",$sql);
if($res == 0)
throw new ExceptionsMyDefaultException("no member with this id");

$this->sql = $sql;
}
public function getLastName()
{
mysql_get("select name from members where ID = {$this->id}",$this->sql);
return $this->lastName;
}
public function getMail()
{
mysql_get("select mail from members where ID = {$this->id}",$this->sql);
return $this->mail;
}
public function getGender()
{
mysql_get("select gender from members where ID = {$this->id}",$this->sql);
return $this->gender;
}

在这种情况下,控制器中的旧SQL自定义请求非常适合不浪费时间或内存,因为它们是自定义。那么,为什么现在做这样的请求这么差呢?如果像Fb或Google这样的大型组织使用数据库进行MVC,他们如何在拆分模型和控制器时不浪费任何时间/内存?

这是一个经典的问题,如果你想要一个属性的多个成员,情况甚至会变得更糟。

标准答案是解决方案 1 更好。从数据库请求一行并不比从数据库请求一行花费更长的时间,因此一次请求一整行是有意义的。除非数据库行变得非常大。但是,在良好的数据库设计中不应发生这种情况。如果您的行变得太大以至于妨碍效率,那么可能是时候拆分表了。

现在回到我在这个答案开始时提到的问题。你还没有解决这个问题。我的建议是创建两个类:一个使用解决方案1处理一行,另一个使用解决方案2处理多行。

所以这两种解决方案都有自己的位置,只是解决方案 2 在处理一行时几乎总是效率低下,我什至没有谈论它需要的额外编码量。

相关内容

  • 没有找到相关文章

最新更新