2010-08-21 5 views
0

나는 데이터베이스에서 온라인 게임과 테이블 하나를 만들고 있습니다. 아마 가장 중요한 것. 그것은 매우 커지기 시작합니다. 나는 여러 사용자와 함께 갈 수있는 함수를 만드는 오전과 그것을 위해 지금까지 다음과 같이 테이블이 있습니다테이블이 너무 커서 MySQL 데이터베이스에 있음

CREATE TABLE `oc` (
    `id` int(11) NOT NULL auto_increment, 
    `leader` varchar(40) NOT NULL default '', 

    `car` int(11) NOT NULL default '0', 
    `car_type` char(2) NOT NULL default '', 

    `seats` varchar(3) NOT NULL default '0', 
    `share` enum('1','2') NOT NULL default '1', 
    `location` varchar(100) NOT NULL default '', 

    `user1` varchar(40) NOT NULL default '', 
    `user2` varchar(40) NOT NULL default '', 
    `user3` varchar(40) NOT NULL default '', 
    `user4` varchar(40) NOT NULL default '', 
    `user5` varchar(40) NOT NULL default '', 
    `user6` varchar(40) NOT NULL default '', 
    `user7` varchar(40) NOT NULL default '', 
    `user8` varchar(40) NOT NULL default '', 
    `user9` varchar(40) NOT NULL default '', 

    `leader_gun` char(2) NOT NULL default '', 
    `user1_gun` char(2) NOT NULL default '', 
    `user2_gun` char(2) NOT NULL default '', 
    `user3_gun` char(2) NOT NULL default '', 
    `user4_gun` char(2) NOT NULL default '', 
    `user5_gun` char(2) NOT NULL default '', 
    `user6_gun` char(2) NOT NULL default '', 
    `user7_gun` char(2) NOT NULL default '', 
    `user8_gun` char(2) NOT NULL default '', 
    `user9_gun` char(2) NOT NULL default '', 

    `user1_inv` varchar(40) NOT NULL default '', 
    `user2_inv` varchar(40) NOT NULL default '', 
    `user3_inv` varchar(40) NOT NULL default '', 
    `user4_inv` varchar(40) NOT NULL default '', 
    `user5_inv` varchar(40) NOT NULL default '', 
    `user6_inv` varchar(40) NOT NULL default '', 
    `user7_inv` varchar(40) NOT NULL default '', 
    `user8_inv` varchar(40) NOT NULL default '', 
    `user9_inv` varchar(40) NOT NULL default '',  

    `user1_ready` enum('0','1') NOT NULL default '1', 
    `user2_ready` enum('0','1') NOT NULL default '1', 
    `user3_ready` enum('0','1') NOT NULL default '1', 
    `user4_ready` enum('0','1') NOT NULL default '1', 
    `user5_ready` enum('0','1') NOT NULL default '1', 
    `user6_ready` enum('0','1') NOT NULL default '1', 
    `user7_ready` enum('0','1') NOT NULL default '1', 
    `user8_ready` enum('0','1') NOT NULL default '1', 
    `user9_ready` enum('0','1') NOT NULL default '1',  

    PRIMARY KEY (`id`) 
) TYPE=MyISAM ; 

지금 나는 내 한계가 무엇인지 궁금합니다. 함께 놀 수있는 사용자를 최대 30 명까지 확보하는 것은 멋지 겠지만 제 테이블에는 3 배 많은 필드가 필요합니다. 30 x user1_gun 30 x user1_inv 및 30 x user1_ready.

이 db는 모든 다른 사용자 이름 등을 나열하기 위해 페이지에 액세스 할 때 모든 사용자가 db의 모든 정보를 필요로하기 때문에 많이 사용됩니다. 모든 사용자는 표에서 3 개 이상의 값을 변경할 수도 있습니다.

테이블을 9 명으로 제한해야합니까, 아니면 100 명으로 테이블을 만들 수 있습니까? 나는 모른다. 나는 코딩 할 수는 있지만 지금까지는 대규모 MySQL 데이터베이스와 서버를 관리 해본 적이 없다.

