拉一页的动态,假如 20 条数据出来。每条动态上需要点亮是否关注、收藏、点赞这些状态。请问应该怎么去设计数据库比较合理?
我目前是在关系型数据库中通过下面的方式实现的,但是感觉性能上有缺陷。 如果用 nosql 的方式,又存在点赞人数非常多比如极端几十万个用户点赞,这种问题。 麻烦大佬指点一下!
//关注状态
if($needFollow){
$in = trim(implode(',', array_unique($uid_follow)),',');
$res = $this->query("SELECT `uid_follower` FROM relationship WHERE uid_follower in (".$in.")");
foreach ($res as $v){
$ufArr[$v['uid_follower']] = 1;
}
}
//点赞状态
$in = trim(implode(',', array_unique($feedid_uid)),',');
$res = $this->query("SELECT `feedid_liker` FROM feed_like WHERE feedid_liker in (".$in.")");
foreach ($res as $v){
$fuArr[$v['feedid_liker']] = 1;
}
//收藏状态
$in = trim(implode(',', array_unique($feedid_uid)),',');
$res = $this->query("SELECT `feedid_uid` FROM collect WHERE feedid_uid in (".$in.")");
foreach ($res as $v){
$cfuArr[$v['feedid_uid']] = 1;
}
1
kaxi OP 我考虑将上面三种状态的查询通过异步执行的方式去执行。性能应该会有所提高。但是感觉还是治标不治本。
感觉还是需要在数据库层面去想办法才行。 望高人指点 |
2
jininij 2018-08-23 19:09:22 +08:00 via iPhone 1
经常有一条微博被点十万加的赞。但很少有人给十万条微博点赞。所以优先肯定是以用户来分组。
每篇微博的 id,用一个 8 字节的长整数,点十万个赞也就 80k 的数据。客户端 down 到本地来,逐条处理都可以。 只是提供一种思路。 |
3
kaxi OP @jininij 好像你这种方案还是没解决需要多路查询的问题,或者我没理解到位? 我想如果用 nosql 的方案每条动态里都记录点赞、收藏的用户 id 这样就可以不用查询别的表就能判断点赞、收藏状态了。但存在的问题是当点赞、收藏用户量很大的话那么对应的动态记录数据量就会异常大了。如果用关系型数据库,有需要每次都去查询多张表。
|
5
kaxi OP help
|
7
sy20030260 2018-08-23 21:54:03 +08:00 via Android 2
这种有实时性需求的场景,存储自然会使用到 Redis 或者其他的 NoSQL,只用 MySQL 之类的数据库单机性能在这种场景肯定是不足的,除此之外一般还需要做:
1.使用 MQ 做异步解耦 2.数据冷热分离,热数据冷却下沉至 SSD 或硬盘 |
8
sy20030260 2018-08-23 21:58:49 +08:00 via Android
而且点赞关注这种消息流服务是一个完整的后台服务模块,单单考虑存储设计是不足以解决所有问题的,消息旁路,消息防丢,服务降级...是个大的系统问题
|
9
howryan 2018-08-23 22:05:13 +08:00
mark
|
10
liprais 2018-08-23 22:06:19 +08:00 via iPhone
你注意看就知道微博那个对于热点大部分时候是不准的
|
11
kaxi OP @sy20030260 感谢提醒。如果将三种关系表都存到缓存其实性能瓶颈就基本消失了,其实三种状态查询就是简单 key-value
|
13
liubai 2018-08-23 22:59:11 +08:00 1
建议使用 KV 存储,如 Redis、HBase 等,实际上这种 Feed 流系统可以直接抛弃关系型数据库,全部使用 KV 解决。当然数据量少的情况,可以用下关系型数据库。
之前做过一个分享 https://myslide.cn/slides/9250,希望能有所帮助。 |
15
teek 2018-08-23 23:39:39 +08:00
关系型其实可以作为系统最后的一个存储地方,前面加缓存,比如 redis 这种,redis 重点可以用那些批量的操作,减少网络 io 的耗时,用好批量,在我系统下有 100 倍的提升。
|
16
owenliang 2018-08-24 08:58:34 +08:00 via Android
微博被点赞是微博的属性,你是否点赞是你的属性,两码事吧
|