1

タイトルが十分に説明的であることを願っています。名前の付け方がわかりませんでした。

次のコードがあるとしましょう:

Class Movie_model {

    public method getMoviesByDate($date) {
        // Connects to db
        // Gets movie IDs from a specific date
        // Loop through movie IDs
        // On each ID, call getMovieById() and store the result in an array
        // When all IDs has looped, return array with movies returned from getMovieById().
    }

    public function getMovieById($id) {
         // Get movie by specified ID
         // Also get movie genres from another method
         // Oh, and it gets movie from another method as well.
    }

}

映画を取得するときは常に同じ結果を得たいと思っています (常に getMovieById() からの結果が必要です)。

あなたが私の主張を理解してくれることを願っています。getMoviesByDate() のような他の多くの関数があり、たとえば getMoviesByGenre() もあり、getMovieById() と同じ映画情報も返すようにします。

この方法で「OK」でしょうか?これによりサーバーに負荷がかかり、ロード時間が長くなることはわかっていますが、私が知らない他のより良い方法はありますか?

編集: getMoviesByDate() のコードを少し明確にしました。また、getMovieByDate() は単なる例です。私が言ったように、私は getMoviesByGenre() のようなメソッドも呼び出します。

編集:現在、プロジェクトのフロントページで 48 のデータベース クエリを実行していますが、フロントページはまだ完成していないため、完了するとその数は少なくとも 3 倍になります。ほとんどすべてのクエリは約 0.0002 かかりますが、データベースが成長し続けるにつれて、その数は劇的に増加すると推測しています。何かを変える必要があります。

4

4 に答える 4

1

この特定のケースでは、このように作業するのは良いことではないと思います。関数getMoviesByDateは、単一のクエリから「n」個の映画(または映画ID)の量を返します。このクエリのIDごとに、指定されたIDで映画を取得するための個別のクエリがあります。

これは、最初の関数が200本の映画を返す場合、getMovieById()関数(およびその中のクエリ)を200回実行することを意味します。より良い方法(IMO)は、getMoviesByDate()関数で必要なすべての情報を取得し、それをコレクションとして返すことです。

于 2012-10-11T06:43:19.190 に答える
1

クラスgetMoviesByDate()getMoviesById()メソッドを使用することはあまり論理的ではないようです。Movie

別の方法は、すべての取得を行い、オブジェクトMovieManagerを返すある種のクラスを用意することです。Movie

class MovieManager {

    public function getMoviesByDate($date) {
        // get movies by date, build an array of Movie objects and return
    }

    public function getMoviesByGenre($genre) {
       // get movies by genre, build an array of Movie objects and return
    }

    public function getMovieById($id) {
       // get movie by id, return Movie object
    }

}

クラスMovieには、1 つの映画に固有のプロパティとメソッドが含まれます。

class Movie {

    public id;
    public name;
    public releaseDate;

}

日付、ジャンルなどで取得するための個別のメソッドを使用することは問題ありませんが、同じレコードを複数回呼び出していないことを確認する必要があります。その場合、必要なさまざまなテーブルを結合できる単一のクエリが必要になります。

編集 - 質問を明確にした後:

日付ごとに映画 ID を取得し、それを最後まで実行するという考えgetMovieById()は良くありません。ムービー データは、日付で取得するときに取得する必要があるため、データベースに再度アクセスする必要はありません。

于 2012-10-11T06:55:37.937 に答える
0

getMovieById関数を変更できます。日付をパラメータとして渡すことができます。関数は、映画をIDで返し、日付でフィルタリングする必要があります。

于 2012-10-11T06:49:31.160 に答える
-1

以前にRAMにロードしたレコードを追跡するには、モデルの基本クラスを使用して、ロード済みのレコードのIDとモデルオブジェクトをRAMにオブジェクト化するための参照を保存します。

class ModelBase {
    /* contains the id of the current record, null if new record */
    protected $id;

    // keep track of records already loaded
    static $loaded_records = Array();

    public function __construct(Array $attr_values) {
        // assign $attr_values to this classes attributes

        // save this instance in class variable to reuse this object
        if($attr_values['id'] != null) {
            self::$loaded_records[get_called_class()][$attr_values['id']] = $this;
        }
    }

    public static function getConcurrentInstance(Array $attr_values) {

        $called_class = get_called_class();
        if(isset(self::$loaded_records[$called_class][$attr_values['id']])) {

            // this record was already loaded into RAM
            $record = self::$loaded_records[$called_class][$attr_values['id']];

            // you may need to update certain fields of $record
            // from the data in $attr_values, because the data in the RAM may
            // be old data.

        } else {
            // create the model with the given values
            $record = new $called_class($attr_values);
        }
        return $record;
    }

    // provides basic methods to update records in ram to database etc.
    public function save() {
        // create query to save this record to database ...
    }
}

あなたの映画モデルはこのように見えるかもしれません。

Class MovieModel extends ModelBase {
    // additional attributes
    protected $title;
    protected $date;
    // more attributes ...


    public static function getMoviesByDate($date) {
       // fetches records from database
       // calls getConcurrentInstance() to return an instance of MovieModel() for every record
    }

    public static function getMovieById($id) {
       // fetches record from database
       // calls getConcurrentInstance() to return an instance of MovieModel()
    }
}

他にできることは、DBの負荷を減らすことです。

  • リクエストごとにデータベースに1回だけ接続します。複数のリクエスト間でデータベースへの接続を共有する可能性もあります。
  • 頻繁に検索されるデータベース内のフィールドにインデックスを付けます。
  • 必要なレコードのみをフェッチする
  • 同じレコードを2回ロードしないようにします(変更されていない場合)
于 2012-10-11T06:53:00.397 に答える