2012-04-30 2 views
0

나는 게임 (unique by int)이라는 테이블을 가지고 있습니다.MySQL - 인덱스 최적화 - 게임 관련 사용자

회원 (사용자 이름별로 고유)이라는 테이블이 있습니다.

각 게임에서 한 번에 최대 6 명까지 참여할 수 있습니다.

그러나, 회원은 게임에서 사임 수 있습니다 -하지만 난 아직도 그들이 그 게임에 참여했던 기록을 유지해야합니다.

나는 다음과 같은 별도의 검색을 수행해야합니다 회원에 대한

  1. 활성 게임.

  2. 회원을위한 사임 게임. 빈 슬롯 (회원에 의해 작성되지 즉 장소)에 대한 게임

  3. 검색합니다.

무엇이 가장 적합한 테이블 구조입니까? 모든 사임 한 게임 목록을 쉼표로 구분하여 멤버에게 텍스트 필드를 입력해야합니까? (이 문제는 궁극적으로이 게임에 대한 게임 정보가 필요하므로 나중에 각 게임 번호에 대한 게임 테이블을 별도로 검색해야 할 필요가 있습니다. 서버의 작업 속도가 느린 것 같습니다.)

게임에서 6 개의 텍스트 필드 (예 : SLOT1, SLOT2 등)를 현재 플레이어의 사용자 이름으로 사용해야합니까? 그러나 다시, 사임 한 멤버는?

지금 내 질문의 주요 부분은 (이는 위의 모든 혼란의 원인) :

내 테이블에 내 인덱스를 설정하는 것 어떻게

? 내가 검색을하고있는 중이 야 때

, 나는 플레이어의 사용자 이름과 일치하는 항목이 있는지 등등 SLOTS1보고 게임에보고됩니다. 이것은 6 번 ORed 검색입니다. 이러한 작업을 위해 데이터베이스에서 인덱스를 최적화하려면 어떻게해야합니까?

그러면 각 게임에 대해 사임 한 멤버를 어떻게 수행 하느냐에 따라 인덱스를 어떻게 작성합니까?

+0

멤버에게 정수 기본 키 (사용자 이름 대신 문자열 일 가능성이 높음)를 사용하는 경우를 생각해보십시오. –

+0

SLOTS1 등에서 int가 필요할 때만 도움이되는 것을 알 수 있습니다. 검색에서 아마도 더 빨라질 것입니다. 그러나 Indexes의 주된 문제는 그 일을 수행하는 것으로 해결되지 않을 것입니다. – Rewind

+0

물론 해결해야 할 문제는 아니지만 반드시 해결해야 할 중요한 문제입니다. 기본 키가 데이터 독립적 인 경우 중요합니다. 어떤 이유로 회원이 사용자 이름을 변경하면 큰 데이터베이스에서 과부하가되는 전체 색인을 다시 정렬해야합니다. 그래서 그것은 문자열 대 int 문제가 아닙니다. –

답변

1

상호 참조 테이블을 사용하십시오. 이 테이블은 game (테이블 games에 대한 외래 키), user (테이블 users에 대한 외래 키) 및 player_number (1과 6 사이의 null 가능 정수로서 플레이어가 차지하고 있음을 나타 내기 위해)의 세 열이있는 테이블입니다. null은 플레이어가 사임 함을 나타냄). (변화는 당신이 물건을 함께 맞게 원하는 정확히 어떻게 게임이 작동하는 방법에 따라이 가능하지만, 중요한 것은 당신이 gamesusers에 외부 키를 가지고있다.)

위의 제안에 기본 키 것 편의상 (game, user, player_number) 또는 (user, game, player_number)이되어야합니다.

그것은 (당신을 위해와 데이터베이스 모두)가 6 개 열을 가로 질러 논리합 연산 포함 쿼리를 수행하는 것보다이 같은 상호 참조 테이블을 검색 할 수있는 훨씬 더 쉽습니다.

아마 @Jermin Bazazian에 의해 제안대로 users 테이블 정수 기본 키로 전환하는 것이 좋습니다.

+0

전에 외래 키를 들어 본 적이 없습니다. 그냥 읽으십시오. 그들은 위대한 소리. – Rewind

+0

BTW - 외래 키가있는 경우이 키는 자동으로 빠른 조회의 인덱스 역할을합니까? – Rewind

+0

외래 키가 자동으로 인덱싱됩니다. – Hammerite