객체 관계 매핑 : 게터를 구현하는 가장 좋은 방법은 무엇입니까?

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 추상화 프레임 워크는 무엇을합니까?

도움이 되었습니까?

해결책

이에 대한 정답은 실제로 없습니다. 사용자 테이블에 관련된 자식 객체를로드하는지 여부에 관계없이 한 번에로드하는 사용자 수, 사용자 테이블에있는 텍스트/블로브 필드 수에 따라 다릅니다. Aaronjensen이 말했듯 이이 패턴이 호출됩니다 게으른 하중 - 반대 행동 (로딩 모든 것 필요한 경우를 대비하여 앞쪽) 열렬한 적재.

즉, 고려해야 할 세 번째 옵션이 있습니다. 속성에 액세스 할 때 전체 사용자 객체를 게으른로드합니다.

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

이 접근법의 장점은 모든 단일 사용자를 완전히로드하는 메모리 히트없이 ID를 기준으로 사용자 모음 (예 : 암호가 비어있는 모든 사용자 목록)을 만들 수 있다는 것입니다. 각 사용자가 나머지 사용자 필드를 채우도록 단일 데이터베이스가 호출합니다.

다른 팁

쿼리 수를 최소화하십시오. 최적의 쿼리는 0이지만 캐시되지 않기 때문에 쿼리 해야하는 경우 1입니다. 그 가치.

게으른 하중에 가치가 있다고 언급해야합니다 (1 단계에서 말하는 것). 만약에 데이터가 게으르게로드되어야 할 것 같지 않습니다. 그래도 가능하다면, 명시 적이며 필요한 것을 정확하게 또는 거의 정확하게 가져 오는 것이 가장 좋습니다. 쿼리에 소비하는 시간이 적을수록 연결이 열려 있고 시스템이 확장 가능할 수 있습니다.

나는 당신이 당기고있는 데이터의 양이 너무 커서 과도한 양의 메모리를 사용하기 시작할 때를 제외하고는 Aaronjensen에 동의합니다. 나는 행에 3 개의 텍스트 필드가있는 곳이 어디에 있고, 당신이 원하는 것은 ID 필드입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top