【问题标题】:Best way to show friends of a user in alphabetical order按字母顺序显示用户朋友的最佳方式
【发布时间】:2010-01-13 15:12:43
【问题描述】:

在我正在使用 PHP/MySQL 开发的社交网络上,我有一个朋友页面,它会显示用户拥有的所有朋友,就像大多数网络一样。我在 MySQL 中有一个朋友表,它只有几个字段。 auto_ID、from_user_ID、to_friend_ID、日期

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

  1. 通过 auto_ID 基本上按照添加朋友的顺序。它只是一个自动增量 id

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

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

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

有没有更好的方法来做到这一点?

【问题讨论】:

  • 你能解释一下无法加入吗?如果您在主键上添加索引(无论如何都应该存在),则连接不会很慢。这是数据库的优化目标。
  • 除非您打算只显示 ID 列表,否则无论如何您都需要连接到另一个表进行显示。只需确保为数据使用正确的联接类型即可。

标签: php mysql alphabetical social-network-friendship


【解决方案1】:

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

如果这些更新实际上并不重要,您可以随时在非高峰时间进行后台处理或延迟更新。当然,您会牺牲最新的准确性,但实际上,大多数用户会注意到吗?应该不会吧。

编辑:请注意,我上面的回答仅在您已经拥有这些级别的用户时才适用。如果您基本上仍在开发您的网站,只需担心使其正常运行,并在扩展问题成为真正的问题时担心。

【讨论】:

  • 一个用户有几千个朋友是现实的,我旧网络上的一些用户有 20,000+ 个用户。我认为后台更新可能是要走的路
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    桌人: ID, 名, 姓氏

    桌友: auto_ID, from_user_ID, to_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
    

    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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多