3

重複の可能性:
クエリまたはコードをいつ使用するか

ユーザーとその詳細の大規模なデータベースがあります。お互いに最も似ているすべての人を見つけたいです。比較するにはどちらが好ましいですか?フィルタリングされた (一致した) レコードを取得するためにデータベース内で操作を行うように、SQL クエリを直接記述します。または、最初にphpの配列で生データを取得し、その配列に比較操作を適用しますか? 1000 人のユーザーがいて、共通の友達が最も多い人を見つけたいとしましょう。

UserA has {a,b,r,c,g,h,r,q,l}
UserB has {x,y,z}
UserC has {a,c,r,g,q}
.
.
.
UserN has{x,y....n}

そこで、UserA と共通の友達が最も多いユーザーを見つけたいと思います。UserA の各要素をデータベース全体のすべてのユーザー配列のすべての要素と比較するなど? 上記の場合、UserC は UserA に最も類似したユーザーである必要があります。これを達成する方法がわかりません。

4

1 に答える 1

5

次のようなテーブルで友情を表すとします。

Table: friendships
from_id  |  to_id
----------------------------
      a  |      a
      a  |      b
      a  |      r
      a  |      c
 ...etc...
      b  |      x
      b  |      y
      b  |      z
 ...etc...

これで、質問に答えるクエリを作成できます (MySQL でテスト済み)。

SELECT user_id AS user_id_with_most_common_friends, MAX(cnt) AS number_of_common_friends FROM 
  (SELECT f2.from_id AS user_id, COUNT(*) AS cnt
   FROM friendships f1
   JOIN friendships f2 ON (f1.to_id = f2.to_id AND f2.from_id <> 'a')
   WHERE f1.from_id = 'a'
   GROUP BY f2.from_id) totals;

パフォーマンスの問題に関しては、特定の状況での経験的テストが最も信頼できる答えを提供しますが、大規模なデータベースの場合、上記の SQL クエリを使用すると、すべての行をクエリして PHP で結果を計算するよりもはるかに高速になると予想されます。 :

  1. from_id と to_id がインデックス化されている場合、RDBMS はすべての行にアクセスする必要がない場合があります
  2. すべてのレコードを返すと、確実にすべての行にアクセスできるようになり、php コードが大量のメモリを消費することになります (これにより、メモリ割り当てのオーバーヘッドが追加され、RAM が不足すると致命的なクロールが遅くなります)。
  3. PHP コードがデータを取得すると、計算の個々のステップを SQL よりも速く実行できない可能性があります。

あなたのphpコードがこれらの欠点を補う何かを持っていない限り(SQLで表現できない複雑さの低いアルゴリズムや、画像処理などの特殊なCコードを呼び出すなど)、通常は維持する方が速くなります。できる限り RDBMS 内での作業。

于 2012-12-31T23:22:22.163 に答える