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

Php 按字母顺序显示用户朋友的最佳方式,php,mysql,alphabetical,social-network-friendship,Php,Mysql,Alphabetical,Social Network Friendship,在我用PHP/MySQL开发的社交网络上,我有一个好友页面,它将显示用户拥有的所有好友,就像大多数网络一样。我在MySQL中有一个friend表,它只有几个字段。自动识别码,从用户识别码到朋友识别码,日期 我想让朋友页面有一些不同的选项来排序结果 通过自动识别,基本上按照添加朋友的顺序。它只是一个自动递增的id 按日期列出的新朋友将使用日期字段 按朋友姓名,将有一个按字母顺序排列的列表 字母顺序是我需要一些建议的地方。我将有一个字母表a-Z的列表,当用户点击K时,它将显示所有以K开头的用户名,依

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

我想让朋友页面有一些不同的选项来排序结果

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

  • 按日期列出的新朋友将使用日期字段

  • 按朋友姓名,将有一个按字母顺序排列的列表

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


    有更好的方法吗?

    如果您不想加入,那么将用户名或首字母存储在friendships表中实际上是您唯一可行的选择。您提到了每次名称更改时必须更新数千条记录的问题,但这真的是一个问题吗?除非你说的是像Facebook或MySpace这样的大型社交网站,否则普通用户真的有足够的朋友来解决这个问题吗?然后你必须乘以一个用户改变名字的概率,我想这不是每个用户经常发生的事情

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


    编辑:注意,我上面的答案只适用于那些级别的用户。如果你基本上还在开发你的网站,只需担心它是否能正常工作,以及当它变成真正的问题时是否会出现缩放问题。

    如果你不想加入,那么将用户名或首字母缩写存储在friendships表中是你唯一可行的选择。您提到了每次名称更改时必须更新数千条记录的问题,但这真的是一个问题吗?除非你说的是像Facebook或MySpace这样的大型社交网站,否则普通用户真的有足够的朋友来解决这个问题吗?然后你必须乘以一个用户改变名字的概率,我想这不是每个用户经常发生的事情

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


    编辑:注意,我上面的答案只适用于那些级别的用户。如果你基本上还在开发你的网站,只需担心它是否能正常工作,以及当它们变成真正的问题时是否会出现缩放问题。

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

    服务员: 身份证件 名字, 姓氏

    桌友: 自动识别码, 从用户ID, 给你的朋友, 日期

    你可以这样做:

    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
    


    我真的建议在friend表中添加一列以保留第一个字母,无需重复那样的数据(并且需要担心保持同步),这就是联接的作用。

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

    服务员: 身份证件 名字, 姓氏

    桌友: 自动识别码, 从用户ID, 给你的朋友, 日期

    你可以这样做:

    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
    


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

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

    您还可以看看像memcached这样的缓存解决方案。您可以有一个始终更新memcached哈希的后台进程,当您需要此数据时,它已经在内存中

    对于一个用户来说,数千个朋友是现实的,我的旧网络上的一些用户有20000多个用户。我认为背景更新可能是一个用户获得数千个朋友的方式。这是现实的,我的旧网络上的一些用户有20000多个用户。我认为背景更新可能是解决问题的方法。你能解释一下不能加入吗?如果在主键上添加索引(无论如何都应该在主键上),则连接不会很慢。这就是数据库优化的目的。除非您计划只显示ID列表,否则无论如何,您都需要连接到另一个表进行显示。请确保您对数据使用了正确的联接类型。您能解释一下无法进行联接的原因吗?如果在主键上添加索引(无论如何都应该在主键上),则连接不会很慢。这就是数据库优化的目的。除非您计划只显示ID列表,否则无论如何,您都需要连接到另一个表进行显示。只需确保为数据使用了正确的联接类型。