素材牛VIP会员
在MySQL数据库中如何存储用户关注的帖子id
 sk***e4  分类:SQL代码  人气:1332  回帖:8  发布于6年前 收藏

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

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

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

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

不知道这样是否可取?

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

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

 标签:mysqlnode.js

讨论这个帖子(8)垃圾回帖将一律封号处理……

Lv1 新人
岛***疤 页面重构设计 6年前#1

支持建立关系表

Lv3 码奴
ba***pc JAVA开发工程师 6年前#2

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

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进行水平分表

还有疑问,可以留言

Lv6 码匠
a8***12 Linux系统工程师 6年前#3

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

Lv5 码农
陈***8 其它 6年前#4

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

Lv4 码徒
li***zi 其它 6年前#5

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

Lv5 码农
de***st CEO 6年前#6

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

Lv6 码匠
素***2 学生 6年前#7

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

Lv4 码徒
朱***叶 UI设计师 6年前#8

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取