在数据库中使用提及(@FirstName)存储注释的最佳方法

ken*_*ken 8 database

想知道在数据库(sql)中存储注释的最佳方法是什么,允许通过非唯一的自然名称提及其他用户?

例如 This is a comment for @John.

如果单击了他/她的名字,客户端应用程序还需要检测并链接到相应的用户配置文件.

我最初的想法是用id和一些元数据替换用户的名字并将其存储在DB中:该用户的id This is a comment for <John_51/>在哪里51.然后,客户端可以解析它并显示相应的用户名和配置文件链接.

这是一个好方法吗?

一些背景:

我想要实现的类似于Facebook帖子,它允许您通过在帖子中提及他们的名字(不是唯一的用户名)来"标记"用户.它不必像Facebook那样复杂,因为我需要它不是用于帖子,而只是评论(只能是文本,而不是可能是与视频/图像等混合的文本的帖子) .

该解决方案将影响数据库端(如何存储注释)以及客户端(如何解析注释并向用户显示注释).客户端是iOS和Android的移动应用程序,但也希望扩展到Web应用程序.

我认为语言并不重要,但为了完整起见,我在后端使用Python的Flask和SQLAlchemy框架.

评论的当前数据库架构

COMMENT TABLE:
id         (<PK>)
post_id    (id of the post that the comment is for: <FK on a post object>)
author_id  (id of the creator of the comment: <FK on a user object>)
text       (comment text: <String>)
timestamp  (comment date: <Date>)
Run Code Online (Sandbox Code Playgroud)

lyj*_*kal 5

这里最大的问题是,如果用户名不是一个稳定的引用,则需要将其抽象为一个id引用,同时仍保持文本可重构,但引用可查询。

如果您使用NoSQL数据库,则嵌入式集合和动态类型化是一个不错的选择。这将非常简单。

{
  _id: ...,
  text: [
    "Wow ",
    51, 
    ", your selfie looks really great, even better than ",
    72,
    "'s does."
  ],
  ...

}
Run Code Online (Sandbox Code Playgroud)

这样,您可以查询引用,同时仍然可以轻松地重建内容。但是,由于您使用的是SQLAlchemy,因此无法进行。您的方法似乎不错,但是由于您在字符串中执行魔术操作,因此如果文本中存在定界符,则需要转义分隔符(以及转义转义字符)。就个人而言,我将其@用作分隔符,因为它已经是一个特殊字符。您还需要标识id的结尾,以防用户在后面加上一串数字@mention,因此

Wow @51@, your selfie looks really great, even better than @72@'s does. email me! john\@foo.com. Division time!!! with backslashes! 12\\4 = 3

如果查询帖子以获取参考信息对您也很重要。您还需要维护一个单独的POST__USER联结表,该联结表为该帖子和每个用户ID存储一行,以便在将对象加载到内存中时可以构造一个集合。您可以决定稍后添加联结表,但这将是一个相当昂贵的迁移。