2011-08-25 2 views
4

간단한 예를 들어 보겠습니다. 제품이 있습니다. 제품은 1 개 또는 여러 개의 카테고리에있을 수 있으며 1 개 또는 여러 개의 채널에있을 수도 있습니다.객체 지향 코드를 사용하여 MySQL 쿼리 수를 줄이는 방법

그래서 제품, 카테고리 및 채널뿐만 아니라 해당 매퍼 및 팩토리 클래스에 대한 개체가 있습니다.

내 접근 방식 # 1은 100 % 디커플링되어야합니다. ProductFactory는 단지 Product 인스턴스를 생성합니다. 그리고 Product 클래스 안에는 Category & Channel Factory를 호출하고 필요에 따라 objet를 저장하는 게으른 instanciation 메소드가 있습니다.

제품 세부 정보 페이지에 적합하지만 제품 목록에 올 때 제품 당 2 개의 추가 쿼리를 수행해야하므로 쿼리 수가 매우 높아집니다. 카테고리 # 2의 제품은 각 제품에 대해 동일한 카테고리를 25 번 발생시키는 것은 완전히 미친 짓입니다.

내 접근 방식 # 2는 약간의 것들을 연결하는 것입니다. ProductFactory는 JOIN을 만들고 Category 및 Channel의 모든 정보를 가져 와서 인스턴스화합니다. IMO는 첫 번째 솔루션만큼 불쾌합니다. 왜냐하면 쿼리 수가 적기 때문에 백그라운드에서 더 큰 쿼리를 실행하기 때문에 아무 것도 변경되지 않습니다.

내 접근법 # 3은 분리 된 상태로 유지하는 것이지만 체인 가능한 자동화가 없습니다. 먼저 모든 제품을 반복하고 모든 범주 및 모든 채널의 배열을 만들고 중복 ID를 제어 한 다음 모든 요소를 ​​인스턴스화합니다. 멋지지만 코드는 더 이상 연결 가능하지 않습니다. (예 : 제품이 저장되는 카테고리 목록을 얻으려면 $ product-> getCategory()를 수행 할 수 없습니다.)

어떤 접근 방식을 제안합니까? 당신이 형식

CATEGORY_ID => CATEGORY_OBJECT 

의 배열을 유지하는 경우 범주를 할당 할 때 그런 다음 먼저 배열을 확인할 수 있습니다 무엇

+2

하나의 큰 쿼리는 여러 개의 작은 쿼리에 해당하지 않습니다. –

+0

네가 맞아,하지만 나는 25 시간 동안 똑같은 정보를 가져 오는 것에 대해 더 생각했다. – FMaz008

답변

1

. 예를 들어 : - 각 쿼리가 오버 헤드를 추가, 그래서 당신은 실제로 당신이 그들을 결합 할 수있는 경우에 더 낫다

$page_categories = array(); 

foreach($products as $product) { 
    if (isset($page_categories[$product->category_id])) { 
     $product->category = $page_categories[$product->category_id]; 
    } 
    else { 
     $product->category = $page_categories[$product->category_id] = new Category($product->category_id); 
    } 
}