2013-01-23 2 views
0

제 생각에 mysql에는 집합, 목록, 딕테이션 또는 배열이 없습니다. 나는 두 개의 핵심 구성 요소 인 게임 매치에 대한 정보를 가지고, 그 다음 매치에서 플레이 된 캐릭터의 목록을 가진 시스템을 만들고 싶다. MySQL의에서 목록이 있다면 그때 나는 같은 것을 할 것입니다 :mysql에서 데이터를 올바르게 구성하십시오.

SELECT * FROM games WHERE characters IN LIST(list); 

그 수 내가 함께 선택할 수 있습니다

game_id INT, 
characters list<varchar>, 
....more data 

내가 할 수 있도록하려면 기본 쿼리는이 같은 것입니다 한 문자 만 또는 10 문자를 지정할 수 있습니다. 질문은 mysql에서 OR으로 1WHERE 절을 사용하는 것보다 효율적으로 수행하는 방법입니다. 캐릭터에 대한 구체적인 주문도 없습니다 ...하지만 ID를 기반으로 주문할 수 있다고 생각합니다.

기본 정보가있는 첫 번째 테이블과 단지 문자 ID 및 game_id가있는 두 번째 테이블을 만드는 것이 좋겠다고 생각한 유일한 방법입니다.

누구나 내가 알지 못할 수도있는 멋진 MySQL 트릭을 통해이 데이터를 체계적으로 구성하는 방법에 대한 제안을 갖고 계신가요? 쿼리는 결국 너무 빠를 필요가 있습니다. 내가보기/다운로드 카운터를 추가하지 않으면 쓰기보다 읽기가 더 길어질 것입니다. 읽는 것보다 더 많은 쓰기/업데이트가 될 것 같아요.

감사합니다. 더 이상 알려 주셔서 감사합니다. 같은 보이는 game_characters 테이블을 추가 내가 제대로 질문을 이해한다면 내가 생각할 수있는

+0

자신 만의 질문에 대한 답변에 가까워졌습니다. "기본 정보로 첫 번째 테이블을 만들고 두 번째 테이블에는 문자 ID와 game_id를 사용하여이 작업을 멋지게 생각했습니다." 이것은 SQLite 방식의 일처럼 들립니다. MySQL을 사용하기 때문에 솔루션은 이와 같이되어야합니다. List 아이디어는 그 자체로는 작동하지 않을 것입니다. 친밀한 말처럼 SQL이하는 일이 아니기 때문입니다. @neokio는 도움이 될만한 몇 가지 구체적인 아이디어를 제시해주었습니다. – DWright

+0

@DWright 다른 어떤 시스템을 제안 하시겠습니까? 이 질의를 생성 할 수있는 더 나은 시스템이있는 것처럼 들리 네요. NoSQL을 알고 있습니다 만, 제 지식이 나에게별로 도움이되지 않을 것입니다. 왜냐하면'WHERE' 조건이 일정하지 않고 필터 묶음 ... – MasterGberry

+0

NOSQL을 정말로 모르겠다 - 나의 요점은 SQL에서 이것을하기 위해서, 당신은 SQL에 맞는 방식으로 그것을하고 싶을 것이다 - 합치는 여러 테이블을 통해 합리적으로 잘 모델링된다. 유용한 방법 (IN() 사용을 넘어서).게임 ID와 문자 ID를 저장하고 관련시키는 두 개의 테이블은 SQL과 비슷하게 들리기 때문에 목록의 개념보다 더 유망합니다. 나는 내 직감을 잘 표현하지 못했습니다. . . 그러나 여러 테이블에 대해 이야기 할 때 이미 올바른 SQL intection을 가지고있는 것처럼 보입니다.이 테이블은 조인 될 수 있으며 SQL의 조인에 관한 것입니다! – DWright

답변

2

두 가지 방법 ....

방법 1 ...

CREATE TABLE `games_characters` (
    `game_id` int(11) DEFAULT NULL, 
    `character_id` int(11) DEFAULT NULL, 
    KEY `games` (`game_id`), 
    KEY `characters` (`character_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

. .. 다음 쿼리는

SELECT * 
FROM `games` as g 
LEFT JOIN `games_characters` as gc 
    ON (g.`id` = gc.`game_id`) 
WHERE gc.`character_id` IN (12,52,86,23) 

방법이 ... 같은 것 ... LIKE를 사용하면 대용량 데이터베이스에는 적합하지 않지만 추가 테이블을 피할 수 있습니다 ... characters 레코드에는 characters과 같은 다른 테이블의 ID가 포함되어 있으므로 ".23.51.252.75.93."과 같이 마침표로 구분됩니다. 쿼리는 다음과 같을 것입니다

SELECT * 
FROM `games` 
WHERE `characters` LIKE '%.23.%' 
    OR `characters` LIKE '%.58.%' 

CMS가 문자열을 구문 분석하고 다시 작성해야합니다.

+0

첫 번째 쿼리의 성능은 어떻습니까? 그것이 20-30ms 또는 적어도 저급하다고 말할 수 있을까요? 또한 games_characters (말 당 1 백만 개의 게임)에 1,000 만 개의 행이있을 때 MYSQL의 축척이 얼마나 좋을까요? – MasterGberry

+0

당신의 예제에서'game_id'와'chracter_id'와 일치하는 좋은'KEY' 시스템이 있습니까? – MasterGberry

+0

은 1 천만 행에 대해 메소드 1은 우수한 성능을 제공하고 예는 간단한 쿼리에 대해 15-30ms라고 추측합니다. 당신은 분명히 인덱스를 포함하고 싶을 것이다 ... 나는 지금 위의 테이블을 생성 할 것이다 – neokio

관련 문제