편집 : 확인. 그냥 분명히. 내 사용자에 대한 모든 종류의 정보가있는 사용자 테이블, 사용자 테이블에 연결된 자동차 테이블, 내 사용자 테이블에 연결된 무기 테이블이 있습니다. 이것은 최대 9 명의 플레이어가 게임을 할 수있는 유일한 테이블이 아닙니다! oc 테이블에는 각 사용자가 선택한 사용자 이름과 총, 그리고 준비가되었음을 알리는 사용자 필드가 있어야합니다. 데이터베이스 정규화가 필요하지 않다고 생각합니다 ...

+4

시간이 지나면 바로 여기 있습니다. 정상적인 정규화를 찾고 있습니다. :) (지금 글을 쓸 수는 없지만 누군가는 가능할 것이라고 확신합니다.) –

+4

모든 사용자의 데이터를 동일한 테이블에 저장하는 대신. 새로운 테이블을 만들고 거기에 연결하면 게임에 적은 수의 사용자를 저장할 수 있습니다. wikipedia 또는 stackoverflow에서 데이터베이스 정규화에 대해 자세히 알아보십시오. http://en.wikipedia.org/wiki/Database_normalization – Wolph

+0

실시간이 게임은 얼마나 될까요? MySQL이 최선의 선택이 아닐 수도 있습니다. – NullUserException

답변

7

정말 normalize 데이터베이스가 필요합니다. ! 관계형 데이터베이스를 사용하고 있으므로 먼저 데이터 내에서 관계를 정의해야합니다.

게임과 플레이어 사이에 일대 다 관계가 있습니다 (한 게임에는 많은 플레이어가있을 수 있지만 한 번에 한 게임 만 플레이 할 수 있음). 따라서 각 게임 (id, leader, car, car_type, seats, share, location)과 관련된 정보가 포함 된 게임 테이블을 만들어야합니다. 그런 다음 사용자 고유의 모든 데이터 (ID, 이름, 총, 인벤토리, 준비 됨)를 포함하는 별도의 사용자 테이블을 만듭니다. 그런 다음 foreign keys을 사용하여 사용자 테이블을 게임 테이블에 연결할 수 있습니다. 따라서 이미 언급 한 사용자 정보 외에 사용자 테이블에는 게임 테이블의 게임 ID를 외래 키로 저장하는 game_id와 같은 필드가 포함되어야합니다.

당신은,

정규화는 중복 데이터를 줄일 수 등 총 테이블, 차 테이블을 포함하여 데이터베이스의 효율성을 개선하고, 데이터 이상을 줄여 더 정상화 할 아마 수 있습니다. 개념에 대한 좋은 소개는 다음과 같습니다. http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html 이것은 정규화 된 데이터베이스를 쿼리 할 때 수행해야하는 테이블 조인에 대한 것입니다.

편집 : 설명에 따라 데이터베이스 이외의 솔루션을 조사 할 수 있습니다. 관계형 데이터베이스에 이처럼 보이는 테이블이 없어야합니다. 당신이 제공 한 정보를 바탕으로,이 모든 일이 게임 내 정보를 추적하고있는 것처럼 보이며, 관계형 데이터베이스보다 더 나은 해결책이있을 수 있습니다.

이 정보를 관계형 데이터베이스에 보관하려면 실제로 표준화해야합니다. 따라서 이미 별도의 사용자 테이블이있는 경우 게임 내 사용자 정보를 고려하여 계정을 확장하거나 현재 게임과 관련된 정보가있는 active_users 테이블을 가질 필요가 있습니다.

1

기본적으로 키 값 점수 인 2 열 db를 선택하지 마십시오.온라인 게임이기 때문에 memcache를 사용하여 데이터에 빠르게 액세스 할 수 있습니다.

두 열은 키이고 값은 입니다. 값은 데이터의 json 표현이됩니다.

+0

내가 현재 데이터베이스의 값을 두 개의 열 db로 구분하는 방법을 이해하지 못했습니다. – ganjan

관련 문제