3

最近 Web アプリを作成する際に、作成中のクエリから返される情報について考え始めました。

ユーザー情報と、(簡単にするために) このユーザーに関連付けられている電話番号を見つけます。次のような簡単なもの:

SELECT a.fname, a.lname, b.phone 
FROM users a 
JOIN users_phones b 
    ON (a.userid = b.userid) 
WHERE a.userid = 12345;

ここでは問題ありません (はい、この質問のポイントではなく、注射などを防止しています)。ただし、返されるデータについて考えると、(潜在的に) 数行の情報が返され、それぞれにそのユーザー名が含まれています。1 人のユーザーに 1000 の電話番号が関連付けられているとします。これは、通話ごとに頻繁に返される名と姓です。また、そのユーザーの姓名だけでなく、さらに多くの情報を返したいと仮定してみましょう。実際には、実際には 1 回だけ必要だった余分な行をかなり多く返し始めています。

データベースに対して複数の呼び出しを行うことが「より適切」な状況はありますか?

例えば

SELECT firstname, lastname 
FROM users 
WHERE userid = 12345;

SELECT phone 
FROM users_phones 
WHERE userid = 12345;

答えが「はい」の場合、複数のクエリと単一のクエリをいつ使用するかを判断する適切な方法はありますか?

4

3 に答える 3

3

それは本当にあなたのユースケースに依存すると思います。あなたが与えた例では、それを2つのクエリとして返すことは理にかなっているようです。特に、その情報をモバイルデバイスに戻して、送信するデータをできるだけ少なくしたい場合はそうです(誰もが無制限のデータを持っているわけではありません)データ.....)

テーブルに基づいて違いが生じる場合は、おそらくこれらのクエリにも DISTINCT を貼り付けます。

于 2013-09-13T15:23:57.547 に答える
2

を含むクエリは、JOIN2 つの独立したクエリよりも遅くなる場合があります。それは実際に行っているアクセスの種類によって異なります。

あなたの例では、2つのクエリアプローチを使用します。これらのクエリは並行して実行でき、キャッシュすることができ、JOIN恣意的なプレゼンテーションの問題以外に本当の理由はありません。

また、重複データを返すことについても考慮する必要があります。あなたの例では、電話番号ごとに繰り返されるように見え、実際には役に立たない大量のデータが送信されfnameます。lnameこれは、説明した一対多の関係によるものです。

一般にJOIN、送信するデータが少なくなることを意味する場合、または 2 つのクエリが独立していない場合は、必要になります。

于 2013-09-13T15:25:16.070 に答える