2012-08-29 4 views
0

게임 월드에 대한 정보를 저장하는 데이터베이스가 있습니다. 특히, 모든 다른 맵을 저장하는 테이블과 각 맵에 건물을 저장하는 테이블이 있습니다. 지도는 0-n 개의 건물을 가질 수 있고 다음과 같이 I는 정보를 저장 : (MAP_NAME) MAP_ID (PK)일대 다 관계를 효율적으로 쿼리합니다.

매핑

건물 (BUILDING_ID (PK), building_name, MAP_ID (FK))

내 문제는 어떻게 효율적으로 데이터베이스의지도 및 모든 건물의 이름을 얻기 위해 쿼리하는 것입니다. 예를 들어, 나는 10 개의지도와 건물을 원합니다.

SELECT * FROM maps JOIN buildings USING (map_id) limit 10

위의 쿼리는 10 행 또는 100을 반환 할 수 있지만 인해 MAP_NAME 각 대답을 반복되기 결과 테이블에서 너무 많은 중복을 가지고 오히려 낭비 보인다.

또는 map_ids를 먼저 가져온 다음 각지도에 대해 개별 쿼리를 수행 할 수 있습니다. 예를 들면 :

SELECT map_id from maps limit 10

foreach는지도 + ID : 나는 11 개 별도의 SQL 쿼리를 수행하고 있습니다로 SELECT * FROM buildings WHERE map_id = x

그러나이 다시 낭비 보인다?

요약하면 첫 번째 방법은 메모리/대역폭 비효율적 인 것으로 보이고 두 번째 방법은 CPU 비효율적 인 것으로 보입니다. 나는 옳고 더 좋은 방법이 있습니까?

답변

1

I 메모리/대역폭이 첫 번째 쿼리의 비효율적 인 것에 대해 걱정하지 것이다 , 이것은 관계형 데이터베이스가 설계된 것입니다. 테이블이 올바르게 정규화되어 있으므로 조인을 사용하여 두 테이블에서 데이터를 가져와야합니다. 지도 이름과 ID가 각 행에서 반복된다는 사실은 수만개의지도가 시작될 때까지 사소한 것이고 그 다음에도 큰 문제는 아닙니다.

이제 사용자가이 정보를 볼 수 있도록 GUI에이 정보를 표시하려는 경우 두 가지 별도의 쿼리 (하나는지도 목록 가져 오기, 다른 하나는 별도의 쿼리)를 사용하여 목록을 가져오고 싶을 수 있습니다. 사용자가지도를 선택하면 건물에 표시됩니다. 정확히 무엇을하려고하는지 아이디어를 주면 더 나은 조언을 줄 수있을 것입니다.

2

난 당신이 찾고있는 생각 :

SELECT * 
FROM buildings 
WHERE map_id IN (SELECT map_id from maps limit 10) 

편집 : 대신을 시도해보십시오

SELECT b.*, (SELECT map_name FROM maps m WHERE m.map_id = p.map_id) 'Map Name' 
FROM buildings b 
WHERE map_id NOT IN (SELECT map_id from maps limit 10) 
+0

나를 때려 ... lol – Malachi

+0

OP가 답변을 얻었습니다. 그게 내가 걱정하고있는 모든 것입니다 ... LOL – Malachi

+0

나는 map_name이 필요합니다. 나는 네가 준 것을 사용하면 두 가지 질의를 할 수 있다고 생각한다. 감사합니다 – user1633310

관련 문제