目录
微信朋友圈设计
用户及用户关系
发朋友圈
CDN
发布表
相册表
时间线
刷朋友圈
删除、拉黑、标签、不让他看、三天可见该怎么办
谁可以看
标签
第二步的权限控制
评论和赞
微信朋友圈设计
用户及用户关系
肯定有用户表作为基础
用户关系表,用户id1,用户id2,关系
用户关系分组表,用户id1,用户id2,对应分组
发朋友圈
CDN
当我们把精心修好的图,朋友圈点击发送。是不是有一种秒发零延迟的感觉?
那是因为,我们在发朋友圈时,第一步动作是把你发布的图片传到腾讯就近的CDN节点,这时是不经过微信后台服务器的,所以会很快很快。
(CDN这里就不展开了,可以想象下淘宝的菜鸟仓配网络一样,先把货发到仓配点,然后再配送给你。)
发布表
当图片成功传到CDN后,这时微信客户端才会通知朋友圈CDN,说这里有个人发了个自拍耶。
你发朋友圈时,很可能会屏蔽掉你EX或领导老板之类的对吧。
所以呢,微信朋友圈的后台会把你发的图片、这个图片的URL地址、然后谁能看到这图片(很关键)等等信息写到发布表里。
发布id,发布人id,发布人名字,朋友圈内容,朋友圈图片url,权限信息
相册表
当发布表写完后,会把你这自拍索引到你的相册表里,相册表实际上很小,因为它就存了个索引指针而已。
也就是说,当你打开自己的相册列表看到你过去发的成百上千的照片时,都是根据索引去发布表里取的数据。
时间线
当相册表写好了,就会到一个很关键的步骤了,会触发一个批处理动作。
就是会有个跑腿的,跑过去通知你所有的通讯录好友,说你发了个自拍,然后就会把你发的这个自拍插入到你好友的时间线里。
当你好友刷新时,就会看到你的自拍了!Oh Yeah!
当然这前提是,你的好友没有删除你、拉黑你、屏蔽你、不看你。扎心,我们后面会讲这些过滤的权限问题是怎么处理的。
看的用户id,发布用户id,发布时间线,发布内容id,权限信息
刷朋友圈
好了。假设小王是你的微信好友,工作了五分钟累的不行了,休息休息刷下朋友圈。
当小王点开朋友圈时,会拉他自己的时间线,这时他的时间线会得知有个你的新发布,小王的微信客户端会根据你的发布的元数据去CDN找这个图片的URL,拉到本地,然后小王就能看到你发的自拍了。
删除、拉黑、标签、不让他看、三天可见该怎么办
谁可以看
当我们发朋友圈的时候,会有个谁可以看的选项,默认是公开,也就是你所有的好友(非删除、黑名单状态)都会看到。
除此,还有部分可见和不给谁看的选项,这里就是第一步的权限控制。
但这里控制的是,你发的这个照片,要加到哪些好友的时间线里;也就是说,假设你选择了不给“领导”标签下的人看,那领导标签下的所有人的时间线都不会加上你的这条新朋友圈。
标签
标签实际上是帮助你更方便选择可见好友范围的一个东西,只有这一个作用。
举个例子:比如说你发了自拍,选择“男神”标签发了出去,此时“男神”标签下有吴彦祖和古天乐两个人,那么吴彦祖和古天乐都能刷到你的自拍。
这时呢,你又把刘德华加到“男神”标签下,刘德华是不会刷到你发的这张自拍的!
同理,你渐渐厌倦了古天乐,把古天乐从“男神”标签里移了出去,古天乐依然可以看到你发的这个自拍哦。
明白了吧,你通过标签选择的可见范围,都是具体到标签下的人的。在你发布的那一瞬间,发布加到了谁的时间线里,就都定下来了。所以无论后面怎么调整标签下的人,都不会影响这条已经发出去的自拍了。
那你说,我就是不想让古天乐看我的这张自拍怎么办?好办,你可以选择删除他、拉黑他、不让他看、自拍设置成仅自己可见。
第二步的权限控制
当小王刷朋友圈时,上面提到会更新他的时间线。
这个时候,小王的客户端还会做一个事情:就是查一遍权限。
也就是说,查一下时间线上的发布,有没有是属于不给小王看的。包括:删除、拉黑、不给他看、三天可见,这些都是可以随时变更设置的,因此小王每一次刷新朋友圈,时间线都会被筛选一下。
那就有宝宝说,会不会太麻烦了呀,每次都要查吗?
实际上不太麻烦。因为首先在你发布时,就确定了要加到哪些好友的时间线里,因此小王在刷朋友圈时,不用去每个好友的相册里去捞,这相册还有可能存在几百个不同的服务器里。而只需要读自己的时间线这一个动作就行了,这样的话效率就高上天了。
而删除、拉黑、不给他看、三天可见这些权限的设置,并不是说大家时时刻刻每天在改的东西,可能好久才改一次。
因此小王的微信客户端一般会把这些权限数据缓存下来,不需要每次都去拉这个数据,只有变动的时候才去变更一下。所以,怎么说呢,问题不大。
评论和赞
理解了上面讲的整个发布表、相册表、时间线这些东西后,评论和赞就相对好理解了。
微信后台会专门有张表存储评论和赞这些数据,假设三三是你和小王的共同好友,他刷朋友圈时,看到了你的这张自拍。那么会同时去评论表里拉这条发布的小王相关的评论和赞,放到这条朋友圈下面。
如果不是你和小王的共同好友,那就看不到这评论和赞。
评论id,评论用户id,发布id,发布用户id,评论信息,评论时间
商品属性枚举值
要求提出一套商品属性相关的数据库设计思路,要求是商品属性的类别(例如品牌,尺寸,颜色.)不确定,各个属性类别的属性值(例如品牌可能是HP,IBM..)不确定,同时需要实现针对不同属性类别的商品检索,例如检索出品牌为XX,尺寸为XX,颜色为XX的商品,各条件为AND操作,另外每个属性类别的条件可能为品牌=XX or品牌 = YY这样的OR操作,最终实现出类似淘宝商品检索页面那样的功能如下(品牌,裤长等条件为AND关系,品牌中的可以选择多个品牌,为OR关系)
属性类别表spec
spec_id -属性类别id
spec_name-属性类别名称
属性值表spec_info
spec_info_id-属性值id
spec_id-属性类别
spec_info_name属性值名称
商品表goods
goods_id-商品id
goods_name-商品名称
商品属性表goods_spec
goods_spec_id-商品属性id
goods_id商品id
spec_info_id-商品属性值id
建立以上4个数据库后,spec表存放的是品牌,颜色,尺码等的属性名, spec_info表存放的是红色,蓝色,HP, IBM等的实际的属性值,再通过goods_spec表将一个商品跟它的属性进行关联,这样要实现类似淘宝的检索功能的SQL语句就可以编写如下:
假设要检索品牌为IBM或HP(在spec_info表中的spec_info_id分别为1和2) ,颜色为红色(在spec_info表中的spec_info_id为6),尺码为15寸(在spec_info表中的spec_info_id 为5)的商品
$sql = "select * from goods_spec where spec_info_id = 5 and goods_id in (select goods_id from goods_spec where spec_info_id = 6 and goods_id in (select goods_id from goods_spec where spec_info_id = 1 or spec_info_id = 2);