我正在寻找有关在将对象集合持久保存到数据库时如何使用封装的最佳实践建议。
例如,您需要保留一个拥有产品集合的分销商。如果您保持封装并且不弄乱与分销商类中的产品表相关的数据库内容,您需要对数据库进行过多的点击以将每个产品保存在一个循环中。代码如下所示:
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/