Maison > développement back-end > tutoriel php > 微博关注用户表的设计

微博关注用户表的设计

WBOY
Libérer: 2016-06-23 13:40:38
original
1724 Les gens l'ont consulté



查询需求如下:
1.查询关注了哪些用户。
2.查询被哪些用户关注了。
3.查询和某个用户共同的关注列表。
4.查询是否互相关注。

用一个表,以 user_id   follow_user_id   add_time列的形式可以实现上述功能。
可是关注量比较大,需要按用户 id来分表。不知道怎样设计表结构好。

求助友友们,请多多给建议。 谢谢


回复讨论(解决方案)

以 用户id 来分区

用户ID吧,每个表之间都用用户id

以 用户id 来分区



版主 我是想用用用户id来分表,可是分表后上面的功能就不好实现了。比如我要查 哪些用户关注了我,分表后;我不确定要查哪个表。只有将所有分表都查一次才可以知道。

单独保存一个关注表
或者把关注你的用户也存到用户表里可行不?

正因为分表后不确定要查哪个表,所以不能分表而是分区
分区后的表对你而言依然是一个整表(虽然被分成了多个文件),实际查询的是那个文件由mysql决定而不是你决定

如果你依然想自己分表,那么需要交换 user_id、follow_user_id 列的内容形成新表,再对两个表分表


以 用户id 来分区



版主 我是想用用用户id来分表,可是分表后上面的功能就不好实现了。比如我要查 哪些用户关注了我,分表后;我不确定要查哪个表。只有将所有分表都查一次才可以知道。
不要分表呀,直接写sql语句就可以了

1.查询关注了哪些用户:select `follow_user_id` from `表` where `user_id`='你的id'
2.查询被哪些用户关注了:select `user_id` from `表` where `follow_user_id`='你的id'
3.查询和某个用户共同的关注列表。select * from `表` where `user_id` in ('你的id', '某个用户id')
4.查询是否互相关注:select * from `表` where `user_id`='你的id' and `follow_user_id`='某个用户id' `user_id` in (select `follow_user_id` from `表` where `user_id`='某个用户id')

当然估计还有更优秀的写法,特别是第4条

select * from `表` where `user_id`='你的id' and `follow_user_id`='某个用户id' and `user_id` in (select `follow_user_id` from `表` where `user_id`='某个用户id')
Copier après la connexion
第4条少了一个and,重新写一下

正因为分表后不确定要查哪个表,所以不能分表而是分区
分区后的表对你而言依然是一个整表(虽然被分成了多个文件),实际查询的是那个文件由mysql决定而不是你决定

如果你依然想自己分表,那么需要交换 user_id、follow_user_id 列的内容形成新表,再对两个表分表



谢谢回答 我会参考一下的

正因为分表后不确定要查哪个表,所以不能分表而是分区
分区后的表对你而言依然是一个整表(虽然被分成了多个文件),实际查询的是那个文件由mysql决定而不是你决定

如果你依然想自己分表,那么需要交换 user_id、follow_user_id 列的内容形成新表,再对两个表分表



版主 分区是什么概念呢。吾只懂电脑分区阿

还有这句话可以详细说一下吗

”那么需要交换 user_id、follow_user_id 列的内容形成新表,再对两个表分表“

谢谢啦!

关于表分区可参见 http://www.baidu.com/s?ie=utf-8&bs=mysql%E5%88%86%E5%8C%BA%E8%A1%A8&f=8&rsv_bp=1&wd=mysql%E5%88%86%E5%8C%BA&rsv_sug3=1&rsv_sug=1&rsv_sug1=1&rsv_sug4=26&inputT=796

关注可以是单向的,比如这个

user_id follow_user_id1       21       31       4
Copier après la connexion
Copier après la connexion

按 user_id 分表后,你整检查所有的表才能得到与 follow_user_id 相连的 user_id
所以你需要另有一组以 follow_user_id 分组的表
follow_user_id user_id 2              13              14              1
Copier après la connexion
Copier après la connexion

关于表分区可参见 http://www.baidu.com/s?ie=utf-8&bs=mysql%E5%88%86%E5%8C%BA%E8%A1%A8&f=8&rsv_bp=1&wd=mysql%E5%88%86%E5%8C%BA&rsv_sug3=1&rsv_sug=1&rsv_sug1=1&rsv_sug4=26&inputT=796

关注可以是单向的,比如这个

user_id follow_user_id1       21       31       4
Copier après la connexion
Copier après la connexion

按 user_id 分表后,你整检查所有的表才能得到与 follow_user_id 相连的 user_id
所以你需要另有一组以 follow_user_id 分组的表
follow_user_id user_id 2              13              14              1
Copier après la connexion
Copier après la connexion



版主  
"follow_user_id 分组的表" 也是要分表的吧
那这个方案可以支持查,哪些人关注了我吗。
比如我的用户id是1    按follow_user_id 尾数进行分表。


follow_user_tbl_1

follow_user_id user_id 
1               1
11              1
21              1

follow_user_tbl_2

follow_user_id user_id 
2               1
12              1
22              1

如果 user_id follow_user_id 表示 user_id 被 follow_user_id 关注
那么 follow_user_id user_id 表示 follow_user_id 关注了 user_id

你把主体确定了,事情就清楚了

单独保存一个关注表
或者把关注你的用户也存到用户表里可行不?



单独保存一个关注表不大可行   因为数据量太大啦 

关注我的用户存到用户表不合理  

如果 user_id follow_user_id 表示 user_id 被 follow_user_id 关注
那么 follow_user_id user_id 表示 follow_user_id 关注了 user_id

你把主体确定了,事情就清楚了



版主  吾听了你的,开始明白你的想法啦。 谢谢了。要分表可能只有这样啦

ollow_user_tbl_1

follow_user_id user_id 
1               1
11              1
21              1

follow_user_tbl_2

follow_user_id user_id 
2               1
12              1
22              1

楼上说的不就是一个用户关联表么?为什么是两个?一个就可以实现这个功能了。

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal