在社交网络环境中,全球检查友谊的最简单方法是什么?

5

供参考,这里有一个我最近在SO上提出的问题与这个问题相关:如何建模友谊关系

在那个问题中,我们找到了一种方法只显示朋友发布的新闻动态。然而,我需要的是如何以更加动态的方式检查是否为好友,以便在整个网站功能中使用。

例如,我刚刚安装了评论系统,允许用户在新闻文章上发表评论。然而,这并不限于朋友,而应该是(后来应由帖子作者选择是否)可选的。

仅由好友发布新闻略有不同,因为我是直接从数据库获取数据,并使用SELECT子查询仅获取当前用户的好友发布的帖子。但是,在评论示例中,我只想在该人是好友时显示评论帖子表单。我实际上没有从数据库中提取任何内容进行选择、排序和显示。

知道这样的问题会在整个站点中多次出现,那么检查是否为好友的最简单方法是什么?我能否以某种方式从数据库中提取所有好友的用户ID到一个会话数组中,然后在需要确定所询问的人是否为当前登录用户的好友时执行 if(in_array($friends))我一时想不出有什么问题,但我想先听听您的意见。

我上面链接的问题解释了我的友谊表是如何工作的,以防这能帮助您帮助我。


MY_DATA_ACCESS_LAYER.IS_FRIEND(my_id, other_id) -- 使用数据库。热爱数据库。以后再考虑“其他事情”。(一个微不足道的扩展是一次性处理多个ID;关键是:如果它被隐藏在DAL中,那么它就不重要了,而且当-但实际上如果性能是个问题时,有许多方法来解决它。) - user166390
@pst,您能否更详细地向我解释一下?MY_DATA_ACCESS_LAYER.IS_FRIEND(my_id, other_id)到底是什么,我该如何使用它?您能提供一个例子吗? - vertigoelectric
它是DAL(数据访问层)的一部分,将“使用数据库”。名称很糟糕,是为了突出而选择的。不同的框架将促进不同的DAL方法,但听起来这已经存在:也就是说,根本不用担心会话或in_array等问题。只有在有已证明的性能用例未能满足要求时才需要担心“限制琐碎的DB使用”。 - user166390
@pst,如果我理解正确的话,你是说可以随时访问数据库来检查友谊关系,因为这不会影响性能。是这样吗?嗯,性能并不是我担心的问题。我担心的是方便性。每次想要检查友谊关系时,我都需要在各个地方添加大量冗长的代码块,这对我来说并不高效。这就像在准备将食材加入锅中时,每次只去商店买一个食材,而不是一次性把所有食材都买齐一样。 - vertigoelectric
@carpii,听起来你可能有更好的想法,但我不知道你在说什么,所以对我没有帮助。实际上,到目前为止,在这个页面上说的任何话都没有什么帮助。在这一点上,我所知道的最好的方法是每次想要检查两个用户之间的友谊时运行一个DB查询。 - vertigoelectric
显示剩余6条评论
1个回答

0
实际上,将朋友数组存储在会话中是一个非常糟糕的主意。如果会话变量创建后添加了新朋友会发生什么?它不会在会话中得到更新。
既然你需要在同一页上多次检查朋友列表,为什么不直接查询并将其存储在本地数组中,在同一页上可以一直使用。
当页面执行完毕时,该数组将被丢弃。
因此,你基本上只会查询列表一次。
推荐的实现方法是遵循上述评论中“pst”的建议,每次需要查找关系时只需查询即可,因为这样实现简单。稍后,当查询速度开始成为问题时,你可以更改该方法的内部,以在第一次调用时将好友列表缓存在本地数组中,从而加快速度(将内存使用换为处理器使用)。

谢谢回复。目前,我有一个查询,检查“friendships”表中两个用户之间是否存在有效匹配。如果找到的行数不为零,则确定了一种友谊关系。要使用本地数组方法,我需要更改我的查询以从表中提取所有有效的友谊匹配,并对其进行测试。我现在意识到数组的想法效率较低。但是,这引出了一个问题。您是否会频繁查询数据库,或者这并不重要? - vertigoelectric
我的看法是数据库查询变得更便宜了,CPU 功率也变得更便宜了。基本上,计算机的能力每天都在变得更便宜。所以你应该关注的第一件事情是做正确的事情。首先用正确的逻辑让它工作起来。然后再看是否需要进行优化。如果它在没有任何优化的情况下运行得很快,那么你刚刚节省了很多时间。如果它运行缓慢,至少你的代码可以被任何人轻松理解,因为没有奇怪的逻辑来尝试加速代码。这将使代码更易于维护和优化。 - iWantSimpleLife
你很可能需要编写代码,然后将其与实际情况进行基准测试,然后您可以决定查询数量是否太多。但通常而言,我尝试在每个PHP页面停止50个查询。 - iWantSimpleLife
感谢您的建议。我已经决定只要能运行,就不过度纠结于完美效率和优化。我相信网站可以支持许多用户,如果我们有一天拥有了数百万的用户,也许会提供足够的收入来聘请人员来优化代码。 - vertigoelectric
嘿@vertigoelectric,如果您满意,请检查线程的答案。 - iWantSimpleLife
我认为将好友列表存储在像Memcache或Redis这样的内存中是一个不错的解决方案。 - JasonDavis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接