2013-05-08 32 views
0

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

  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 ... 
+4

我不明白。你希望如何在数据库中使用数据而不先将数据带入内存(即将数据作为对象或数组存储在变量中)? – sgroves 2013-05-08 19:16:42

+1

我不确定你在问什么。这是关于为什么要在数据库中创建类和对象表示的数据...? – deceze 2013-05-08 19:17:06

回答

2

你有一个重大的误解。 PHP是不是守护程序环境 - 换句话说,你的对象没有存储或除非您使用的是非常具体的建立这样做的客户端中共享。默认情况下,PHP是功能性的 - 它将通过指令从头到尾进行,当它完成时,它会结束并关闭。

这意味着你的产品,比如,ID 4在你的数据库,只使用过,而它在PHP内存。默认情况下,当引用结束时,PHP会解除它。所以,假设你有你的产品模型实例,你使用它,然后你解除它 - 瞧,从内存中消失。

把你的代码,例如。在控制器上,您打电话给getProduct。该产品被找到,返回,并在控制器完成时,它未被设置。这导致了一个SQL查询。这是一种双存储形式,但不会比使用旧的过程式MySQL代码风格更加苛刻。

模型本身,本身就是你的数据的表示。它允许您将所有数据库结构抽象为一种合理且更合乎逻辑的形式,更重要的是,可以轻松缓存,传输和检索。它不是第二种存储形式。把它看作是一个“翻译”。

我猜的答案从上面:

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

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

+1

调用PHP“功能”是一个相当有争议的术语使用... :) – deceze 2013-05-08 19:22:14

+0

由此我的意思 - 连接到我的数据库,打印数据到屏幕,关闭数据库,而不是连接到我的数据库,创建PHP对象(我相信这是存储在内存中),关闭数据库,然后每次从对象打印。 – 2013-05-08 19:26:25

+0

@ caleb.breckon:关闭数据库连接的成本并不重要。这是我的老板发现的。你想保持开放 - 最好的情况下,你可以重新使用它。最糟糕的情况下,PHP将其关闭** **后,您的页面呈现。双赢。 – 2013-05-08 19:27:26

3

它在技术上将数据库中的数据复制到内存中,但与阅读餐馆菜单的方式相同,将菜单项复制到您自己的内存中。没有办法利用或处理来自数据库的数据而没有将它读入内存,以便使用数据的脚本执行操作,就像没有办法从菜单中排序某些内容而没有将其暂存在自己的内存中一样。而且,就像你可能记不住大部分菜单一样 - 在你不再需要它之后忘记 - 在脚本完成执行后,PHP将不会在内存中保存任何东西,因为整个虚拟机在脚本结束。

最好不要读取不需要的数据到内存中 - 例如,查找您需要的一条用户记录,而不是整个用户表。你必须做自己的基准测试来评估你自己的具体情况,但总的来说,你最好重复做一些小的查询(使用良好索引的WHERE子句)来检索你需要的数据,而不是做大量查询来检索您可能需要或可能不需要的大量数据。

相关问题