как хранить упоминания пользователей

Я хочу реализовать упоминания пользователей с помощью @username, как в Twitter. Но в моем приложении имя пользователя может измениться. Мой подход заключается в том, чтобы проанализировать сообщение перед сохранением в базе данных и преобразовать все @username в @userId. Что ты думаешь об этом? У кого-нибудь есть лучшая альтернатива?


person nezgerland    schedule 22.09.2011    source источник


Ответы (3)


Сохраните исходный текст как есть и создайте таблицу связанных записей с идентификатором пользователя и именем пользователя.

Пример схемы:

пост [таблица]

id
text

user_mention [таблица]

id
post_id
user_id_mentioned
user_name_mentioned

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

Если пользователь изменит свое имя пользователя, теперь у вас есть возможность обновить публикацию, указав новое имя пользователя, или создать ссылку на нужного пользователя со старым именем пользователя.

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

Может быть, однажды вас заинтересует, кто изменил свое имя пользователя после того, как его упомянули n раз? Или какой-то другой отчет, который вы не можете получить, потому что изменили неструктурированные данные. Вы никогда не знаете, когда вам понадобятся исходные данные, и в этом случае вы получаете дополнительный бонус, заключающийся в том, что с вашим текстом легче работать.

person Ted    schedule 22.09.2011

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

Обратите внимание, что это будет сложнее для нединамического контента, такого как отправленные электронные письма и т. д.

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

person zigdon    schedule 22.09.2011
comment
Спасибо за ваш ответ. Я конвертирую userId обратно в текущее имя пользователя перед отображением. Единственная проблема заключается в том, что я отправляю электронные письма пользователям, которые были упомянуты после того, как сообщение было успешно помещено в базу данных. Затем текст содержит идентификатор вместо имени пользователя. Также не могли бы вы уточнить ваш третий абзац. Я не совсем понял. Спасибо за ваше время и ответ. - person nezgerland; 22.09.2011
comment
Кроме того, чтобы извлечь упоминания из сообщения, я использую следующее регулярное выражение: /@(\w+)/is Я видел много сложных регулярных выражений для этой цели. Но я думаю, что этого как раз достаточно. Каково твое мнение? - person nezgerland; 22.09.2011
comment
Я думаю, что /@(\w+)/ оптимистичен — например, он будет соответствовать [email protected]. - person zigdon; 23.09.2011
comment
Проблема, которую я пытался указать в 3-м абзаце: если вы отображаете имя пользователя в строке, а я что-то публикую, я думаю, что user1 имеет смысл. Затем пользователь 1 может пойти, изменить свой идентификатор на «Я отправлю пользователю 1 все свои деньги, потому что он», и исходный пост станет «Я думаю, что отправлю пользователю 1 все свои деньги, потому что у него есть точка». Видите проблему? - person zigdon; 23.09.2011

Да, я думаю, это хорошо. Сам Твиттер не просто использует Usernames, он использует UserIDs.

Он получает идентификатор пользователя твитера, а затем ищет его, чтобы получить фактическое имя пользователя.

Документация: Упоминания и Поиск

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

person Mob    schedule 22.09.2011
comment
Ссылки мертвы. - person NewBee; 12.05.2018
comment
Не рекомендуется изменять исходный введенный текст/сообщение, в ответе Теда содержится более подробная информация о том, почему это делать не рекомендуется. - person Musa; 14.10.2018