オブジェクトリレーショナルマッピング:ゲッターを実装する最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/169818

  •  05-07-2019
  •  | 
  •  

質問

$ user-> get_email_address()を呼び出すとどうなりますか?

オプション1:オンデマンドでデータベースからメールアドレスを取得する

public function get_email_address() {
    if (!$this->email_address) {
        $this->read_from_database('email_address');
    }
    return $this->email_address;
}

オプション2:オブジェクト作成時にデータベースから電子メールアドレス(およびその他のユーザー属性)を取得する

public function __construct(..., $id = 0) {
    if ($id) {
        $this->load_all_data_from_db($id);
    }
}

public function get_email_address() {
    return $this->email_address;
}

基本的な質問は、データベースクエリの数を最小限に抑えるのが最善か、データベースから転送されるデータの量を最小限に抑えるのが最善かということです。

別の可能性としては、オブジェクトの作成時に必要なデータが最も多く含まれている/含まれていない属性をロードし、それ以外のすべてをオンデマンドでロードすることが最適です。

追加の質問:ActiverecordのようなORM抽象化フレームワークは何をしますか?

役に立ちましたか?

解決

実際には、これに対する正しい答えはありません。一度に読み込むユーザーの数、Userテーブルにあるテキスト/ブロブフィールドの数、ユーザーテーブルが関連する子オブジェクトを読み込むかどうかによって異なります。 aaronjensenが言うように、このパターンは遅延読み込みと呼ばれ、反対の動作(必要に応じてすべてを事前に読み込む)は eager loading

とはいえ、検討したい3番目のオプションがあります。これは、プロパティにアクセスしたときにUserオブジェクト全体を遅延ロードすることです:

public function get_email_address() {
    if (!$this->email_address) {
        $this->load_all_data_from_db($this->id)
    }
    return $this->email_address;
}

このアプローチの利点は、IDのみに基づいてユーザーのコレクション(たとえば、パスワードが空白になっているすべてのユーザーのリスト)を作成できることです。残りのユーザーフィールドに入力するために、各ユーザーに対して1回のデータベース呼び出しのみが必要です。

他のヒント

クエリの数を最小限にします。クエリの最適な数は0ですが、キャッシュされていないためクエリする必要がある場合は1です。すべてのプロパティのクエリは、スケーリングすることのない、大規模な競合の問題があり、より多くの頭痛の種になるシステムへの確実な火道ですその価値。

遅延読み込みの価値があることを言及する必要があります(手順1で説明していることです) 遅延読み込みのデータが必要になる可能性は低いです。ただし、できる場合は、明示的に指定し、必要なものを正確またはほぼ正確に取得することをお勧めします。クエリに費やす時間が短いほど、接続が開かれている時間が短くなり、システムのスケーラビリティが向上します。

私はaaronjensenに同意します。ただし、プルするデータの量が多すぎて過剰な量のメモリを使い始める場合を除きます。行に3つのテキストフィールドがあり、すべてが非常に大きく、必要なのはIDフィールドだけだと考えています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top