0

我的问题是:如果我根据 MySQL 中的数据在 PHP 中创建对象,我不是双重存储数据,因此浪费资源并减慢我的应用程序吗?

  1. 人们是否只是为了将 MySQL 数据缓存为允许更快访问的对象,因为用户每次切换到新产品时都不会查询数据库?
  2. 他们只是为不太复杂的代码做这件事吗?
  3. 在小型 MVC 中处理此问题的适当方法是什么?即在会话开始时,模型是否应该创建一个包含所有产品的数组?不应该有所有产品的数组,每次都询问数据库并将这些数据转换为新的产品对象吗?

如果您愿意,可以继续阅读我为什么要问...

我知道这对我的应用程序的大小并不重要,但我想正确地开始它。我制作了一个基本的小 MVC 和一个我们称之为产品的项目数据库。为了方便起见,只是试图决定是否/何时/何处从 MySQL 数据到 PHP 对象。

这就是我的文件树的样子:

root
    controller
        Controller.php
    model
        Model.php
        Product.php
    view
        Products.php
        Product.php
    index.php

以下是相关代码:

// Controller.php
if (!isset($_GET['product'])) {
    - getProducts() && include view/Products
} else {
    - getProduct('product') && include view/Product
}

// Model.php
getProducts() {
    while($row = $stmt->fetch_assoc()) {
        $array[$i] = new Product($row["id"], $row["name"], $row["price"]);
        $i++;
    }
    return $array;
}
getProduct($id) {
    $allProducts = $this->getProducts();
    return $allProducts[$id];
}

// Products view
<?php foreach ($products as $product): ?>
    display $product->id and $product->name
<?php endforeach; ?>

// Product view
display $product->name and $product->description and $product->price ...
4

2 回答 2

3

从技术上讲,它确实将数据库中的数据复制到内存中,但就像在餐厅阅读菜单会将菜单项复制到您自己的内存中一样。如果不将数据库中的数据读入内存以供使用数据的脚本执行,就无法利用或处理数据库中的数据,就像在不将其短暂保存在自己的内存中的情况下无法从菜单中订购一样。而且,正如您在用餐结束时可能不记得大部分菜单 - 在您不再需要它后忘记了 - 在脚本完成执行后,PHP 不会在内存中保存任何内容,因为整个 VM 在一个脚本结束。

最好不要将不需要的数据读入内存 - 例如,查找您需要的一个用户记录,而不是整个用户表。您必须进行自己的基准测试来评估您自己的特定场景,但一般来说,您最好执行重复的小查询(使用使用良好索引的 WHERE 子句)来仅检索您需要的数据,而不是执行大型查询来检索您可能需要或不需要的大量数据。

于 2013-05-08T19:36:56.523 回答
2

你有一个严重的误解。PHP不是守护程序环境 - 换句话说,您的对象不会在客户端实例之间存储或共享,除非您使用非常特定的设置来执行此操作。默认情况下,PHP 是功能性的——它会从头到尾通过指令执行,完成后,它会结束并自行关闭。

这意味着您的产品(例如数据库中的 ID 4)仅在其位于 PHP 内存中时才被使用。默认情况下,当某些东西用完引用时,PHP 会取消设置它。所以,假设你有你的产品模型实例,你使用它,然后你取消它——瞧,从记忆中消失了。

以您的代码为例。在控制器上,您正在调用getProduct. 产品被找到,被退回,控制器完成的那一刻,它被取消设置。这导致了一个 SQL 查询。它是双重存储的一种形式,但并没有比仅仅使用旧的过程 MySQL 代码风格要求更高。

模型本身就是数据的表示。它允许您将所有数据库结构抽象为一种有意义且更合乎逻辑的形式,更重要的是,易于缓存、传输和检索。它不是第二种存储形式。将其视为“翻译”。

我猜上面的答案是:

  1. 它启用缓存,但这是一个很好的副作用。他们这样做主要是为了可维护性、代码可读性以及轻松和良好地使用依赖注入式的参数格式
  2. 是的。更简单、更易于维护、更易于使用、更易于扩展
  3. 你的模型应该有一个吸气剂,或者你应该为你的模型制作一个定位器。这是相同的目的 - 您给它一个 ID,它通过查询您希望使用的数据库或缓存引擎来返回模型。如果您不确定如何构建它,请使用已经制作的工具。大多数现代框架都有这个 - Laravel 和 Symfony 是应该如何做的两个很好的例子。

最后,您能否向我解释一件事:您打算如何从 MySQL 获取数据而不将其存储在内存中?PHP 不具备心灵感应。

于 2013-05-08T19:18:13.390 回答