2010-01-04 12 views
1

나는 Identity Map 패턴으로 Data Mapper 패턴을 구현했습니다. 간단히 말해서, 데이터베이스에서 2000 개의 객체를 원할 때, 매퍼는 이미 생성 된 객체에 대한 참조를 포함하는 해시 맵에 대해 결과 집합을 검사합니다. id가 이미 해시 맵에 있으면 이전 객체가 반환 배열에 대신 추가됩니다. 그렇지 않으면 새 오브젝트가 작성되어 리턴 배열에 추가됩니다. 반환 배열에는 2000 개의 객체가 포함됩니다.이 경우 어떤 방법을 사용해야합니까?

참고 :이 수치는 이론 값입니다. 플랫폼이 자주 출현 할 수 있으므로 분당 또는 초 단위로 여러 번 발생할 수 있습니다.

질문 : 어떤 옵션이 더 좋고 그 이유는 무엇입니까?

) 데이터베이스에서 모든 2000 개체를 검색하십시오. 레코드 집합 (2000 행)을 반복하고 모든 ID를 ID 맵과 비교하여 확인하십시오. 그곳에 있으면 ID 맵의 참조 된 객체를 객체 배열에 추가하십시오. 그렇지 않은 경우 새 객체를 만들어 결과 배열에 추가합니다.

B) 신원 맵에있는 모든 ID를 제외하는 (아마도 HUGE) sql 쿼리를 만듭니다. 새 객체에 대한 데이터 만 포함하는 레코드 세트를 가져옵니다. 모든 행에 대한 ID 맵을 확인하지 않고 새 오브젝트를 작성하십시오. 많은 문자열 연결 작업을 통합하여 쿼리를 작성하지만 전체 해시 맵 조회를 절약 할 수 있습니다.

어떤 방법을 택하겠습니까?

답변

0

내가

에게 나는 생각하지 않는다 B.에 가고 싶어 (내가 아는 네, 난 그냥 두 버전을 모두 구현하고 성능 시험을,하지만 어쩌면 누군가가 실제적인 경험이 대답 할 수 있어야) 이것은 복잡한 문자열 연결을 취할 것입니다. 당신의 ID를 일반 배열 키를하는 가정하면, 간단하게 할 수있는 :

$ids = implode(',', array_keys($hashmap)); 
$query = sprintf('SELECT * from records WHERE id NOT IN (%s)', $ids); 

당신은 비록 쿼리 문자열에 대한 몇 가지 소독을 추가 할 수 있습니다.

이미 해시 맵에 SplObjectStorage을 사용중인 경우지도를 반복하여 저장된 개체에서 ID를 가져와야합니다. 이미 들어있는 항목의 양과 가져올 금액에 따라 A 또는 B를 사용하는 것이 더 나을 수도 있습니다. 그러나 SplObjectStorage를 사용하면 이미 존재하는 객체를 첨부하는 것에 신경 쓰지 않아도됩니다.

$map = new SplObjectStorage; 
$one = new StdObject; 
$map->attach($one); 
$map->attach($one); 
$map->count(); // returns 1 

그렇습니다. 나는 벤치마킹 질문이고 특정 시나리오에 의존한다고 생각합니다.

관련 문제