로그인한 사용자는 언제든지 특정 기간의 신규 계약 건수를 확인할 수 있습니다
데이터베이스는 mysql인데, 상위 계약 수는 모든 하위 계약 수의 합이므로 해당 사용자의 모든 하위 사용자 ID를 재귀적으로 얻어
다음에서 count(*)를 사용합니다. 테이블 where (created_at 기간 조건) 및created_by in(현재 로그인된 사용자 ID를 포함한 모든 하위 사용자 ID)
문제: 데이터는 정확하지만 비효율적이며 서버 성능에 영향을 미칩니다
별도의 테이블을 사용하여 매일 각 사용자의 신규 계약 수를 기록하거나 먼저 모든 하위 사용자의 ID를 가져온 다음
select sum (inum) from user_count where (created_at time period 조건)을 사용합니다.
andcreated_byin(현재 로그인된 사용자 ID를 포함한 모든 하위 사용자 ID)
문제: 이 필드는 추가, 삭제, 일괄 삭제를 할 때마다 수정해야 합니다. 사용자 수가 늘어나면 통계가 편리하지만 데이터가 부정확할 가능성이 매우 높습니다.
우리 웹사이트에서는 오늘의 새로운 추가 사항, 어제의 추가 사항, 이번 주 추가 사항, 이번 달의 추가 사항, 이번 분기의 추가 사항, 올해의 추가 사항을 계산합니다. 사용자는 원하는 기간을 입력하여 쿼리할 수도 있습니다.
제안 사항이 있습니까? ? 데이터를 정확하고 통계적으로 효율적으로 만들 수 있는 솔루션은 무엇입니까?
새롭게 추가된 계약의 사본을 Redis에 넣고 하루에 한 번씩 삭제하는 것을 고려해 보세요.
옵션 1이 선호되는 옵션입니다. 유일한 문제는 모든 부하 직원을 재귀적으로 확보하는 것이 느리다는 것입니다. 그럼 이 문제를 해결해 볼까요!
인사 테이블의 대략적인 구조는 전형적인 트리 형태의 데이터 저장소로 다음과 같다고 가정합니다.
아이디, 이름, 부모ID
값이 개인에 대한 액세스 경로인 경로 필드를 추가합니다. 예를 들어
-12-45-765-
에서 765는 현재 사용자 ID이고, 45는 765의 상위, 12는 45의 상위입니다.이 필드를 사용하면 리더의 ID를 기준으로 리더의 부하 직원과 자신을 모두 쉽게 필터링할 수 있습니다.
select id from employee where path like '%-45-%'
향후 직원 소속을 업데이트할 때 이 필드를 업데이트하는 것을 잊지 마세요.
데이터의 양이 많으면 확인할 때마다 쿼리하고 계산해야 하는데 이는 어떤 솔루션을 사용해도 매우 스트레스가 많습니다.
이런 경우 스트리밍 계산 통계를 직접 수행하는 것이 좋습니다. 데이터를 한 번 계산하고, 사용할 때 직접 쿼리해 보세요.
정상적인 프로세스의 성능에 영향을 주지 않기 위해 스트리밍 컴퓨팅 통계는 비동기식으로 운영될 수 있습니다
저희 시스템도 비슷한 통계를 일간 통계로 보면 지난 90일, 최근 3년간의 통계를 볼 수 있습니다. 이전에는 연도별로만 볼 수 있었는데, 원하는 것과 비슷한 것 같습니다.
스트림 계산 통계를 위한 작은 코드를 작성했는데, 일주일도 채 걸리지 않았습니다.
github.com/panjjo/flysnow 물론 코드 작성이 상당히 형편없습니다.
이것은 데이터베이스 분야의 일반적인 OLAP 요구 사항이며 구체화된 뷰를 고려할 수 있습니다.
참고로.
MongoDB를 사랑해주세요! 재미있게 보내세요!
타이머를 작성하면 문제가 해결됩니다. 그게 전부입니다! ! !