Лучший способ показать друзей пользователя в алфавитном порядке - PullRequest
1 голос
/ 13 января 2010

В социальной сети, над которой я работаю в PHP / MySQL, у меня есть страница друзей, на которой будут показаны все друзья пользователя, как в большинстве сетей. У меня есть таблица друзей в MySQL, в ней всего несколько полей. auto_ID, from_user_ID, to_friend_ID, дата

Я бы хотел, чтобы на странице друзей было несколько вариантов сортировки результатов,

  1. По auto_ID, который в основном в порядке добавления друга. Это просто идентификатор с автоматическим приращением

  2. новых друзей по дате, будет использовать поле даты

  3. По имени друзей, будет список в алфавитном порядке.

В алфавитном порядке мне нужен совет. У меня будет список алфавита A-Z, когда пользователь нажимает на K, он показывает все имя пользователя, начиная с K и так далее. Хитрость в том, что он должен быть быстрым, поэтому выполнение JOIN на пользовательской таблице не вариант, хотя большинство будет утверждать, что это быстро, это не та производительность, которую я хочу для этого действия. У меня была идея добавить дополнительное поле в таблицу дружбы и сохранить в нем первую букву имени пользователя. Пользователь может изменить свое имя в любое время, поэтому мне нужно убедиться, что оно обновлено на возможных тысячах записей, каждый раз, когда пользователь меняет свое имя.

Есть ли лучший способ сделать это?

Ответы [ 3 ]

1 голос
/ 13 января 2010

Что ж, если вы не хотите вступать в объединение, то сохранение имени пользователя или инициалов в таблице дружеских отношений - это действительно единственный вариант. Вы упомянули проблему обновления тысяч записей при каждом изменении имени, но действительно ли это проблема? Если вы не говорите о крупной социальной сети, такой как Facebook или MySpace, разве у обычного пользователя действительно достаточно друзей, чтобы сделать это проблематичным? И затем вы должны умножить это на вероятность того, что пользователь изменит свое имя, что, я думаю, не то, что происходит очень часто для каждого пользователя.

Если эти обновления на самом деле нетривиальны, вы всегда можете оставить фон или отложить это в непиковое время. Конечно, вы жертвовали бы точностью до секунды, но действительно, большинство пользователей даже заметят? Вероятно, нет.

Редактировать: Обратите внимание, мой ответ выше действительно применим, только если у вас уже есть эти уровни пользователей. Если вы все еще в основном разрабатываете свой сайт, просто беспокойтесь о том, чтобы он заработал, и беспокоитесь о масштабировании проблем, когда они становятся реальными проблемами.

0 голосов
/ 13 января 2010

Вы также можете посмотреть на решение для кэширования, например memcached. У вас может быть фоновый процесс, который всегда обновляет хэш memcached, а затем, когда вам нужны эти данные, они уже находятся в памяти.

0 голосов
/ 13 января 2010

Я бы просто присоединился к таблице, содержащей имя, а затем отсортировал по имени. Предполагая довольно нормальное расположение таблиц:

Таблица Person: Я БЫ, Имя, LastName

Стол друга: 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

Я бы действительно рекомендовал добавить столбец в таблицу друзей, чтобы сохранить первую букву, не нужно дублировать подобные данные (и беспокоиться о синхронизации), для этого нужны объединения.

...