我正在寻找关于如何在将对象集合持久化到数据库时如何使用封装的最佳实践建议。
例如,您需要持久化具有产品集合的分销商。如果您保持封装,并且不会弄乱与distributor类中产品表相关的数据库内容,那么您需要对数据库进行过多的访问,以便在循环中保存每个产品。代码将如下所示:
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类中创建一个静态数组,但这打破了关注点的逻辑分离。现在,产品列表被保存在相同的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是唯一的出路吗?
发布于 2013-07-10 04:39:58
为您的分发服务器编写特定的DAO没有任何问题。第二个解决方案很好,而第三个解决方案不应该被考虑。静电是不好的。
干杯
https://stackoverflow.com/questions/17385367
复制相似问题