mysql - 使用 "hashtags"的应用程序的数据库设计

标签 mysql normalization hashtag

这里是数据库设计问题。

假设我们有一个网络应用程序或使用主题标签来记录 20-40 个单词的笔记的应用程序。存储用户标签的最佳方式是什么。

例如,如果用户输入。 “我喜欢在#sizzler 吃#lunch” 我们会将句子存储为文本,我们可以将主题标签存储为 JSON、逗号分隔列表或其他一些机制。

另外值得指出的是,标签需要是可搜索的,比如有多少人在hash tag lunch等。

就此事提出建议会很好,当谈到在 mysql 中存储可变大小的输入时,我总是有点难过。每个笔记可以有无限多个主题标签,存储它们的最佳方式是什么?

最佳答案

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

这意味着您需要 3 个表。

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

这样您就不会多次存储标签,而只会创建与消息的新关系(当然,如果该标签已经存在于标签表中)。

这样可以

  • 轻松计算标签的数量(SELECT COUNT(*) FROM Tags)
  • 每个标签只保存一次,搜索标签可以轻松索引
  • 计算每个用户使用某个标签的次数 - 例如:

选择 数数(*) 来自标签 INNER JOIN TagMessageRelations ON Tags.Id = TagMessageRelations.TagId INNER JOIN Messages ON TagMessageRelations.MessageId = Messages.Id GROUP BY Messages.UserId

关于mysql - 使用 "hashtags"的应用程序的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24799753/

相关文章:

关于稀疏矩阵的Matlab问题

python - 如何使用 Twitter 搜索 API 获取所有带有给定主题标签的推文?

c++ - 在 C++ 中获取 twitter #hashtag 帖子

mysql - 我可以使用 select where in(x,y,z) 吗?

mysql - 这是不必要的规范化吗?

php - 在 magic_quotes 打开的服务器上 INSERT 失败

mysql - 这种Mysql数据库规范化形式和结构设计是否正确?

jquery - 如何使用 jquery.linkify 插件链接 @usernames 和 #hashtags

php - 按 id 对表元素的值进行分组

php - 将行中的数据放入无 php 站点进行编辑