2013-07-27 5 views
0

나는 장소를 평가하는 시스템을 개발하고 있으며, 여기에 내 질문이 있습니다. 의 내가 이렇게 내 데이터베이스에 테이블이 있다고 가정 해 봅시다 :평균을 저장 대 모든 요청을 때마다 계산하십시오

사용자가 장소에 대한 연구를하게
places : id, name, description 
place_marks : id, user_id, place_id, value, comment 

, 나는 그에게 속도 내림차순으로 정렬 된 자리의 목록을 보내 싶습니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까?

해결 방법 1

  1. 마크
  2. 을 계산, 각 장소의 이름
  3. 에 해당하는 모든 장소를 얻기 새로운 정렬 된 목록

해결 방법 2

만들기
  1. 것은 내가 검색의 마크
  2. 을 계산, 표
  3. 장소에서 열을 사용자가 마크를 추가 때마다 마르크 추가, 난 그냥 데이터베이스
을 올바르게 조회 할 수 있습니다

솔루션 1에서 문제는 (쿼리에서 마크를 계산하더라도) 성능 문제 일 수 있으며 솔루션 2에서 마크를 계산할 때 충돌을 피할 수있는 방법은 무엇입니까?

저는 Play2를 MySQL과 함께 사용하고 있습니다. 도움 주셔서 감사합니다.

답변

2

해결책 2에서 어떤 두려움이 있습니까? 나는 당신이 마킹을 계산하고있는 동안 새로운 마크가 제공되고 두 번째 계산이 첫 번째 계산 전에 저장되는 곳에서 같은 계산을 다시 시작한다는 가능성을 언급했다고 가정합니다. 즉, 최신 평균치를 얻지 못하고있는 것입니다.

답변을 제공하기에 앞서 가장 쉬운 방법으로 코드를 작성해야한다고 생각합니다. 문제가 발생했을 때만 최적화를 고려할 것입니다. 어떤 최적화에서든 실제로 이익을 얻으려면 꽤 많은 수의 마크와 방문객 (웹 인터페이스라고 가정)이 필요합니다. 나중에 그것을 최적화하는 것이 좋습니다.

대답에 대해서는 3 가지 옵션을 고려할 것입니다. Play2를 모르므로 제 답변을 계속 유지합니다.

1) 상관 없음 : 변경 사항은 다소 제한적이며 트래픽이 많은 경우에만 문제가 발생합니다. 임시 값을 계산할 때 (새로운 표시가있을 때까지) 나는 가능성을 무시합니다. 다음에 누군가가 점수를 주면 통계가 정확해질 것입니다. 1a) 매일 밤 평균을 다시 계산하여 다음 날에 올바른지 확인할 수 있습니다.

2) 계산이 동기화되었는지 확인하십시오. 즉, 동시에 두 번의 계산이 시작되지 않도록하십시오. 거기에는 여러 가지 옵션이 있습니다. Play2에 관해서는 더 많은 정보를 제공 할 것입니다.

3) 이것은 가장 좋은 방법입니다. 트래픽이 많을 것으로 예상 할 때 고객에게 서비스를 제공 할 수있는 보안을 원하고 있습니다. 마지막으로 원하는 것은 예 : CPU 전력의 50 %를 계산에 소비합니다.하나의 옵션은 백그라운드에서 실행되는 별도의 프로세스를 마크 테이블에서 한 번씩 확인하는 것입니다. 새로운 마크를 발견하면 평균을 계산합니다. 프로세스가 하나뿐이므로 소요되는 CPU 시간과 데이터베이스의로드를 제한합니다. 고부하 중에는 계산시 약간의 문제가있을 수 있지만 부하가 낮 으면 속도가 빨라집니다.

트래픽이 많을 경우 옵션 3)으로 이동하십시오. 귀하의 질문에 따라 귀하의 제품에 대해 1) 옵션을 선택하라는 조언을하고, 2에 대해 자세히 알아 보려면 옵션 2를 조사하십시오. 세마포 (semaphores)를 학습하고 옵션 3)을 학습 과제로 고려하십시오.

행운을 빈다.

+0

이것은 내가 완전한 대답이라고 부른 것입니다. 감사합니다. :)! 당신 말이 맞아요. 저는 첫 번째 해결책을 선택하겠다고 생각합니다. 매일 밤 평균을 다시 계산한다는 생각은 아주 좋습니다. 앞으로 문제가 발생하면 솔루션 3을 조사 할 것입니다. – c4k

+0

기꺼이 도와 드리겠습니다. 옵션 3은 실패 할 수 있고 반복해야 할 작업을 실행하는 데 이상적이라고 덧붙여 야합니다. 나는 그것을 사용한다. 이메일을 보내기위한; SMTP 서버가 다운되면 코드에 신경 쓰지 않아도됩니다. 데이터를 가져 와서 정기적으로 다시 시도하는 다른 프로세스 (cron으로 시작됨)가 있습니다. 코드를 깨끗하게 유지하고 (주 코드는 데이터를 dd에만 넣음) 강력합니다 (Android/iPhone의 푸시 메시지에도 사용) –

관련 문제