为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕尼黑8549860 2021-03-31 13:15:36
我想为我的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,那么在拆分模型和控制器时如何不浪费任何时间/内存呢?
查看完整描述

1 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

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

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

现在回到我在此答案开头提到的问题。您还没有解决这个问题。我的建议是制作两类:一种解决方案1,处理一行,另一种解决方案2,处理多行。

因此,这两种解决方案都有自己的位置,只是解决方案2几乎总是无法处理一行,而且我什至没有谈到它所需的额外编码量。


查看完整回答
反对 回复 2021-04-23
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信