是不是PHP中的OOD双重存储MySQL中的资源非常浪费?

时间:2013-05-08 19:11:44

标签: php mysql

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

  1. 为了将MySQL数据缓存为允许更快访问的对象,人们是否这样做是因为用户每次切换到新产品时都不查询数据库?
  2. 他们只是为不太复杂的代码而做吗?
  3. 在小型MVC中处理此问题的适当方法是什么?即在会话开始时,模型是否应该创建所有产品的数组?应该永远不会有所有产品的数组,每次只询问数据库并每次都将这些数据转换为新的Product对象吗?
  4. 如果你愿意,你可以继续阅读我为什么要问......

    我知道这对我的应用程序的大小并不重要,但我想开始做对。 我有一个基本的小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 ...
    

2 个答案:

答案 0 :(得分:3)

它在技术上将数据库中的数据复制到内存中,但同样地,在餐厅阅读菜单会将菜单项复制到您自己的内存中。没有办法利用或处理来自数据库的数据,而没有将数据读入内存,因为脚本正在使用数据,就像没有办法从菜单中订购某些东西而没有简单地将其保存在你自己的记忆。并且,正如你可能在用餐结束时记不起大部分菜单 - 在你不再需要它之后忘记了 - 在脚本完成执行后PHP将不会在内存中保留任何内容,因为整个VM在脚本结束。

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

答案 1 :(得分:2)

你有一个很大的误解。 PHP是 NOT 守护程序环境 - 换句话说,除非您使用非常具体的设置,否则不会在客户端实例之间存储或共享您的对象。默认情况下,PHP是功能性的 - 它将从头到尾通过指令完成,一旦完成,它就会结束并自行关闭。

这意味着您的产品(例如,数据库中的ID 4)仅在PHP内存中使用。默认情况下,当某些内容耗尽引用时,PHP会取消它。所以,假设你有你的产品模型实例,你使用它,然后你取消它 - 瞧,从记忆中消失。

例如,拿你的代码。在控制器上,您正在呼叫getProduct。找到,返回产品,控制器完成时,它未设置。这导致了一个SQL查询。它是一种双重存储形式,但与使用旧的程序化MySQL代码风格相比,并没有任何要求。

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

我猜是上面的答案:

  1. 它启用了缓存,但这是一个很好的副作用。他们主要是为了可维护性,代码可读性以及轻松而恰当地使用依赖注入式参数格式
  2. 是。不太复杂,易于维护,易于使用,更易于扩展
  3. 您的模型应该有一个吸气剂,或者您应该为您的模型制作定位器。这是相同的目的 - 您为它提供一个ID,它通过查询您希望使用的数据库或缓存引擎来返回模型。如果您不确定如何构建它,请使用已制作的工具。大多数现代框架都有这个--Laravel和Symfony是应该完成的两个非常好的例子。
  4. 最后,你能解释一下:你如何计划从MySQL获取数据而不将其存储在内存中? PHP没有心灵感应。