저는 mongoDB를 처음 접합니다. 공식 웹사이트에서 임베디드 비정규화된 데이터베이스에 대한 소개를 읽었지만 예제를 보면 여전히 혼란스럽습니다. (공식 웹사이트의 예제에는 컬렉션이 2~3개밖에 없는 것 같습니다. 실제 응용 프로그램보다 간단합니다.)
매년 하나의 시즌이 있으며 하나의 리그는 여러 팀에 해당하며 각 팀에는 여러 선수가 있습니다. 선수 속성에는 신장, 체중, 팀 저지 번호 및 필드 포지션이 포함됩니다(선수는 이적할 수 있지만 한 팀에 속함). 리그는 정규시즌과 플레이오프로 구분되며, 각 경기에는 홈/어웨이 팀이 있으며 각 선수의 득점/리바운드/어시스트/블록/도루와 각 경기의 타임스탬프를 기록해야 합니다. 여러 뉴스 기사에 해당
일반적인 적용 시나리오:
최근 10경기 홈/어웨이 팀의 득점, 승패
모든 팀의 포인트 순위
이번 시즌 모든 팀의 평균 득점/리바운드/어시스트/블록/스틸 상위 10위
이번 시즌 모든 선수의 평균 득점/리바운드/어시스트/블로킹/스틸 상위 10위
특정 경기에서 홈팀과 원정팀의 득점, 리바운드, 어시스트, 슈팅 비율 등
특정 경기에서 홈팀과 원정팀 선수들의 득점, 리바운드, 어시스트, 슈팅 비율 등
특정 시즌의 다양한 통계에서 모든 선수의 순위
각 시즌 특정 선수의 평균 데이터(이적한 선수가 다른 팀에 속할 수 있음)
완전한 데이터 모델 구조 설계를 제공해 주실 수 있나요? 감사합니다!
이해되지 않는 몇 가지 질문:
선수를 팀에 포함시켜야 하나요?
이적 문제를 해결하는 방법은 무엇인가요?
각 게임의 데이터를 각 게임에 포함해야 하나요? 그렇다면 플레이어를 각 점수/.. 이벤트와 어떻게 연관시킬 수 있나요?
표준화되지 않은 데이터는 어디에 있든, 어떻게 설계하든 팀이나 선수의 과거 데이터를 요약할 때, 순위를 매길 때 데이터베이스 전체를 스캔해야 한다는 느낌이 듭니다...
색인 생성이 성능을 크게 향상시킬 수 있는 부분은 무엇입니까?
이 애플리케이션 시나리오에서 nosql을 사용하는 것이 적절한가요?...........
액세스 패턴을 기반으로 설계하는 것이 가장 큰 원칙입니다. 다행히도 이미 일반적인 애플리케이션 시나리오가 있습니다.
팀과 플레이어 간의 일대다 관계는 내장될 수도 있고 분리될 수도 있습니다. 이는 주로 이 두 데이터가 함께 사용되는 빈도에 달려 있습니다. 함께 사용하는 예: SegmentFault의 질문과 답변도 일대다이지만 함께 표시되는 경우가 많습니다. 그렇지 않은 경우 분리하여 플레이어 이름, _id, 플레이 시간 및 기타 기본 정보를 팀에 추가할 수 있습니다. 이러한 종류의 비정규화를 수행하려면 업데이트해야 할 때 업데이트할 위치가 한 군데 더 필요합니다. 그러나 이 정보(예: 전송)의 업데이트 빈도가 매우 낮고 많이 읽혀지기 때문에 여전히 가치가 있습니다.
통계. 플레이어의 과거 데이터를 다시 계산하려면 어떤 데이터 인벤토리를 사용하든 전체 데이터베이스를 순회해야 하지요? 이는 읽고 쓰기 전의 또 다른 절충안입니다. 분명히 데이터 업데이트는 쿼리보다 훨씬 적으므로 통계 데이터를 캐싱하는 것이 의미가 있습니다. 또한 특정 시즌의 팀 통계와 같은 일부 통계는 일정합니다. 업데이트 시 실시간으로 업데이트되거나 총 횟수 및 횟수의 평균값 등 일부 중간 결과를 캐시하여 계산에 도움을 줄 수 있습니다. 또는 각 게임이 끝난 후 하루에 한 번씩 업데이트하는 것도 가능합니다.
각 게임의 데이터는 게임 및 플레이어와 관련이 있지만 특정 데이터로 쿼리되는 경우가 자주 있습니까? 그렇지 않고 통계용으로만 사용된다면 별도의 모음집에 넣어 두는 것도 좋습니다.
색인은 데이터를 더 빠르게 찾는 데 도움이 될 수 있지만 결과 데이터 세트를 줄이는 데는 도움이 되지 않습니다. 데이터 모델을 디자인한 후에는 인덱스를 선택하는 것이 당연합니다.