2011-03-28 2 views
5

제품 세트가 있고 각 제품에 일련의 리뷰가 있다고 가정 해보십시오. 각 리뷰에는 점수가 있습니다. 나는 점수의 평균을 훨씬 더 자주 필요로 할 것이고, 나는 실제 리뷰를 필요로 할 것이다. 평균을 사전 계산하고 최대 절전 모드로 저장하는 모범 사례/깨끗한 방법이 있습니까?최대 절전 모드로 사전 계산 된 평균 계산 및 저장

현재 리뷰 수 및 리뷰 합계 열을 제품 테이블에 추가하고 리뷰 추가 방법을 사용하여 개수 및 합계를 업데이트하려고합니다.

이 작업을보다 명확하게 수행하게되어 매우 기쁩니다.

답변

2

부모 테이블에 총계 열을 보관하지 않는 것이 좋습니다. 두 경쟁 요청이 합계 열을 업데이트하려고 시도하면 하나가 실패하거나 부적절한 읽기 (시스템에 트래픽이 많지 않은 경우 제외)로 합계가 넘어 질 위험이 있습니다. 필요한

쿼리는 매우 간단하고 괜찮은 DB는 잠시 (게으른 사이비의 SQL/HQL) 좋은 성능을 제공한다 :

1) 제품에 대한 특정 평균 리뷰 점수 :

select sum(score)/count from reviews where product_id = ? 
제품의

2) 목록과 평균 리뷰 점수 첫 번째 쿼리에 대한

select product_name, sum(r.score)/count(r.score) 
from products p 
join reviews r 
group by product_name 

, 당신은 리뷰를 테이블에 PRODUCT_ID에 인덱스의 어떤 종류가 있는지 확인하십시오.

hibernate를 사용하면 HQL 또는 Criteria objects을 통해 투영 쿼리를 사용할 수 있습니다. 속도가 충분히 빠르지 않으면 second level caching and query caching을 조사 할 것입니다.

show_sql 및 TestTestTest를 켜면 최대 절전 모드가 데이터베이스에 한 번만 도달하고 새 항목이 추가/업데이트 될 때 캐시가 무효화됩니다.

+0

리뷰를 추가하거나 업데이트 한 후 CacheMode.REFRESH를 사용하여 제품을 가져 오는 호출과 함께 번들 된 트리거 또는 트리거와 함께 갈 것입니다. – user472749

+0

실제로 2 단계 캐시에서 제거하는 것이 더 좋습니다. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/performance.html#performance-sessioncache – user472749

0

나는 더 나은 방법이있을 것이라고 생각합니다. 백그라운드 프로세스는 지금 당장 실행하고 검토 테이블을 기반으로 한 제품 테이블의 총 개수와 총 개수에 대해이 업데이트를 수행합니다.

또 다른 아이디어는 리뷰/등급 테이블에 업데이트가있을 때마다 (타임 스탬프를 사용하여)이를 반영하고 제품 테이블을 업데이트 할 때마다 트리거를 사용하는 것입니다.

+0

내 아이디어는 응용 프로그램이 의미하는 바를 수행하도록합니다. 이는 집계 또는 분석과 유사하므로 예를 들어 별도로 처리 할 수 ​​있습니다. 며칠 전 "지난 달의 등급 상승"이 필요할 수 있으므로 정기적 인 업데이트 코드에서 벗어나 이러한 종류의 기능을 유지하는 것을 선호 할 수 있습니다. – Ankur

+0

트리거를 사용하면 부실 데이터가 2 차 캐시에 남아 있지 않습니까? – user472749

+0

@ user472749 사용자가 묻는 것을 이해하지 못합니다. 트리거를 사용하는 경우 제품 테이블의 수를 count + 1로, rating을 thisRating으로 업데이트하여 다음에 제품 테이블에서 데이터를 가져오고 평균을 계산합니다 그것은 옳을 것이다. – Ankur