2010-01-13 2 views
1

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

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

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

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

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

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

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

+1

Можете ли вы объяснить неспособность сделать соединение? Если вы добавите индекс на первичные ключи (это должно быть все равно), соединение не будет медленным. Это то, для чего оптимизированы базы данных. – Parrots

+1

Если вы планируете показывать только список идентификаторов, в любом случае вам потребуется присоединиться к другой таблице для отображения. Просто убедитесь, что вы используете подходящий тип соединения для своих данных. – Joe

ответ

1

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

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

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

+0

Тысячи друзей для пользователя реалистичны, некоторые пользователи в моей старой сети имели 20 000 пользователей. Я думаю, что обновление фона может стать – JasonDavis

0

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

Таблица Person: ID, FirstName, LastName

Таблица Friend: 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 

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

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^