oop - 封装与数据库性能

标签 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();
    }
  }
}

另一方面,如果您想优化查询并执行多行 Insert/InsertUpdate,您可以像这样执行更复杂的操作:

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 是唯一的出路吗?

最佳答案

为您的 Distributor 编写特定的 DAO 没有问题。第二个解决方案很好,而第三个解决方案不应该考虑。静电不好。

干杯

关于oop - 封装与数据库性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17385367/

相关文章:

java - 调用父类(super class)型方法会创建一个新的父类(super class)型对象吗?

Java 原型(prototype)克隆没有按预期工作?

java - Hibernate 可以使用 MySQL 的 "ON DUPLICATE KEY UPDATE"语法吗?

c++ - 构造函数的问题

c++ - 如何使用类中的函数从 main 打印变量,帮助理解 OOP c++

python - 类型(元类)和对象(父类(super class))之间的关系

java - 在 Java 中使用装饰器设计模式时,装饰器的顺序重要吗?

java - 需要根据输入字符串调用多个EJB

oracle - 默认情况下,使用Oracle数据库时,Hibernate会将 bool 数据类型映射到什么?

java - 尝试在空对象引用上调用虚拟方法 'java.lang.Class java.lang.reflect.Field.getType()'