2013-03-22 3 views
0
난 내 데이터베이스에서 무언가를 선택할 때 다음 중 하나가 될 수있는 최선의 하나, 실행하려면, 쿼리의 수를 줄이기위한

: 내가 처음 일을 실행할 경우둘 이상의 인스턴스간에 JOIN 결과를 공유하려면 어떻게해야합니까?

1- SELECT ... FROM cities JOIN states ON city.stateID = state.stateID WHERE city.cityID = ... 
2- SELECT ... FROM cities WHERE city.cityID = ... 
3- SELECT ... FROM states WHERE state.stateID = ... 

것은, 내가 필요하지 않습니다를 (아마도) 두 번째도 아니고 두 번째 쿼리도 실행해야합니다. 왜냐하면 이미 데이터가 있기 때문입니다.

하지만 둘 이상의 인스턴스 클래스간에 단일 조인 쿼리의 결과를 어떻게 공유 할 수 있습니까? 그리고 세 번째 쿼리를 먼저 사용해야한다고 가정 해 봅시다. 세 번째 데이터가 이미 있으므로 City 인스턴스를 코드에서 어떻게 제어할까요?

<?php 

class City 
{ 
     protected $state; 

     function getState() 
     { 
      if(!$this->state) 
       $this->state = State::getByID($this->stateID); 
      return $this->state; 
     } 

     // since i may already have (in the outer scope) the $state instance... 
     // to avoid an unnecessary query (State::getByID()) i allow to set the state: 
     function setState(State $state) 
     { 
      if($state->stateID == $this->stateID) 
       $this->state = $state; 
      else 
       throw new Exception("This City doesn't belong to the given State"); 
     } 
} 

이 정확합니까? 내가 옳은 일이야?

예를 들어, 나는 이런 "주소"의 생성자를 만들 수 있습니다 ... 실제로

<?php 

class Address 
{ 
    const PREFETCH_CITY = 1; 
    const PREFETCH_STATE = 2; 
    const PREFETCH_ALL = 3; 

    construct($cityID, $prefetch = 0) 
    { 
     if($prefetch & static::PREFETCH_CITY) 
       // i use the "JOIN cities" query (i also set $this->city) 
     elseif($prefetch & static::PREFETCH_STATE) 
       // i use the "JOIN states" query (i also set $this->state) 
     elseif($prefetch & static::PREFETCH_ALL) 
       // i use the "JOIN states JOIN cities" query 
       // (i preset also both $this->city and $this->state) 
     else 
       // i don't use any JOIN, i just get the city 
    } 
} 

지금은 별도의 클래스에 있어야하는 생성자를 생각하고 있지만, 무엇을

일반적으로 말하는 ... 나는이 논쟁에 대해 무엇을 읽을 수 있습니까? 주소 클래스를 호출 할 것이다 인스턴스와 도시 클래스는 지금까지 책, 튜토리얼 내 영어 끔찍한 분명 한 것으로

희망을 환영합니다 ... 아주 사전 :

+0

PHP를 모르면이 질문에 답하지 않겠지 만 결과에 스마트 캐싱이 필요한 것처럼 들립니다. 하지만 PHP 라이프 사이클이 어떻게 작동하는지 알지 못하기 때문에 PHP에서 구현할 수있는 방법이나 PHP 자체에서 구현할 수있는 방법을 알려줄 방법조차 모릅니다. – Pete

+0

실제로 PHP와 관련이 없으므로 다른 언어도 사용하므로이 문제에 대한 일반적인 접근 방식을 찾고 있습니다 – skyline26

+0

전체 아키텍처를 설명하고 싶을 수도 있습니다. 그렇지 않으면 일반적인 아이디어를 넘어 조언을하기가 어렵습니다. – Pete

답변

0

에 감사가 것입니까 이미 부름을받지 않았습니까? 그렇지 않다면 City 클래스를 Address 클래스로 확장 할 수 있습니다. Address 클래스에서 City 클래스의 변수에 액세스 할 수 있습니다. 그런 다음 City 클래스가 데이터베이스에서 정보를 가져 와서 다양한 변수에 할당하면 Address 클래스에서 액세스 할 수 있습니다.

class Address extends City { 
관련 문제