2010-04-13 4 views
0

DB의 특정 항목에 대한 "히트 수"를 추적해야합니다. "히트"는 사용자 ID로 고유해야하므로 사용자가 항목을 3 번 치면 여전히 1의 히트를 계산해야합니다.SQL 모델 최적화 질문

또한 총 숫자를 표시해야합니다 특정 항목에 대한 조회수

각 사용자별로 각 항목의 각 조회수를 별도의 테이블에 저장하는 것보다 나은 방법이 있습니까? 쉼표로 분리 된 문자열에 사용자 ID를 더 효율적이고 효과적으로 유지할 수 있습니까?

답변

1

아니요, 정보를 데이터베이스에 쉼표로 구분하면 은 거의으로 거의 변함이 없으며 거의 ​​항상 훨씬 더 많이 대체 방법입니다.

각 개별 히트 (추가 정보가 첨부되어 있습니까?) 또는 사용자 당 카운트 만 유지해야합니까? 첫 번째가 참이면 thing_id 및 user_id 열이있는 테이블을 사용하십시오 ("히트"에 적용되는 다른 속성의 열). 두 번째가 true의 경우, thing_id 266 및 히트 _ 카운트 럼이있는 테이블을 사용하고 같은 UPDATE 명령을 사용 : 당신이 항목의 설정 번호가있는 경우

UPDATE hit_count_table SET hit_count = hit_count + 1 
    WHERE user_id = :userid AND thing_id = :thingid; 
+0

실제로 "총 히트 수"를 추적 할 필요가 없으며 "사용자 별 고유 조회 수"만 추적하면됩니다. 각각의 히트는 "히트 삽입"과 "이미 존재한다면 우아하게 실패해야합니다"라고 추측합니다 :) Thanks – mrmuggles

+0

supermogx는 "사용자 당 히트 수"가 아니라고 생각합니다. 그것은 당신이 그 UPDATE 문장으로 녹음하고있는 것이다. – benzado

+0

@benzado : exactly;) – mrmuggles

0

, 그리고 숫자가 작은, 당신은 아마 얻을 수 각 항목에 대해 별도의 "히트"테이블을 유지하십시오.

많은 항목 (또는 무제한 항목)이있는 경우 모든 항목의 조회수를 추적 할 수있는 표가 하나만있을 것입니다. 많은 조회 레코드로 끝나면 디자인을 재고해야하므로 사용자를 빠르게 조회하고 조회 레코드를 삽입해야하는지 여부를 결정할 수 있습니다.

전반적으로 몇 가지 옵션이 있으며 모두 성능과 편리함이 절충됩니다. 나는 네가 좋아하는 것을 고르고 그걸로 가겠다. 당신은 선과 악을 발견 할 것이고 그것을 경험할 수 있습니다.

데이터베이스에 물건을 "CSV"문자열로 저장하면 안됩니다. 이는 쿼리하기에 완벽한 악몽입니다.

1

열이 thing_id 및 user_id 인 hits 테이블을 새로 만듭니다. thing_id 및 user_id에 UNIQUE 색인을 추가하십시오. 그런 다음이 쿼리와 테이블을 업데이트 할 수 있습니다

INSERT INTO hits (user_id, thing_id) VALUES (?, ?) 

때문에 인덱스, 테이블을 정의 할 때 당신은 당신이 ON CONFLICT IGNORE 또는 이에 상응를 지정해야 할 수있는 경우 (아무것도 행을 추가하거나 할 것 중 하나, 그 피할 수 오류). 이 쿼리를 통해 조회수를 얻을 수 있습니다.

SELECT COUNT(*) FROM hits WHERE thing_id = ?