Как реализовать хороший шаблон MVC с PHP / MySQL, не теряя время SQL-запроса / память сервера? (хорошая практика) - PullRequest
0 голосов
/ 14 апреля 2019

Я хочу реализовать реальный шаблон MVC для моих контроллеров php. В частности, я хочу разделить Model и API путем создания Java-эквивалента «bean» в PHP (объекты, созданные для организации бизнеса) и API, использующего эти бизнес-объекты.

Например, мой основной объект - член. Вопрос: где я запрашиваю свою базу данных? Запрашиваю ли я все свойства членов прямо в __construct, и я просто получаю к ним доступ через геттеры ИЛИ я ничего не делаю в __construct и вызываю базу данных в каждой функции получения? Люди говорят мне, что 1-е решение лучше, хотя, если я хочу, чтобы в моем контроллере была только конкретная информация, я создам элемент со всей информацией, вычисляемой непосредственно при конструировании (плохое управление памятью). Во втором случае, если я хочу, чтобы у нескольких участников были свойства, я сделаю несколько запросов SQL, что увеличит время выполнения моего сервера.

1-й раствор:

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;
}
// .... 

2-е решение:

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 Ответ

1 голос
/ 14 апреля 2019

Это классическая проблема, которая может усугубиться, если вам нужно одно свойство из нескольких членов.

Стандартный ответ: решение 1 лучше. Запрос одной строки из базы данных занимает намного больше времени, чем запрос одного значения из базы данных, поэтому имеет смысл запрашивать сразу всю строку. Это если строки вашей базы данных не станут очень большими. Это, однако, не должно происходить при хорошем проектировании базы данных. Если ваши строки становятся настолько большими, что снижают эффективность, возможно, пришло время разделить таблицу.

Теперь вернемся к проблеме, о которой я говорил в начале этого ответа. Вы не решили это. Я бы предложил создать два класса: один с решением 1, работающим с одной строкой, и один с решением 2, работающим с несколькими строками.

Таким образом, оба решения имеют свое место, просто решение 2 почти всегда неэффективно для работы с одной строкой, и я даже не говорил о количестве дополнительного кодирования, которое ему требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...