1

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

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

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

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

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

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

有一个更好的方法吗?

4

3 回答 3

1

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

如果这些更新实际上并非微不足道,那么您总是可以在非高峰时间背景或延迟发生。当然,您会牺牲最新的准确性,但实际上,大多数用户会注意到吗?可能不是。

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

于 2010-01-13T15:21:51.817 回答
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

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

于 2010-01-13T15:22:05.343 回答
0

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

于 2010-01-13T15:24:09.740 回答