在数据库

时间:2015-08-05 00:58:40

标签: database

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

E.g。 This is a comment for @John.

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

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

这是一个好方法吗?

一些背景:

我想要实现的是类似于Facebook帖子,它允许您标记&#39;用户只需在帖子中提及他们的名字(不是唯一的用户名)。它并不像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>)

2 个答案:

答案 0 :(得分:3)

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

如果您使用NoSQL数据库,嵌入式集合和动态类型是一个很好的选择。这将是相当简单的。

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

}

这样你就可以查询引用,同时仍然可以轻松地重建内容。 但是 ,因为您正在使用SQLAlchemy,这是不行的。你的方法似乎很好,但是因为你在字符串中做了一些魔法,你需要逃脱你的分隔符,(如果它们存在于文本中,也可以逃避转义字符)。就个人而言,我会使用@作为分隔符,因为它已经是一个特殊字符。如果用户在@mention之后粘贴了一堆数字,您还需要识别ID的结尾,所以

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

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

答案 1 :(得分:0)

如果@name不是唯一的,则必须以某种方式通过会话将非唯一名称与自然名称的唯一所有者相关联,并在将其存储在数据库中之前进行理想的操作。在数据库中存储非唯一名称,如果无法将其解析为其唯一所有者,则没有多大价值。

因为你提到“sql”我假设你正在使用关系数据库。如果是这种情况,一旦您将@name解析为其唯一所有者,我将在发布或评论与用户ID之间创建一对多关系;这将允许评论或帖子引用多个用户。

TABLE: COMMENT_MENTIONEDUSERS
commentid
userid