0

私はこれらの2つのテーブルを持っています:

ギャラリー -{id,title,description}
画像 -{id,gallery_id,file}

各ギャラリーには、画像テーブルに複数の画像があります。

これにどのようにアプローチするのが最善ですか:

A.すべてのギャラリーを選択して for ループを実行し、関連する各画像のデータベースを再クエリします。


$sql='select * from galeries';
$result=mysql_query($sql);
while($row=mysql_fetch_assoc($result))
{
    $sql2='select * from images where gallery_id='.$row['id'];
    //etc
}

B.左結合を使用してすべてのギャラリーと画像を選択し、ギャラリーに画像がある回数だけギャラリー情報を複数回取得します。

$sql='select * from galleries left join images on galleries.id=images.gallery_id';`

それとももっと良い方法がありますか?ありがとうございました。

4

4 に答える 4

1

(A)は簡単な方法ですが、データベースへの複数のクエリが必要です。データベースサーバーがビジー状態の場合、これが原因でさらにビジー状態になります。

(B)は、エンジニアが抜け出し、使用するデータベース呼び出しが少なく、一般的に最も効率的なデータベース呼び出しです。ただし、大学で学んだグループブレークロジックを使用する必要があります。

私がコーディングするとき、私は(B)の方法で進みます。私の周りの人々がコーディングするとき、彼らはほとんど(99%+)(A)の方法でコーディングします!私がこれらの人々に私の使用理由を伝えると(B)、彼らは彼らのクライアントが必要に応じてより良いハードウェアを購入するお金を持っていると言います!

乾杯!

于 2012-05-16T17:27:57.913 に答える
1

Aではクエリごとにデータベースへの接続を取得する必要があるため、Bが最良の選択だと思います。次に、ほぼ同じクエリ(where句で異なるIDのみ)をデータベースに何度も送信し、結果が再び発生するため、不要なプロセスとデータ転送のオーバーヘッドが発生します。
多くのプログラマーは、クエリが重くなりすぎると考えて、結合ステートメントを使用しません。ただし、結合テーブルに大量の行がない限り、B などの単純な結合で問題が発生することはないと思います。未使用の行または列を選択しないように、結合の使用に注意してください。
その結果、B が最善の解決策であると断言できます。

于 2012-05-16T17:57:50.057 に答える
1

私は A が好きではありません。実行するクエリごとにオーバーヘッドがあるため、B は好きではありません。

両方のテーブルからデータを保存していた場合。1 つのクエリでギャラリーを取得し、それらを配列に格納します。次に、ループ内の最小数のギャラリーに必要な画像を取得し、それらをキャッシュして再度取得しないようにしますが、それはいくつかの考慮事項に依存します

大量でない場合は、肩をすくめて A または B のどちらかを使用すると、コードが読みやすくなります。どちらもそれぞれの点で非効率的ですが、設計が複雑になります。それは価値があるでしょうか?

于 2012-05-16T21:38:54.243 に答える