2v2 게임을위한 데이터베이스 구조


10

나는 정기적으로 12 명의 친구와 함께 2v2 게임을하고 순위 시스템을 만들려는 의도로 플레이어, 팀, 점수 및 게임을 추적하는 데이터베이스를 원합니다.

우리가 정기적으로 팀을 변경하기 때문에 나는 테이블을 마련했습니다 players, teams그리고 games게임은 두 팀 (team1와 사의 Team2 심박 측정기)가 어디서 팀은 두 선수 (재생기 및 player2)로 구성되어 있습니다.

예를 들어 두 명의 플레이어를 골라 ( AB 라고합시다 ) 플레이어 1이 A이고 플레이어 2가 B이거나 플레이어 1이 B이고 플레이어 2 인 팀이 있는지 확인해야합니다. A입니다

gameswins양쪽에 존재하는 players테이블과 teams선수의 승리 때와 팀을 얼마나 자주 (하지만 난 선수가 승리하는 모두 얼마나 많은 게임을보고 싶어 때문입니다, 또한 어떻게 호환 플레이어는 다른 팀에 - 테이블 다른 특정 플레이어).

  1. 순위 점수 판 (아마도 Elo 등급 시스템을 사용할 것입니다 )
  2. 평가, 승리, 게임, 최근 게임 통계 및 가장 호환되는 플레이어가있는 모든 플레이어에 대한 통계 페이지.

이 중 많은 부분이 데이터베이스 정규화의 일부 원칙을 위반한다고 의심되며 데이터베이스 디자인을 구현하는 방법에 대한 제안을 원합니다.

데이터베이스 디자인


나는 이것이 매우 좋은 질문이라고 생각합니다. 질문에 다이어그램으로 표시된 현재 DB 구조를보고 싶습니다. 모두가 라 라벨의 스키마 빌더를 아는 것은 아닙니다. 실제 사례를 이해하기 위해 사용 사례도 개선 할 수 있습니다.
candied_orange

매우 감사합니다 @CandiedOrange-DB 구조 다이어그램을 추가했으며 더 많은 사용 사례를 추가합니다 :)
Daniel

좋은 업데이트입니다. 각 플레이어가 한 번에 하나의 팀에만 있고 한 번에 하나의 게임에만 있다고 가정하면 정확합니까? 또한 해당 팀의 정보를 재설정하지 않고 플레이어가 기존 팀을 떠나고 돌아왔습니까?
candied_orange

@CandiedOrange 기본적으로 우리가 게임을하고 싶을 때 우리는 4 명 (총 12 명 중)을 찾아 무작위로 2 팀으로 구성합니다.
Daniel

그것이 예인지 아닌지 알 수 없습니다. 시간이 디자인에 미치는 영향을 이해하려고합니다.
candied_orange

답변:


2

현재 스키마에서 볼 수있는 두 가지 문제가 있습니다. 하나는 복합 키가 효과적으로 중복되는지 확인하기 위해 테이블에서 두 필드를 확인 해야하는 문제이며, 일부 집계 데이터는 개별 테이블에 롤업되어 별도입니다. 실체 (특히 승리하지만 잠재적으로 플레이어의 등급).

첫 번째 문제의 경우 복합 키의 필드 중 하나를 원하는 OR 방식으로 처리하는 DB 간 트릭은 없지만 DB가 지원하는 경우 getPlayerTeams(player_id)캡슐화 하는 함수 를 만들 수 있습니다 쿼리

(또한 정렬 된 플레이어 ID의 해시로 계산 된 team_thumbprint로보기를 만들 수 있으므로 같은 두 사람의 콤보는 항상 같은 지문을 갖지만 여기에는 약간 다를 수 있습니다).

정규화에 대해서는 team_result표를 사용하여 주어진 팀의 모든 결과를 추적 하여 발생하는 결과에서 엔티티를 분리하는 것을 고려하십시오 . 조금 더 극단적 인 정규화는 또한 player_rating_hist플레이어에 대한 모든 등급 변경을 포함 하는 테이블을 요구합니다. 현재 등급은 가장 최근 날짜를 기준으로 한 것입니다. 쉬운 조회를 위해 플레이어보기를 사용하여 최신 값을 포함 할 수도 있습니다.

제안 된 스키마 (죄송합니다)

player
    id
    name
    created_on
    updated_on

player_rating_hist
    player_id (FK)
    rating
    rating_date

team
    id
    player1_id (FK)
    player2_id (FK)
    created_on
    updated_on

game
    id
    team1_id (FK)
    team2_id (FK)

team_game
    team_id (FK)
    game_id (FK)
    result
    score
    rating_change

team_rating_hist
    team_id (FK)
    rating
    rating_date

쿼리 :

--Results for the game, should only ever be two rows for any given game
SELECT * FROM team_game WHERE game_id = 101

--All results for a team
SELECT * FROM team_game WHERE team_id = 123456 

이 구조를 사용하면 시간이 지남에 따라 시스템이 실행 된 결과로 발생하는 "콘텐츠"에서 "기본"엔티티 (플레이어 및 팀)를 분리 할 수 ​​있으며 기본 테이블 중 하나를 현재 등급으로 지속적으로 업데이트하지 않습니다. 이러한 값은 파생 된 값이며 가장 최근의 등급, 평균 등급, COUNT승 또는 손실 등 을 가져 와서 검색해야합니다 . 시스템이 충분히 커지면 이러한 집계 데이터를 별도의 "창고"로 추출하는 것을 고려할 수 있습니다 쉬운 분석을 위해 (동일한 DB에있는 별도의 테이블 집합 인 경우에도) 가능합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.