Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách tốt nhất để giảm số lượng truy vấn khi Lớp DAO có các phương thức sử dụng cùng một kết quả là gì?

Phản hồi này phụ thuộc vào cấu trúc truy vấn hiện tại, không có điều kiện nào

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

Quá trình suy nghĩ đằng sau điều này là vì kết quả sẽ luôn giống nhau (bỏ qua, cập nhật, chèn, xóa ngay bây giờ) nên không có yêu cầu giữ một bản sao kết quả trong mỗi đối tượng.

Như bạn đã chỉ ra, cập nhật bảng sẽ khiến kết quả được lưu trữ không đồng bộ với đối tượng; đây là nơi tôi muốn theo dõi lại một chút và nói rằng nếu kết quả được đặt cho một đối tượng nhất định chỉ phải được cập nhật tại thời điểm tạo thì hãy sử dụng các thành viên đối tượng bình thường.

Cũng đáng xem xét cả một cách độc lập và kết hợp với nhận xét trước đó là truy vấn có thay đổi hay không và nếu có thì nó yêu cầu các thành viên đối tượng được tạo ra. Nếu truy vấn không thay đổi thì không có gì phải lo lắng - ngoại trừ điểm trước đó. Nếu nó thay đổi, các tùy chọn của bạn ít nhiều được đề cập trong các ví dụ sau.

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

Trong ví dụ này, bạn vẫn đang sử dụng phương thức tĩnh để tạo truy vấn nhưng bạn đang chuyển các thành viên không tĩnh cho quy trình / Tại thời điểm này (xem nhận xét về các đối tượng được cập nhật tại thời điểm tạo), bạn có thể lưu trữ kết quả bên trong thành viên tĩnh hoặc chuyển chúng trở lại hàm __construct () và lưu trữ cá thể đối tượng int he.

Sau đó, có khả năng là truy vấn mà bạn đang sử dụng có liên quan nhiều hơn một chút so với việc chỉ yêu cầu một số trường nhất định như việc tạo một mảng đa chiều để chuyển đến hàm tĩnh sẽ phức tạp hơn so với giá trị của nó. Trong trường hợp này, bạn có thể tách buildAndRunQuery () thành phương thức buildQuery () - instance và phương thức static runQuery () chẳng hạn như.

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

Trong trường hợp này, có một số tùy chọn để xử lý truy vấn đã tạo trước khi gọi Foo ::runQuery ().

Tất nhiên luôn có khả năng bạn không muốn tạo và chạy truy vấn theo cách đồng bộ hoặc thực sự trong hàm tạo.

Kết luận, cá nhân tôi cảm thấy rằng đối với các phương thức tương tác với các dịch vụ độc lập với bản thân đối tượng, chẳng hạn như Sql hoặc có lẽ là DOMDocument tập trung, hoặc tương tự, các tương tác đối tượng, tốt nhất là sử dụng các phương pháp Tĩnh mà chúng đều có liên quan và cuối cùng không cắt đứt mũi của bạn bất chấp khuôn mặt của bạn (không cần thiết phải phức tạp, v.v.). Tất nhiên, tất cả những điều này cần được xem xét trên cơ sở từng Lớp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP - MySQL nhận giá trị của tham số từ một thủ tục được lưu trữ

  2. Tuyên bố PDO dài hơn 400 lần so với MySQL CLI

  3. làm thế nào để tránh nhận được ID sai

  4. Lưu USER_ID của người dùng đã xóa bản ghi bằng trình kích hoạt trong MySQL

  5. Sự cố khi thiết lập mô-đun MySQLdb