使用“hashtags”的应用程序的数据库设计

38

数据库设计问题。

假设我们有一个使用20-40个单词笔记的webapp或其它应用程序,使用hashtags。存储用户的hashtags的最佳方法是什么。

例如,如果用户输入:"我喜欢在#西兹拉吃午餐",我们会将句子作为文本存储,可以将hashtags作为JSON、逗号分隔列表或其他机制进行存储。

还值得指出的是,这些标签需要可搜索,例如有多少人使用了午餐的hash标记等等。

对此的建议将是很好的,当涉及到在mysql中存储可变大小的输入时,我总是感到有些困惑。每个笔记可能有无限数量的hashtags,那么最佳的存储方式是什么?


不想再多说,但是在重新思考时我注意到你在问题中并没有特别提到mysql(甚至还提到了csv和json...),是否可以将其一般标记为“数据库”,因为这可能会打开有趣的替代nosql解决方案或其他内容?...(我很好奇将nosql与关系型解决方案进行比较,所以我才问的 :)) - DrCopyPaste
1个回答

61

我建议使用消息和标签之间的典型多对多关系。

这意味着您需要三个表:

  • Messages(列 IdUserIdContent
  • Tags(列 IdTagName
  • TagMessageRelations(列: MessageIdTagId - 通过指向 Messages.Id / Tags.Id 的外键来建立消息和标签之间的连接)

这样,您不会将标记多次存储,而是只创建到消息的新关系(如果该标记已经存在于标记表中,当然可以)。

这样,您可以:

  • 轻松统计有多少个标记SELECT COUNT(*) FROM Tags
  • 仅保存每个标记一次,并且搜索标记可以轻松索引
  • 统计每个用户使用某个特定标记的次数,例如:

SELECT COUNT(*) FROM Tags INNER JOIN TagMessageRelations ON Tags.Id = TagMessageRelations.TagId INNER JOIN Messages ON TagMessageRelations.MessageId = Messages.Id GROUP BY Messages.UserId


太棒了,那基本上就是我想的。标签表中的标签是唯一的吗? - ddoor
1
是的,这就是想法,它们在标签表中是唯一的,但在标签消息关系表中具有多个关系。 - DrCopyPaste
谢谢,很高兴能帮到你;附言:谢谢提醒,我已经过期需要进行一些编程挑战了:D - DrCopyPaste
4
TLDR: 我相信增加INT列的数据量对其他列来说是微不足道的,但在性能方面可以得到回报。在数据库中拥有大量数据时,你或许会注意到这一点。虽然我没有亲自测试过,但有证据表明,在连接时使用INT比使用varchars(例如)更有效率(以下链接是关于SQL Server的:https://www.sqlinthewild.co.za/index.php/2011/02/15/are-int-joins-faster-than-string-joins-2/)。 - DrCopyPaste
如果您在关系型数据库场景中使用标签值作为主键,桥接表将具有值而不是ID,这对于获取所有消息标签等场景非常有用。也许不适合标签在消息中的情况,但对于文章中的标签等其他场景非常有用。 - S.Dan
显示剩余3条评论

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