在db中做oo的常见做法是什么?

时间:2011-07-29 03:44:14

标签: php database oop object-oriented-analysis

这是情况....... 我有一个DBManager,它实现了DBInterface,在DBInterface中,我得到了4个方法:

-create(DBCmd);
-read(DBCmd);
-update(DBCmd);
-delete(DBCmd);

DBCmd对象负责生成SQL语句,而DBCmd需要sql语句中的对象:

class DBCmd{
    public _constructor($aObj){
    }
    public executeCreate(){
    }
    public executeRead(){
    }
    public executeUpdate(){
    }
    public executeDelete(){
    }

}

流程将是这样的:

aObject ---> put it into DBCmd ----> put the DBCmd in DBManager ---> execute 

但是当我得到一些与其他表相关的对象时会出现问题,例如......客户有购买记录,哪个购买记录有很多项......

那么,我在读取方法中该怎么办?我应该阅读与客户相关的所有记录吗?我是否还需要循环购买记录中的所有项目? 如果是,当我做读客户时,我需要查询3个表,但有些可能不需要查看.....它会浪费资源......

我想出了另一个解决方案,我创建了一组新的DBCmd,允许我获取相关的DB项目,例如:

class getReleatedPurchaseRecordDBCmd{
    public _constructor($aCustomerObject){
    }
    //.... ....
}
但是在这个“解决方案”中,我遇到了一些问题,是我在对象客户中丢失了关系...是的,我可以读回所有记录,得到客户对象基本上不知道任何关于购买记录....

有些人可能会让我做这样的事情:

class customer{
    //skip other methods...

    public getPurchaseRecords(){
       //query the db
    }

}

它有效,但我不希望对象结构在db之间有一些很强的关系....这就是为什么我想出DBCmd的东西......

所以,一切似乎都很耦合,怎么能解决呢?谢谢。

1 个答案:

答案 0 :(得分:0)

对于这样的东西,我倾向于获得子对象的计数,初始查询通常涉及sql COUNT和JOIN,然后有一个单独的getSubObjects命令,可以在以后需要时调用。例如:

$datamodel->getCustomer($id);//or some such method

返回

class Customer{
   $id = 4;
   $recordCount = 5;
   $records = null;
}

然后我可以根据需要使用count来显示任何显示内容,如果我需要记录填充调用:

$customer->records = $datamodel->getCustomerRecords($customer->id);