2013-08-26 4 views
1

나는 많은 사진이 담긴 매우 많은 트래픽 사이트를 가지고 있으며 각 사용자가 본 사진을 추적하려고합니다.내가 본 사용자와 사진을 계속 추적합니다.

내 첫 번째 본능은 user_id & photo_id의 두 열이있는 SQL 테이블입니다. 하지만, 그것은 내 트래픽 수준에 맞지 않을 것이고, 테이블은 관리하기가 매우 어려워 질 것입니다.
SQL 또는 NoSQL (mongodb, couch, redis, ...)의 anoher 솔루션에 대한 권장 사항

내 코드는 대부분 PHP입니다.

감사합니다.

편집 조회수는 수십억에 달합니다.

편집가 나는 그것이

+0

세션에 사진 ID를 추가하고 대량으로 DB를 업데이트 할 수 있으므로보고있는 모든 사진을 업데이트하는 대신 WHERE ID IN (5, 10, 15, 모든 ID)을 업데이트 할 수 있습니다. 이렇게하는 부정적인면은 사용자가 n-1 개의 이미지를 탐색 한 다음 로그 아웃하지 않으면 n-1 개의 이미지 로깅을 잃어버린 것입니다. – JimL

+0

감사합니다 짐 - 대량 삽입물을 말하는 건가요? (정확하게 업데이 트가 아닌?). 그것은 많은 도움이 될 것이지만 테이블은 여전히 ​​엄청나게 커질 것입니다. 일주일 정도 지나면 관리가 어려울 것입니다. – OneSolitaryNoob

+0

아, 오늘 너무 일찍 로그인 했어. 여러 개의 삽입 쿼리를 수행해야하지만 준비된 명령문을 사용하는 경우 실행시 준비되는 쿼리 2-15 (또는 사용자가 결정한 번호)의 이점을 누릴 수 있습니다. 테이블이 얼마나 커야합니까? SQL은 수백만 행을 처리 할 수 ​​있습니다. 또한 테이블/샤딩을 분할하는 방법을 살펴볼 수도 있습니다. – JimL

답변

1

가장 좋은 방법은 {와 컬렉션을 만드는 것입니다 해당 사용자가 전혀 확인되었습니다 단지 여부, 사용자가 특정 사진을 볼 때 총 시간을 알 필요가 없습니다 _id : 생성 자동적으로, 발견과 pictureID, viewerID}

(pictureID, viewerID)으로 제한 할 (1) 및 인덱스를 설정하는 것이 매우 중요 슈퍼 초고속 레벨 99을 확인하게됩니다 pictureID viewerID에 인덱스. find(). limit (1)은 findOne보다 빠르기 때문에 현재 벤치마킹에서 사용합니다.

사용자별로 볼 수있는 이미지 배열이없는 이유는 무엇입니까? 배열을 통한 검색은 컬렉션에서 전체 문서를 검색하는 것보다 느리기 때문입니다. 천만 이미지? 문제 없어. 이것은 mongodb가 빛나는 곳입니다. 귀하의 것과 같이 큰 규모의 데이터베이스를 위해 확장 할 수 있도록 설계되었습니다. 문서가 16MB 미만이고 3 가지 속성이있는 한, 걱정할 필요가 거의 없습니다.

이미지를 삭제하면 db.viewed.remove ({pictureID : pictureID}) 만 삭제되고 이미지와 관련된 모든 것이 제거됩니다.

사용자 삭제시 db.viewed.remove ({viewerID : viewerID})! 사용자가 이미지 또는 계정을 삭제할 때이 작업을 수행하지 마십시오. 유지 보수 시간에 말하거나 한 시간에 한 번 말하십시오. 제거 할 항목을 저장하는 pendingRemovingImages 및 pendingRemovingUsers가있는 콜렉션을 작성하십시오. 이미지 및/또는 사용자별로 대량 제거를 수행하려면에 $를 확인하십시오.

나는 당신의 질문을 가장 흥미롭고 내 방향으로 가야한다고 강하게 느낍니다.

+0

@OneSolitaryNoob 만족 스럽다면 질문에 동의하십시오. – Discipol

+0

Discipol,이 수도 있습니다, 나는 아직도 크기의 조금 조심 해요. 나는 하루에 수십억의 사람들을 찾고있다. (많은 사용자와 많은 사진들). 하루에 최대 1,000 일 * 1,000,000 회의 조회수를 보유 할 수 있습니까? – OneSolitaryNoob

+0

이론상 그렇습니다. 당신은 hdd 공간이 수백 개의 공연으로 진행되는 것을 볼 수 있습니다. 귀하의 웹 사이트는 Google이나 뭔가입니까? : P – Discipol

1

Redis를 사용해 볼 수 있습니다. Redis는 PHP를 매우 잘 지원합니다. Redis를 사용하면 특정 사진의보기 기록을 해시 맵에 저장할 수 있습니다.

$map = 'views|' . $photo_id; 
// this line is called whenever a user view a photo 
$redis->hset($map, $uid, time()); 
// this line is called to test whether a user viewed a photo 
$redis->hget($map, $uid); 

Redis가 빠릅니다. 그러나 Redis에 대해 알아야 할 사항 중 하나는 모든 데이터를 메모리에 저장한다는 것입니다. 따라서 결국 데이터가 실제 메모리를 초과하면 사용자가 직접 데이터를 분할해야합니다.

Redis와 비슷한 API를 사용하는 SSDB (https://github.com/ideawu/ssdb)도 PHP를 잘 지원하지만 (http://www.ideawu.com/ssdb/docs/php/) 대부분의 데이터를 디스크에 저장하므로 메모리는 캐싱에만 사용됩니다. 즉, SSDB의 용량은 TB까지 Redis의 100 배입니다.

+0

독자적으로 redis가 너무 빨리 채울 것입니다. ssdb에 대해 들어 보지 못했습니다. 흥미 롭습니다. 나는 그것을 들여다 볼 것이다. – OneSolitaryNoob