在我正在使用PHP / MySQL工作的社交网络上,我有一个朋友页面,它会显示用户拥有的所有朋友,就像大多数网络一样。我在MySQL中有一个朋友表,它只有几个字段。 auto_ID,from_user_ID,to_friend_ID,日期
我想让朋友页面有几个不同的选项来排序结果,
通过auto_ID,它基本上是添加朋友的顺序。它只是一个自动增量ID
按日期新朋友,将使用日期字段
按朋友名称,将按字母顺序排列。
字母表是我需要一些建议的地方。我将有一个字母A-Z列表,当用户点击K时,它将显示以K开头的所有用户名,依此类推。诀窍是它需要快速,因此在用户的表上进行JOIN不是一个选项,即使大多数人认为它很快,但这不是我想要的这个动作的性能。我的一个想法是在我的友谊表中添加一个额外的字段,并将用户名的第一个字母存储在其中。用户可以随时更改名称,因此我必须确保在用户更改名称时随时更新可能的数千条记录。
有更好的方法吗?
答案 0 :(得分:1)
如果你不想进行连接,那么在友谊表上存储用户名或首字母是你唯一可行的选择。您提到每次更改名称时都必须更新数千条记录的问题,但这真的是一个问题吗?除非你在谈论像Facebook或者MySpace这样的主要社交网站,否则普通用户真的有足够的朋友来解决这个问题吗?然后你必须乘以用户改变名字的概率,我想这不是每个用户经常发生的事情。
如果这些更新实际上是非平凡的,那么您可以始终在非高峰时段进行背景或延迟。当然,你会牺牲最高精度,但实际上,大多数用户会注意到吗?可能不是。
修改:注意,上面的答案确实只适用于已经拥有这些级别的用户的情况。如果你仍然在基本上开发你的网站,只需担心它的工作,并担心当它们成为真正的问题时扩展问题。
答案 1 :(得分:0)
我只是加入包含名称的表,然后对名称进行排序。假设一个非常正常的表格布局:
表人: 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
我真的建议在好友表中添加一个列以保留第一个字母,不需要像这样重复数据(并且必须担心保持同步),这就是联接的目的。
答案 2 :(得分:0)
您还可以查看像memcached这样的缓存解决方案。您可以拥有一个始终更新memcached哈希的后台进程,然后当您需要此数据时,它已经在内存中。