какова обычная практика выполнения oo в db?

Вот ситуация.... ... У меня есть 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, который позволяет мне получать связанные элементы БД, например:

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

Но в этом «решении» у меня возникли некоторые проблемы: я теряю отношения в объекте «клиент»… да, я могу прочитать все записи, получить объект «клиент», в основном ничего не зная о записи о покупке. ...

Некоторые могут попросить меня сделать что-то вроде этого:

class customer{
    //skip other methods...

    public getPurchaseRecords(){
       //query the db
    }

}

Это работает, но я не хочу, чтобы структура объекта имела сильную связь между базой данных... Вот почему я придумываю материал DBCmd...

Итак, все кажется очень связанным, как это решить? Спасибо.


person Tattat    schedule 29.07.2011    source источник


Ответы (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);
person ricick    schedule 29.07.2011