猿问

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

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


例如,我的基本对象是会员。问题是:我在哪里请求数据库?我是否在__construct上要求所有成员的属性,并且只使用getter访问它们,或者在__construct中什么也不做,并且在每个getter函数中调用数据库?人们告诉我,第一种解决方案更好,但是,如果我只想在控制器中提供特定信息,我将创建一个Member,其中包含在构造时就计算出的所有信息(错误的内存管理)。在第二种情况下,如果我想要几个成员属性,我将执行几个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 Exceptions\MyDefaultException("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 Exceptions\MyDefaultException("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,那么在拆分模型和控制器时如何不浪费任何时间/内存呢?


慕尼黑8549860
浏览 113回答 1
1回答

慕尼黑5688855

这是一个经典的问题,如果您想要多个成员的一个属性,甚至会变得更糟。标准答案是解决方案1更好。从数据库中请求一行不会比从数据库中请求一个值花费更长的时间,因此一次请求整行是有意义的。那是除非您的数据库行变得很大。但是,在良好的数据库设计中不应发生这种情况。如果您的行太大,以至于妨碍了效率,那么可能是时候拆分表了。现在回到我在此答案开头提到的问题。您还没有解决这个问题。我的建议是制作两类:一种解决方案1,处理一行,另一种解决方案2,处理多行。因此,这两种解决方案都有自己的位置,只是解决方案2几乎总是无法处理一行,而且我什至没有谈到它所需的额外编码量。
随时随地看视频慕课网APP
我要回答