2009-02-01 5 views
4

앞으로 사이트에서 CouchDB를 사용할 것을 고려하고 있습니다 만, 사이트에 대한 사용자 등급 시스템을 구현하는 방법에 대해서는 약간 혼란 스럽습니다. 기본적으로 콘텐츠의 각 항목은 지정된 사용자가 평가할 수 있습니다. 이렇게하면 CouchDB 모델에서 어떤 의미가 있습니까? DRYest와 가장 논리적 인 방법은 Content, Users 및 이와 유사한 user_rating doc의 3 가지 문서 유형을 갖는 것이라고 생각합니다. 맵이이 등급의 평균을 집계 줄일 모든 내용 문서의 설정 및 콘텐츠 문서 ID에 의해 키가 user_rating 문서, 그리고이었고 키가 내용의 문서를 반환 곳CouchDB에서 사용자 등급/즐겨 찾기 구현하기

 
{ 
    user_id: "USERID" 
    content_id: "CONTENTID" 
    rating: 6 
} 

다음, 나는보기를 만들 것 내용 별 문서 ID.

이렇게하는 것이 가장 좋은 방법입니까? CouchDB 베스트 프랙티스에 관해서는 아직 많은 리소스를 찾지 못했기 때문에이 모든 것들을 잘 모릅니다.

내 결론 : 아래에 허용 된 대답은 구현할 것입니다. 그러나 조심해야합니다. 다른 문서 속성을 기반으로하는 고급 쿼리를 어렵게하는 콘텐츠 ID로 문서를 작성해야합니다. 나는이 응용 프로그램에서 내 필요에 대한 SQL로 돌아갈거야.

답변

8

합리적인 생각이 들리는 것 같습니다. 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를 :

{ 
    type: 'rating', 
    user_id: "USERID", 
    content_id: "CONTENTID", 
    rating: 6 
} 
+2

두 가지 : 본인 등급 유형은 필요하지 않습니다. (doc.user_id && doc.content_id && doc.rating) emit (doc.content_id, doc.rating) 보기에 액세스 할 때 group = true를 지정해야합니다. –

1

Couchdb 개발자 중 한 명인 Damien Katzsimilar process에 대한 설명을 제공하므로 Couchdb 사람들이 의도하는 방식대로 수행 할 수 있습니다.

+0

의견에 감사드립니다. 그러나이 작업에 대한 구체적인 예를 더 찾고있었습니다. 저는 그가 여기서 이야기 한 원칙을 이해하고, 위에서 제안한 구현을 도출하기 위해 그것들을 사용했습니다. 내 결론이 맞는지 확실하지 않습니다. –

0

내가 비슷한 상황에 대해 쓴 : map 기능이 Rating 모델에 적절한 유형을 추가 요구하는 (비록 귀하의 예보다 간단합니다). 내 블로그에 기사 등급을 추가하고 CouchDB를 사용하여 등급 자체를 저장하기로 결정했습니다. 나는 당신이 올바른 생각을 가지고 있다고 생각합니다.

그러나 생각은 있습니다. 어딘가에 표시하거나 추적하는 것처럼 누가 등급을 매기는지 신경 써야합니까? 그렇다면, 수행에 :)

왜 단지 += 1에 콘텐츠 문서의 rating 속성을 업데이트하지 않은 경우 (아마도 당신은 두 번 이상 평가 내용에서 사용자를 방지하려면 .push(doc._id)에 대한 사용자 문서의 rated 속성).

이렇게하면 페이지에 표시하기 위해 '읽기'등급을 지정할 때 문서 처리가 크게 단순 해지고 성능이 향상됩니다 (이미 콘텐츠 문서를 이미 가지고 있기 때문에) ... 실제 프로세스를 작성해야합니다. 더 비싼 평가 (서버에가는 더 큰 문서 등).

때로는 CouchDB (및 기타 키 - 값 데이터베이스)가 모든 것이 정상적으로 정규화되지 않은 경우에 최선이라고 생각됩니다.

+0

문서를 업데이트 할 때 두 명의 사용자가 같은 문서를 동시에 평가하는 경우 충돌이 발생합니다. – max

+0

회전 수 때문에 처리 할 수 ​​있습니다. 하지만 당신 말이 맞습니다. 교통량이 많은 물건에는 정확히 맞지 않습니다. 하지만 실제로 ... 얼마나 많은 사람들이 같은 시간에 평가합니까? – rfunduk

+0

reddit을 작성하는 경우. . . 많이! –