Лучший способ показать друзей пользователя в алфавитном порядке
В социальной сети, над которой я работаю в PHP/MySQL, у меня есть страница друзей, на которой будут показаны все друзья пользователя, как и в большинстве сетей. У меня есть таблица друзей в MySQL, в ней всего несколько полей. auto_ID, from_user_ID, to_friend_ID, дата
Я бы хотел, чтобы на странице друзей было несколько вариантов сортировки результатов,
По auto_ID, который в основном в порядке, был добавлен друг. Это просто идентификатор приращения
новые друзья по дате, будет использовать поле даты
По фамилии друзей, будет список в алфавитном порядке.
В алфавитном порядке мне нужен совет. У меня будет список алфавита AZ, когда пользователь нажимает на K, он покажет все имя пользователя, начиная с K и так далее. Хитрость заключается в том, что он должен быть быстрым, поэтому выполнение JOIN на пользовательской таблице не вариант, хотя большинство будет утверждать, что это быстро, это не та производительность, которую я хочу для этого действия. У меня была идея добавить дополнительное поле в таблицу дружбы и сохранить в нем первую букву имени пользователя. Пользователь может изменить свое имя в любое время, поэтому мне нужно убедиться, что оно обновлено на возможных тысячах записей, каждый раз, когда пользователь меняет свое имя.
Есть лучший способ сделать это?
3 ответа
Что ж, если вы не хотите вступать в объединение, то сохранение имени пользователя или инициалов в таблице дружеских отношений - это действительно единственный вариант. Вы упомянули проблему обновления тысяч записей при каждом изменении имени, но действительно ли это проблема? Если вы не говорите о крупной социальной сети, такой как Facebook, или, может быть, MySpace, у обычного пользователя достаточно друзей, чтобы сделать это проблематичным? И затем вы должны умножить это на вероятность того, что пользователь изменит свое имя, что, я думаю, не так часто случается с каждым пользователем.
Если эти обновления на самом деле нетривиальны, вы всегда можете в фоновом режиме или отложить это в непиковое время. Конечно, вы жертвовали бы точностью до секунды, но действительно, большинство пользователей даже заметят? Возможно нет.
Изменить: Обратите внимание, мой ответ выше действительно применяется, только если у вас уже есть эти уровни пользователей. Если вы все еще в основном разрабатываете свой сайт, просто беспокойтесь о том, чтобы он заработал, и беспокоитесь о масштабировании проблем, когда они становятся реальными проблемами.
Вы также можете посмотреть на решение для кэширования, например memcached. У вас может быть фоновый процесс, который всегда обновляет хэш memcached, а затем, когда вам нужны эти данные, они уже находятся в памяти.
Я просто присоединяюсь к таблице, содержащей имя, и затем сортирую по имени. Предполагая довольно нормальное расположение таблиц:
Таблица Person: 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
Я бы действительно рекомендовал добавить столбец в таблицу друзей, чтобы сохранить первую букву, не нужно дублировать подобные данные (и беспокоиться о синхронизации), для этого нужны объединения.