CouchDB에서 사용자 등급 / 즐겨 찾기 구현
문제
다가오는 사이트에 CouchDB를 사용하는 것을 고려하고 있지만 사이트의 사용자 등급 시스템을 구현하는 방법까지는 약간 혼란스러워합니다. 기본적으로 각 콘텐츠 항목은 주어진 사용자가 등급을 매길 수 있습니다. 이 작업을 수행하는 방법은 CouchDB 모델에서 가장 의미가 있습니까? 가장 건조하고 가장 논리적 인 방법은 3 가지 다른 문서 유형, 컨텐츠, 사용자 및 사용자 및 이와 같은 모습을 보이는 사용자를 갖는 것입니다.
{ user_id: "USERID" content_id: "CONTENTID" rating: 6 }
그런 다음 맵이 컨텐츠 문서 ID에 의해 키워진 모든 컨텐츠 문서 및 user_rating 문서의 세트 인 뷰를 만들고, 감소가 등급의 평균을 계산하고 컨텐츠 문서 Doc ID로 키워진 컨텐츠 문서를 반환했습니다.
이것이 가장 좋은 방법입니까? 나는 CouchDB 모범 사례에서 자원을 많이 찾지 못했기 때문에이 모든 것을 확신 할 수 없습니다.
내 결론 : 아래에 허용 된 답변은 제가 거의 구현하려고했던 대답이 작동하지만, 문서는 다른 문서 속성을 기반으로 고급 쿼리를 만드는 컨텐츠 DOC ID에 의해 키를 키워야합니다. 이 앱에서 내 요구에 대해 SQL로 돌아갑니다.
해결책
합리적인 아이디어가있는 것 같습니다. CouchDB는 너무 새롭기 때문에 모범 사례가 흔들리는 데 시간이 오래 걸릴 것이라고 생각합니다.
이와 같은지도/축소 쌍은 합리적인 출발점을 형성 할 수 있습니다.
지도:
function(doc) {
if(doc.type='rating' && doc.content_id) {
emit(doc.content_id, doc.rating);
}
}
줄이다:
function(keys, values) {
return sum(values)/values.length
}
NB : 그 map
함수는 적절한 유형을 추가해야합니다 Rating
모델:
{
type: 'rating',
user_id: "USERID",
content_id: "CONTENTID",
rating: 6
}
다른 팁
잘 Damien Katz, CouchDB 개발자 중 하나는 비슷한 과정, 그래서 당신은 couchdb 사람들이 의도하는 방식으로 그것을 할 수 있습니다.
나는 비슷한 상황에 대해 썼다 (예보다 간단하지만). 블로그에 기사 등급을 추가하고 CouchDB를 사용하여 등급 자체를 저장하기로 결정했습니다. 나는 당신이 올바른 아이디어를 가지고 있다고 생각합니다.
그래도 여기에 생각이 있습니다. 어딘가에 디스플레이 나 추적에 대한 등급을 누가 평가했는지 신경 쓰나요? 그렇다면 계속하십시오 :)
그렇지 않다면 컨텐츠 문서를 업데이트하지 않는 이유는 무엇입니까? rating
속성 += 1
(그리고 아마도 사용자 문서 rated
속성 .push( doc._id )
사용자가 콘텐츠를 두 번 이상 평가하는 것을 방지하려는 경우).
이것은 페이지에 '읽기'등급을 표시 할 때 문서 처리를 크게 단순화하고 더 나은 성능을 제공 할 것입니다 (이미 콘텐츠 문서를 가정 할 수 있기 때문에) ... 실제 등급의 비싼 프로세스를 더 비싼 비용으로 만드는 데 드는 비용입니다. (서버로 이동하는 더 큰 문서 등).
때때로 CouchDB (및 다른 키 가치 데이터베이스)가 상황이 완전히 정규화되지 않을 때 최선을 다하는 것 같습니다.