封装与数据库性能

时间:2013-06-29 22:42:23

标签: oop design-patterns orm persistence encapsulation

我正在寻找关于在将对象集合持久保存到数据库时如何使用封装的最佳实践建议。

例如,您需要坚持拥有一系列产品的经销商。如果你保持封装并且不搞乱与分发器类中的产品表相关的数据库内容,则需要对数据库进行过多命中,以便在循环中保存每个单独的产品。代码看起来像:

class Distributor {
  private $products;
  function save() {
    foreach ($products as $prod) {
      // 10000 products = 10000 hits to the DB! Instead of only one!
      $prod->save();
    }
  }
}

另一方面,如果您想优化查询并执行多行插入/插入更新,您可以执行更复杂的操作:

class Distributor {
  private $products;
  $query = $dao->getInsertUpdateQueryInstance();
  foreach ($products as $prod) {
    // Much extra code for implementing such an encapsulation.
    $query->addRow($prod->getRow());
  }
  $query->execute();
}

这意味着您需要将具有特定功能的DAO层编写为addRow()。

我看到的第三种可能性是在Product类中创建一个静态数组,但这打破了关注点的逻辑分离。现在,产品列表保存在同一产品类中,而不是与其分销商相关。

class Distributor {
  // I'm a distributor and I have nothing to do...
}
class Product {
  private static $products;
  function save() {
    foreach (self::products as $prod) {
      // add row
    }
    // persist 10000 rows
  }
}

封装,但太丑了!如果你有几个经销商怎么办?所有产品都会保留在同一个阵列中?

是否有一些非过于复杂的方法来实现这一目标? ORM是唯一的出路吗?

1 个答案:

答案 0 :(得分:1)

为您的经销商编写特定的DAO没有问题。第二种解决方案很好,而不应考虑第三种解决方案。静态不好。

干杯