【问题标题】:what is the common practice on doing oo in db?在 db 中做 oo 的常见做法是什么?
【发布时间】:2011-07-29 03:44:14
【问题描述】:

这里的情况...... 我有一个 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 

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

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

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

class getReleatedPurchaseRecordDBCmd{
    public _constructor($aCustomerObject){
    }
    //.... ....
}

但是在这个“解决方案”中,我遇到了一些问题,是我失去了对象客户中的关系......是的,我可以读回所有记录,得到客户对象基本上不知道任何事情购买记录....

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

class customer{
    //skip other methods...

    public getPurchaseRecords(){
       //query the db
    }

}

它可以工作,但我不希望对象结构与 db 之间有某种强关系......这就是我想出 DBCmd 东西的原因......

那么,一切似乎都很耦合,怎么解决呢?谢谢你。

【问题讨论】:

    标签: php database oop object-oriented-analysis


    【解决方案1】:

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

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

    返回

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

    然后我可以根据需要将计数用于任何显示内容,如果我需要记录填充调用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-13
      • 2010-10-16
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2020-05-07
      • 1970-01-01
      相关资源
      最近更新 更多