какова общая практика делать oo в БД? - PullRequest
0 голосов
/ 29 июля 2011

Вот ситуация .... ... У меня есть 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 ...

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

1 Ответ

0 голосов
/ 29 июля 2011

для подобных вещей я стремлюсь получить количество подобъектов с начальным запросом, обычно включающим 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);
...