토너먼트 데이터베이스를 설계하는 가장 좋은 방법


13

다가오는 Euro 2012 축구 토너먼트의 모든 경기에 베팅을하기위한 웹 페이지를 만들고 있습니다. 녹아웃 단계에 어떤 방법을 사용할지 결정하는 데 도움이 필요합니다.

아래의 모형을 만들었습니다. 모든 "알려진"그룹 스테이지 경기 결과를 저장할 때 매우 만족합니다. 이 디자인은 사용자가 올바른 베팅을했는지 여부를 매우 쉽게 확인할 수 있도록합니다.

그러나 쿼터와 준결승을 저장하는 가장 좋은 방법은 무엇입니까? 이러한 경기는 그룹 단계의 결과에 달려 있습니다.

내가 생각한 한 가지 접근법은 모든 일치 항목을 matches테이블 에 추가하는 것이지만 녹아웃 단계에서 일치하도록 홈 / 어웨이 팀에 다른 변수 또는 식별자를 할당합니다. 그런 다음 식별자가 팀에 매핑 된 다른 테이블이 있습니다 ...이 방법은 효과가 있지만 제대로 느끼지 않습니다.

기본 데이터베이스 디자인


당신은 MySQL을 사용하기로 결정 했습니까 아니면 대안에 개방되어 있습니까?
잭 topanswers.xyz 시도라고

꽤 정산되었습니다 .. 내가 알고 있어야하는 MySQL의 장단점이 있습니까?
hampusohlsson

점검 제한 조건이 적용되지 않습니다. 일반적으로 DRI를 사용하여 제약 조건을 적용하기위한 옵션은 더 적지 만 중요한 것은 응용 프로그램에 따라 다릅니다. 행복 채팅 당신이 :) 더 많은 의견을 원하는 경우
잭 topanswers.xyz 시도라고

고맙지 만 제약에 익숙하지 않기 때문에 어쨌든 제약 조건을 사용하지 않았다고 생각합니다. 그것이 DB로 전송되기 전에 그것을 간단한 유지, 내 응용 프로그램의 모든 데이터의 유효성을 검사
hampusohlsson

좋다 (좋아요. 그것은 물론 DB에 간단하지만은 완전히 다른 대화 )
잭 topanswers.xyz 시도라고

답변:


3

먼저 모델 자체의 모든 사전 결정된 정보 를 수정하여 시작하려고합니다.

  • 날짜 / 장소
  • 구조 (예 : 그룹 / 녹아웃 단계)
  • 규칙 (예 : 점수, 동점 규칙)

이 정보 중 일부는 테이블의 데이터이고 일부는 뷰의 논리로 체계화됩니다.

아마도 이런 것 :

  • 팀 (team_id, group_code enum ( 'A', 'B', 'C', 'D'), 이름)
  • 시합 (match_id, kickoff_at)
  • group_match (match_id, team_id_home, team_id_away, group_code)
  • knockout_match (match_id, knockout_code enum ( 'Q1', 'Q2', 'Q3', 'Q4', 'S1', 'S2', 'F')
  • 결과 (match_id, score_home, score_away)

Q1에서 팀이하는 정보는 그룹 스테이지 결과에서 계산할 수 있기 때문에 직접 저장할 필요가 없습니다. 에만 토너먼트 진행되면서이에 삽입만큼 변화가 만들 result테이블.


3

팀 ID를 사용하는 것이 올바른 방법이라고 생각합니다. 모든 결승 라운드에 대한 또 다른 추상화 수준은 데이터로 matchs 테이블을 사전로드하는 것 외에는 많은 이점을 제공하지 않는 불필요한 복잡성을 추가합니다.

이를 지원하기 위해 데이터 구조는 매우 견고합니다. 초기 경기 결과가 나오면 쿼터와 준결승이 경기 테이블에 추가되어야합니다. 경기가 무작위로 할당되면 이것은 수동 작업이지만, 특정 순서라면 ...

   A
match 1 -----+
   B         A
          match 5 -----+
   C         C         |
match 2 -----+         |
   D                   A
                    match 7
   E                   F
match 3 -----+         |
   F         F         |
          match 6 -----+
   G         G
match 4 -----+
   H

... 이는 쿼리로 가능할 수 있습니다. 다시 말하지만 쿼리의 복잡성은 팀 수에 따라 노력할 가치가 없습니다.


1

"matches"테이블에 모든 일치 항목을 저장하는 것이 좋습니다. 그러나 나중에 추가 필드 "순위 지정"을 추가합니다. 나중에 메모리에서 테이블을 효율적으로 쿼리하기 위해 이진 트리를 작성해야하기 때문입니다. 고전적인 순위 알고리즘 문제이며 자세한 내용을 보려면 회색 코드 토너먼트를 위해 Google을 방문하거나 내 스택 오버 플로우 기록을 볼 수 있습니다. 기본적으로 토너먼트는 이진 트리입니다. 여기에 회색 코드에 대한 좋은 기사입니다 http://villemin.gerard.free.fr/Wwwgvmm/Numerati/CodeGray.htm . 불행히도 프랑스어입니다. 다음은 순위에서 이진 트리 생성하는 방법입니다 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/229068을 .

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