Я хочу реализовать упоминания пользователей с помощью @username, как в Twitter. Но в моем приложении имя пользователя может измениться. Мой подход заключается в том, чтобы проанализировать сообщение перед сохранением в базе данных и преобразовать все @username в @userId. Что ты думаешь об этом? У кого-нибудь есть лучшая альтернатива?
как хранить упоминания пользователей
Ответы (3)
Сохраните исходный текст как есть и создайте таблицу связанных записей с идентификатором пользователя и именем пользователя.
Пример схемы:
пост [таблица]
id
text
user_mention [таблица]
id
post_id
user_id_mentioned
user_name_mentioned
Когда сообщение сохраняется, ваш код должен пройти и создать все записи user_mention. Вы можете просмотреть таблицу упоминаний, чтобы отправить электронное письмо или сделать что-то еще, что вы хотите сделать.
Если пользователь изменит свое имя пользователя, теперь у вас есть возможность обновить публикацию, указав новое имя пользователя, или создать ссылку на нужного пользователя со старым именем пользователя.
Мое правило состоит в том, чтобы никогда не изменять исходный неструктурированный текст перед сохранением в базе данных (но проверяйте его на работоспособность, чтобы избежать инъекций и тому подобного) и изменяйте данные только при выводе. Это означает, что у вас всегда есть введенные пользователем данные, и вы никогда не знаете, когда они будут полезны.
Может быть, однажды вас заинтересует, кто изменил свое имя пользователя после того, как его упомянули n раз? Или какой-то другой отчет, который вы не можете получить, потому что изменили неструктурированные данные. Вы никогда не знаете, когда вам понадобятся исходные данные, и в этом случае вы получаете дополнительный бонус, заключающийся в том, что с вашим текстом легче работать.
Да, я думаю, что проверка списка имен пользователей во время публикации и внутреннее преобразование их в идентификатор пользователя имеет смысл. Затем всякий раз, когда вы отображаете сообщение, переводите идентификатор пользователя обратно в текущее имя пользователя.
Обратите внимание, что это будет сложнее для нединамического контента, такого как отправленные электронные письма и т. д.
Кроме того, я бы позаботился о том, чтобы имена пользователей отображались таким образом, чтобы было ясно, что они не являются словами, опубликованными ОП, иначе это дало бы пользователям возможность вставлять текст в чужой пост.
/@(\w+)/
оптимистичен — например, он будет соответствовать [email protected]
.
- person zigdon; 23.09.2011
Да, я думаю, это хорошо. Сам Твиттер не просто использует Usernames
, он использует UserIDs
.
Он получает идентификатор пользователя твитера, а затем ищет его, чтобы получить фактическое имя пользователя.
Документация: Упоминания и Поиск
Каждый пользователь должен иметь уникальный идентификатор. Вы должны сопоставить идентификатор с именем пользователя, прежде чем отправлять его в любом месте, которое будет видно пользователям.