0

ゲームの世界に関する情報を格納するデータベースがあります。具体的には、さまざまなマップをすべて格納するテーブルと、各マップの建物を格納するテーブルがあります。マップには 0 ~ n の建物を含めることができ、次のように情報を保存します。

マップ(map_id (PK), map_name)

建物(建物 ID (PK)、建物名、地図 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:SELECT * FROM buildings WHERE map_id = x

ただし、11 の個別の SQL クエリを実行しているため、これも無駄に思えますか?

要約すると、最初の方法はメモリ/帯域幅の効率が悪く、2 番目の方法は CPU の効率が悪いようです。私は正しいですか、より良い方法はありますか?

4

2 に答える 2

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)
于 2012-08-29T13:26:10.237 に答える
1

最初のクエリでメモリ/帯域幅が非効率的であることを心配する必要はありません。これがリレーショナル データベースの設計目的です。テーブルは適切に正規化されているため、結合を使用して両方のテーブルからデータを取得する必要があります。マップの名前と ID が各行で繰り返されるという事実は、何万ものマップを作成し始めるまでは些細なことであり、その場合でも、おそらく大したことではありません。

この情報を GUI で表示してユーザーが表示できるようにする場合は、2 つの別個のクエリを使用することをお勧めします。マップを選択しました。何をしようとしているのかを具体的に教えていただければ、より良いアドバイスができるかもしれません。

于 2012-08-29T13:32:34.410 に答える