今天召开了一个Java技术分享会,讲到一个数据库设计方面的问题。
有个新入职的小伙,问了我好几个问题,牛气轰轰的,总觉得是在教我做人。
下面是他提的问题当中的某一个:
他说:“我就问你,微博的用户粉丝关系表,如何解决笛卡尔积的问题?”
我回答的是,微博的明星粉丝与普通用户的粉丝关系表单独设计。
用户的粉丝设置一个阈值,比如1万,1万以内可以考虑根据用户ID取模分表,像微博这么大的用户群体,可以多拆分一些表,超过1万粉丝的用户,归属为明星用户。
如果是明星用户,粉丝上千万的这种,可以用他的用户ID做表名,如t_follow_id65535,表中只存放他的粉丝用户ID,并加索引,查询起来也是非常快捷的。
小伙不依不饶着说道:“那这样的话,需要很多表啊,除了粉丝表,还有关注表吧,这太恐怖了。”
我说,只有粉丝表,关注表可以省掉。
比如说,ID为123的用户,和ID为456的用户,之间发生了粉丝的关系,只需要存一条数据即可。
这两个用户ID必然有一大一小的情况,我们只要保证每次都是小的在前面,大的在后面,然后这条数据再添加一个字段,用来表示他们之间的关系,0表示关系已删除,1表示小的关注大的,2表示大的关注小的,3表示他们互相成为了粉丝。
小伙最后还是倔强道:“那不对啊,明星用户和普通用户产生了粉丝关系,不是存在2张表里都有数据了吗?”
我说,明星用户特殊考虑就行了,只要遇到两个ID,判断其中是否有明星用户,有的话明星用户的ID放前面,这样就能保证顺序不会出错。
如果考虑到普通用户关注了明星,而只有明星表里有数据的话,那么可以多加一张冗余表,比如叫我的明星关注表。
小伙最后还想问什么,但是想了想又坐下了,各位觉得他还想问啥?