문제

나는 인트라넷 애플리케이션이 될 것을 작성하고 있는데 그 기능 중 하나는 SO, Amazon 및 기타 여러 사이트가 수행하는 것과 다르지 않은 콘텐츠 투표와 대략 유사합니다.

투표 가능한 각 콘텐츠에 고유 ID가 있고 각 사용자(인증된)가 고유 ID를 가지고 있다고 가정하면 가장 쉬운 방법은 "투표" 테이블을 갖는 것 같습니다...

ContentID int
UserID int
VoteValue int

하지만 이렇게 하면 투표당 하나의 행이 생성됩니다. 수백만 개의 콘텐츠와 수만 명의 사용자가 포함되어 있으므로 해당 테이블은 엄청나게 커질 것입니다.이것이 최선의 방법입니까?즉, int가 4바이트를 사용하면 각 행은 12바이트를 사용합니다.백만 개의 콘텐츠가 100표를 얻으면 저장 용량은 400MB 이상입니다. 그렇죠?것 같다...많이 좋아해요 :).VoteValue가 아주 작은 정수(아마도 괜찮을 것임)이고 1바이트에 불과하더라도 테이블에서는 여전히 수백 메가바이트에 해당합니다.내 말은, 쳇.

더 똑똑한 방법이 있나요?저장 및 성능 측면에서 "기본" 데이터와 분할하기 위해 이 "투표" 테이블을 별도의 데이터베이스(잠재적인 데이터 무결성 문제 무시)에 저장해야 합니까?

(요즘 세상에서 400MB는 그다지 큰 용량이 아니라는 사실을 알고 있습니다. 하지만 투표를 저장하는 데에는 너무 많은 것 같죠?)

도움이 되었습니까?

해결책

개인적으로 좋은 색인이있는 한 올바른 방법으로 진행하고 있습니다. 사용량에 따라, 성능을 위해 보조 수 정보를 저장하여 투표 테이블에 치지 않도록 시도 할 수 있지만, 전반적으로 투표 한 사람을 추적 해야하는 경우, 나열된 방식으로 수행해야합니다.

나는 다른 데이터베이스로 이동하지 않을 것입니다. SQL Server에 실제로 관심이 있다면 별도의 파일 그룹을 만들 수 있지만 필요하지 않을 것입니다.

다른 팁

음,하지만 더 큰 그림을 봐야합니다. 백만 개의 콘텐츠로 :

(콘텐츠 크기) >> (투표 크기) : ">>"는 "훨씬 더 큰"것을 의미합니다.

백만 개의 콘텐츠가 있다면 투표가 400MB 인 테라 바이트의 데이터 일 수 있습니다. 큰 거래 맞습니까?

또한 확장 성이 걱정된다면이 블로그를 확인하십시오.

http://highscalability.com/

사용자가 특정 항목에 투표했는지 여부를 추적 해야하는 경우, 투표 가치가 다르면 (예를 들어 별 1 개에서 별 5 개)가있는 경우, 이는 얻을 수있는만큼 컴팩트 한 것입니다.

현명한 액세스 속도의 경우 데이터를 색인해야한다는 것을 잊지 마십시오 (아마도 두 개의 인덱스, 아마도 하나는 userID를 사용하여 하나는 userID를 주요 열로).

다른 테이블과 별도로 테이블을 보관하지 않을 이유가 있는지 결정해야합니다. 이것이 의미하는 바는 사용하는 DBMS에 따라 다릅니다. Informix를 사용하면 테이블은 동일한 데이터베이스에 있지만 다른에 저장됩니다. dbspace, 그리고 다른 두 개의 다른 dbspaces에 인덱스가 저장 될 수 있습니다.

투표 남용을 더 쉽게 감지하기 위해 테이블에 있는 콘텐츠 작성자의 ID가 필요할 수도 있습니다.(예, 아마도 중복된 정보일 것입니다.대안은 누가 누구에게 투표하는지 확인하기 위해 정기적으로 요약 테이블을 작성하는 것입니다.)

그만한 가치가 있는 Perlmonks 투표 테이블은 다음과 같습니다.

 `vote_id` int(11) NOT NULL default '0',
 `voter_user` int(11) NOT NULL default '0',
 `voted_user` int(11) default NULL,
 `weight` int(11) NOT NULL default '0',
 `votetime` datetime NOT NULL default '0000-00-00 00:00:00',
 `ip` varchar(16) default NULL,
 PRIMARY KEY  (`vote_id`,`voter_user`),
 KEY `voter_user_idx` (`voter_user`,`votetime`),
 KEY `voted_user_idx` (`voted_user`,`votetime`)

(vote_id는 콘텐츠 ID, ip는 IP 주소입니다.)

먼저 이러한 투표가 어떻게 사용될지 파악하고 데이터 모델에 대한 특정 쿼리를 설계해야 한다고 말하고 싶습니다.이것이 반드시 SQL 모델일 필요는 없습니다.SQL 세계에서 온 경우 공식 MongoDB 튜토리얼을 통과하면 시작에 대한 마음을 정리하는 데 도움이 됩니다.

예를 들어, 단일 이슈 페이지에 대한 투표만 저장하고 표시해야 하는 경우 이슈의 단일 문자열 필드에 투표를 저장하는 것이 편리할 수 있습니다. id1:id2:id3:.모든 ID의 길이가 같다고 가정하면 몇 가지 흥미로운 속성이 있습니다.

  1. 문제에 대한 모든 투표 수를 계산합니다.

    len(issue.votes)/len(id)

  2. 내가 해당 문제에 투표했음을 확인하세요.

    myid in issue.votes

  3. 투표한 모든 문제를 찾으세요.

    select issue.id from issues where issue.votes contains(myid)

  4. 가장 많이 투표된 문제 찾기

    select issue.id from issues order by len(issue.votes) desc limit 10

이 아키텍처를 사용하면 이러한 특정 경우에 읽기 시 비용이 많이 드는 계산을 피할 수 있지만 issue.votes 투표 시 테이블에 행을 추가하는 것보다 비용이 더 많이 들 수 있습니다.이 경우 ID당 4바이트 + 구분 기호가 포함된 100표는 500바이트 문자열입니다.제안된 변형에서는 100표가 800바이트입니다.

부인 성명:나는 이와 같은 것을 구현한 적이 없으며 단지 아이디어일 뿐입니다.

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