代码之家  ›  专栏  ›  技术社区  ›  JasonDavis

按字母顺序显示用户朋友的最佳方法

  •  1
  • JasonDavis  · 技术社区  · 15 年前

    在我正在使用php/mysql的社交网络上,我有一个朋友页面,它将显示用户拥有的所有朋友,就像大多数网络一样。我在MySQL中有一个朋友表,它只有几个字段。自动识别,从用户识别号到朋友识别号,日期

    我想让“朋友”页面有几个不同的选项来排序结果,

    1. 通过自动识别,基本上是按照添加朋友的顺序。它只是一个自动递增的ID

    2. 新朋友按日期,将使用日期字段

    3. 按朋友的名字,会有一个按字母顺序排列的列表。

    按字母顺序排列是我需要一些建议的地方。我将有一个字母表A-Z的列表,当一个用户单击k时,它将显示所有以k开头的用户名,依此类推。诀窍是它需要很快,所以在用户的表上进行连接不是一个选项,尽管大多数人会认为它很快,但这不是我想要的这个动作的性能。我的一个想法是在我的友谊表中添加一个额外的字段,并在其中存储用户名的第一个字母。用户可以随时更改那里的名称,所以我必须确保在用户更改那里的名称时,在可能的数千条记录上更新这个名称。

    有更好的方法吗?

    3 回复  |  直到 9 年前
        1
  •  1
  •   Doug R    15 年前

    好吧,如果你不想加入,那么把用户的名字或姓名首字母存储在友谊表上是你唯一可行的选择。您提到了每次名称更改都必须更新数千条记录的问题,但这真的是一个问题吗?除非你在谈论一个主要的社交网站,比如Facebook,或者MySpace,一般的用户 真正地 有足够的朋友来解决这个问题?然后你必须乘以一个用户改变他们名字的概率,我想这对于每个用户来说不是经常发生的事情。

    如果这些更新事实上是非常重要的,那么您可以在非高峰时间对其进行后台或延迟。当然,您会牺牲到第二个精度,但实际上,大多数用户会注意到吗?大概不会。

    编辑: 注意,我上面的回答只适用于你 已经 拥有这些级别的用户。如果你仍然在开发你的站点,只需要担心它是否正常工作,当问题变成实际问题时还要担心扩展问题。

        2
  •  0
  •   Stephen    15 年前

    您还可以查看类似memcached的缓存解决方案。您可以有一个后台进程,它总是更新一个memcached哈希,然后当您需要这个数据时,它已经在内存中了。

        3
  •  0
  •   Parrots    15 年前

    我只需加入包含名称的表,然后按名称排序。假设表布局非常正常:

    表人: 身份证件, 第一名, 姓氏

    表友: 自动识别器, Fuffi UsSeriID, 我的朋友, 日期

    你可以这样做:

    Select person.id, person.firstname, person.lastname, friend.auto_id 
    from Friend
    left join on person where person.id = friend.to_friend_ID
    where friend.from_user_ID = 1
    order by person.lastname, person.firstname
    

    Select person.id, person.firstname, person.lastname, friend.auto_id 
    from Friend
    left join on person where person.id = friend.to_friend_ID
    where friend.from_user_ID = 1
    order by friend.date desc
    

    我真的建议在friend表中添加一个列来保留第一个字母,不需要重复这样的数据(并且必须担心保持同步),这就是join的用途。

    推荐文章