如何存储用户提及信息

7

我希望在我的应用中实现类似Twitter的用户提及功能,使用@username来提及用户。但是,在我的应用中,用户名可能会更改。我的方法是在保存帖子到数据库之前解析帖子并将所有@username转换为@userId。您认为这个方法怎么样?有没有更好的替代方案?

3个回答

11

请将原始文本保留,创建一个包含uid和用户名的相关记录表。

示例架构:

post [表]

id
text

user_mention [table]

id
post_id
user_id_mentioned
user_name_mentioned

当一篇文章被保存时,你的代码应该遍历并创建所有用户提及记录。你可以通过循环遍历提及表格来发送电子邮件或执行其他操作。
如果用户更改了他们的用户名,你现在有一个选择:更新帖子的新用户名,或者让旧用户名链接到正确的用户。
我的原则是永远不要在保存到数据库之前修改原始的非结构化文本(但要进行合理检查以避免注入等问题),只有在输出时才修改数据。这意味着你始终拥有用户输入的数据,并且你永远不知道什么时候它会有价值。
也许有一天你会对谁在被提及n次后更改了他们的用户名感兴趣?或者其他一些报告,因为你修改了非结构化数据而无法获得。你永远不知道何时需要原始数据,在这种情况下,你能够更轻松地处理文本。

2

是的,我认为在发布时检查用户名列表,并将其内部转换为用户ID是有意义的。然后,每当您显示帖子时,将用户ID转换回当前用户名。

请注意,对于非动态内容(例如发送的电子邮件等),这将更加困难。

此外,我会确保以一种清晰明了的方式显示用户名,以表明它们不是OP发布的单词,否则,这将为用户提供一种向他人的帖子中注入文本的方法。


谢谢您的回复。在显示之前,我确实将userId转换回了当前用户名。唯一的问题是,在成功将帖子放入数据库后,我会向被提到的用户发送电子邮件。然后文本中包含ID而不是用户名。此外,您能否详细说明第三段内容。我没有完全理解它。感谢您的时间和回复。 - nezgerland
另外,为了从帖子中提取提及,我使用以下正则表达式: "/@(\w+)/is"我看到了很多更复杂的正则表达式来实现这个目的。但我认为这已经足够了。你的意见呢? - nezgerland
1
我认为/@(\w+)/是乐观的 - 它可以匹配例如user@example.com的字符串。 - zigdon
我想指出的问题在第三段 - 如果您将用户名内联显示,而我发布了“我认为user1有一点道理”的内容。那么user1可以更改他们的ID为“我将向user1发送所有我的钱,因为他”,原始帖子将变成“我认为我将向user1发送所有我的钱,因为他有一点道理”。看到问题了吗? - zigdon

0

是的,我认为这很好。Twitter本身不仅使用Usernames,还使用UserIDs

它获取推特用户的用户ID,然后查找以获取实际用户名。

文档:MentionsLookup

每个用户应该有一个唯一的ID。在将其发送到任何对用户可见的地方之前,您应该将ID与用户名匹配。


链接已失效。 - NewBee
修改原始输入的文本/帖子并不是一个好的做法,Ted的答案更深入地解释了为什么这样做不是一个好主意。 - Musa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接