2011-07-31 4 views
0

나는 조회 테이블에 수백 개의 레코드가있는 상황이 있습니다. 종종 코드에서 테이블을 사용하여 들어오는 값을 조회해야합니다.해시 또는 모델로 수행할지 여부

이러한 각각의 조회는 db 트립을 초래합니다. 그러나 최적화 된, 그것은 I/O 측면에서 약간의 비용 것입니다. 나는 해시로 모든 것을 얻지 않아야한다고 생각하고 있습니다. 이로써 db 여행 횟수를 단 한 번으로 줄일 수 있습니다.

수백 개의 레코드가 있기 때문에 해시의 메모리 사용량이 킬러가되어서는 안된다고 생각합니다.

찾고 계신가요? 모범 사례 ? 경험?

답변

1

한 번에 하나씩 올려 보는 것은 불필요하게 낭비입니다. 당신이 다루고있는 작은 숫자의 낭비를 눈치 채지 못할 수도 있지만, 나쁜 습관은 나쁜 습관이며, 좋은 습관이 더 좋습니다.

단일 데이터베이스 조회로 필요한 모든 항목을로드해야합니다. 객체를 객체로 필요로한다면 Set 객체 (또는 ID를 객체에 매핑하는 해시)가 의미가 있습니다.

known_ids = Pancake.valid_ids_from(incoming_ids) 
good, bad = incoming_ids.partition { |x| known_ids.include?(x) } 

당신은 Hash 당신이 경우에 사용할 수 있습니다

def self.valid_ids_from(ids) 
    # Ask the database which things in the `ids` array it has 
    # and put those in `ids_that_are_there`. 
    Set.new(ids_that_are_there) 
end 

그런 다음이 같은 일을 할 수있는 : 만 존재하는 경우 알 필요가 있다면, 다음과 같은 모델 뭔가 방법을 추가 Set이 마음에 들지 않는다면 이런 점에서 약간의 차이가 있습니다.

일반적으로 특정 구현은 요구 사항에 따라 다릅니다. 그러나 특정 데이터 콜렉션을 수집하고 마사지하는 메소드를 모델에 추가하는 것을 두려워하지 마십시오.

+0

감사합니다. – Gyan