sql >> データベース >  >> RDS >> Mysql

クラス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. インデックスが強制された場合にのみ使用され、デフォルトでは使用されないのはなぜですか?

    2. SQLServerデータをテーブルからCSVファイルにエクスポートする方法

    3. PostgreSQLでのtimezone()関数のしくみ

    4. Pythonmysql.connector.errors。 %sは引用符でSQLクエリに渡されます