Mysql
 sql >> база данни >  >> RDS >> Mysql

Какъв е най-добрият начин за намаляване на броя на заявките, когато Class DAO има методи, които използват същия резултат?

Този отговор зависи от текущата структура на заявката, където няма условни изрази

class CategoriaDAO extends PDOConnectionFactory
{
    /*DB Connection, static member since you only need one connection*/
    private static $dbConnection;

    /*Sql result set, static since there is not conditonal and only a single table used*/
    private static $resultSet;

    private static function getConnection()
    {
            /*Connect to mysql db, set CategoriaDAO::dbConnection; */
    }

    private static function populateResultSet()
    {
            /*Run query and populate resultSet - either as sql result or parse to array - your call*/
    }
    /**
     *
     * @var PDO $conn 
     */
    private $conn;

    public function __construct()
    {
                /*Get sql connection if one hasn't already been established*/
                if(!CategoriaDAO::dbConnection)
                        $this->conn = PDOConnectionFactory::getConnection();
    }
}

Мисловният процес зад това е, че тъй като резултатите винаги ще бъдат едни и същи (игнориране, актуализиране, вмъкване, изтриване засега), няма изискване да се съхранява копие на резултатите във всеки обект.

Както посочихте, актуализациите на таблицата ще извадят съхранения набор от резултати от синхронизиране с обекта; тук бих искал да се върна малко назад и да кажа, че ако наборът от резултати за даден обект трябва да бъде актуален само към момента на създаване, тогава използвайте нормални членове на обекта.

Също така си струва да се обмисли както независимо, така и във връзка с предишния коментар, е дали заявката ще се промени или не и ако ще, изисква генериране на членове на обект. Ако заявката не се промени, тогава няма за какво да се притеснявате - освен предишната точка. Ако се промени, вашите опции са повече или по-малко обхванати в следващите примери.

class Foo{
    private $someMember;

    /*
        $params = Associative array of fields and values
    */
    private static buildAndRunQuery($params)
    {
        /*Build sql query based on the given params Array()*/
    }
    public __construct($someMemebrValue)
    {
        $this->someMember = $someMemberValue;
        Foo::buildAndRunQuery(Array("fieldName" => $this->someMember));
    }
}

В този пример вие все още използвате статичен метод за генериране на заявката, но предавате нестатични членове за процеса/ В този момент (вижте коментар за обектите, които са актуални към момента на създаване) можете или да съхраните резултати в статичния член или ги предайте обратно на функцията __construct() и съхранете в екземпляра на обекта.

След това има потенциал, че заявката, която използвате, е малко по-ангажираща от простото изискване на определени полета, така че създаването на многоизмерен масив за предаване на статичната функция би било повече караница, отколкото си струва. В който случай можете да разделите buildAndRunQuery() на buildQuery() - метод на екземпляр и runQuery() статичен метод като.

class Foo{

    private $someMember;

    /*
        $params = Associative array of fields and values
    */
    private static runQuery($query)
    {
        /*Build sql query based on the given params Array()*/
    }

    private function buildQuery()
    {
        /*Construct your query here and either return calling method or store in instance member*/
         /*Either*/
            return <Constructed query>;
        /*Or*/
           $this->query = <Constructed query>;
    }

    public __construct($someMemebrValue)
    {
        $this->someMember = $someMemberValue;
        /*As per buildQuery() comment either:*/
            Foo::runQuery($this->buildQuery());
        /*Or*/
            Foo::runQuery($this->query);
    }
}

В този случай има няколко опции за обработка на генерираната заявка преди извикване на Foo::runQuery().

Разбира се, винаги има възможност да не искате да създавате и изпълнявате заявката по синхронен начин или дори в конструктора.

В заключение аз лично смятам, че за методи, които взаимодействат с услуги, независими от самия обект, като Sql или може би фокусиран DOMDocument, или подобни обектни взаимодействия, е най-добре да използвате статични методи, когато и двете са уместни и в крайна сметка не ви отрязват носа въпреки лицето си (ненужно комплексиран и т.н.). Разбира се, всичко това трябва да се разглежда за всеки клас.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. създайте заявка за цикъл на дървовиден изглед

  2. Neo4j - Създайте индекс с помощта на Cypher

  3. MySQL:Как да групирате SELECT редове с множество двойки в клауза WHERE

  4. PHP форма session_start():Не може да се изпрати ограничител на кеша на сесията

  5. Изберете N произволни записа на група