在PHP中重复存储MySQL中的数据是非常浪费的


Isn't OOD in PHP double storing what is in MySQL resourcefully wasteful?

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

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

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

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

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

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

你有一个很大的误解。PHP是NOT一个守护进程环境——换句话说,您的对象不会在客户端实例之间存储或共享,除非您使用非常特定的设置来这样做。默认情况下,PHP是函数式的——它会按照指令从开始到结束,当它完成后,它会结束并自动关闭。

这意味着你的产品,比如DB中的ID 4,只有在PHP内存中才会被使用。默认情况下,一旦引用耗尽,PHP就会取消设置。所以,假设你有你的产品模型实例,你使用它,然后你取消它-瞧,从内存中消失了。

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

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

我猜答案来自上面:

  1. 它启用缓存,但这是一个很好的副作用。他们这样做主要是为了可维护性、代码可读性,以及方便、美观地使用依赖注入式的参数格式
  2. 是的。更简单,更容易维护,更容易使用,更容易扩展
  3. 你的模型应该有一个getter,或者你应该为你的模型创建一个定位器。这是相同的目的—您给它一个ID,它通过查询您喜欢使用的DB或缓存引擎将模型返回给您。如果您不确定如何构建它,请使用已有的工具。大多数现代框架都有这个功能——Laravel和Symfony就是两个很好的例子,说明了应该如何完成

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