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 回答