Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apa cara terbaik untuk mengurangi jumlah kueri ketika Kelas DAO memiliki metode yang menggunakan hasil yang sama?

Respons ini bergantung pada struktur kueri saat ini, di mana tidak ada persyaratan

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();
    }
}

Proses pemikiran di balik ini adalah karena hasilnya akan selalu sama (abaikan, perbarui, sisipkan, hapus untuk saat ini) tidak ada persyaratan untuk menyimpan salinan hasil di setiap objek.

Seperti yang Anda tunjukkan, pembaruan tabel akan membuat hasil yang disimpan tidak sinkron dengan objek; di sinilah saya ingin sedikit mundur dan mengatakan bahwa jika hasil yang ditetapkan untuk objek tertentu hanya harus diperbarui pada saat pembuatan, maka gunakan anggota objek normal.

Juga patut dipertimbangkan baik secara independen maupun dalam hubungannya dengan komentar sebelumnya adalah apakah kueri akan berubah atau tidak dan jika itu akan memerlukan anggota objek yang akan dihasilkan. Jika kueri tidak berubah maka tidak ada yang perlu dikhawatirkan - kecuali poin sebelumnya. Jika itu mengubah opsi Anda kurang lebih tercakup dalam contoh berikut.

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));
    }
}

Dalam contoh ini Anda masih menggunakan metode statis untuk menghasilkan kueri tetapi Anda mengirimkan anggota non-statis untuk proses/ Pada titik ini (lihat komentar tentang objek yang diperbarui pada saat pembuatan), Anda dapat menyimpan hasil dalam anggota statis atau meneruskannya kembali ke fungsi __construct() dan menyimpan ke dalam instance objek.

Lalu ada potensi bahwa kueri yang Anda gunakan sedikit lebih terlibat daripada sekadar meminta bidang tertentu sehingga membuat array multidimensi untuk diteruskan ke fungsi statis akan lebih merepotkan daripada nilainya. Dalam hal ini Anda dapat membagi buildAndRunQuery() menjadi buildQuery() - metode instance dan metode statis runQuery() seperti.

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);
    }
}

Dalam hal ini ada beberapa opsi untuk menangani kueri yang dihasilkan sebelum memanggil Foo::runQuery().

Tentu saja selalu ada kemungkinan Anda tidak ingin membuat dan menjalankan kueri secara sinkron atau dalam konstruktor.

Sebagai kesimpulan, saya pribadi merasa bahwa untuk metode yang berinteraksi dengan layanan yang tidak bergantung pada objek itu sendiri seperti Sql atau mungkin DOMDocument terfokus, atau interaksi objek serupa, yang terbaik adalah menggunakan metode Statis di mana keduanya relevan dan tidak pada akhirnya memotong hidung Anda untuk meskipun wajah Anda (tidak perlu rumit dll). Tentu saja semua ini perlu dipertimbangkan per Kelas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Proyek Laravel ERR_EMPTY_RESPONSE

  2. cadangan mysqli db dengan php

  3. Pergeseran bitwise di mysql

  4. Bagaimana mencegah mysqldump membagi dump menjadi peningkatan 1MB?

  5. Apakah 1 selalu sama dengan '1' dalam SQL?