문제

다가오는 사이트에 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 (및 다른 키 가치 데이터베이스)가 상황이 완전히 정규화되지 않을 때 최선을 다하는 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top