在MySQL数据库中如何存储用户关注的帖子id

背景情况是这样的:
我使用NodeJS + Express + MySQL搭建一个社区网站。

数据库中有一张user表,一张topic表。用户可以“关注”一个帖子。

我知道要获取某用户发表的帖子,是类似于
select * from topic where userid=userid
这样的语句。

可是对于“关注”功能,一时没想到如何设计表的字段。目前,我打算在user表中建一个TEXT类型的字段topic_stared,将用户关注了的帖子的topic_id们以JSON序列存储到topic_stared中。

不知道这样是否可取?

PS:已看过这个帖子:在关系型数据库中频繁使用 JSON 格式来存储不需要索引的数据好么?

还有像这样的:怎么样实现MYSQL数据库分表?难道要建N多个表吗?

阅读 8.1k
8 个回答

首先,不要对建表有恐惧心理,觉得就为一个映射关系建一张表很不值当。
现在,我们假设建立这样的表,来存储关注的帖子。

userId int(10)
topicId int(10)

只有两个字段,觉得很浪费是不是。
我们来讲讲好处:
1,查询
得到用户所有关注的帖子select topicId from starTable where userId = userid
获取有多少人关注了这个帖子select count(*) from starTable where topicId = topicId
还不错吧
2,扩展
现在希望存储用户什么时间关注的某个帖子,显然在这个表里加个time字段就好
3,效率
拿一个删除功能来说,很显然在数据库里直接删除一条记录,肯定比查询出字段,截取掉其中一部分,再插入要快
4,限制
如你所知道的,mysql单行数据是有上限的,如果一个用户关注了一w个topic,肯定会爆掉这个user表的

其他:
如果可以你可考虑下mongodb这种nosql数据库,或者postgre这种课存储json的关系型数据库,当然用mysql也是很好的选择
当然,用一个存储这种映射关系的表,如果未来用户量一大,肯定要做分表,到时可以很方便根据用户id的hash进行水平分表

还有疑问,可以留言

你看的帖子说的很清楚,慎用text字段,建议换db,nosql
如果你真的很想用mysql,先说说关注你想做成什么样子,需求是什么说清楚再谈合适不合适

那样存总有一天会超过最大的限制吧,我看cnode社区的收藏是单独拿个表存的,一条记录包括user_idtopic_id时间

新建一张topic_stared表userid topicid addtime,或者用mysql5.7 支持json。不过新建一张表的扩展性好。

新手上路,请多包涵

支持建立关系表

根据三大范式,明显是要有一个多对多的关注表

建一张关联映射表是不错的选择,mongodb查询起来不是很方便

楼主的需求应该只要建张多对多的表就行,如果考虑性能的话,可以用redis等,微博关注什么的都是这么搞的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题