首页 > 试题广场 >

Twitter是一个微博客网站,通过简短的微博客(140字以

[问答题]
Twitter是一个微博客网站,通过简短的微博客(140字以内)来快速传递信息。整个网站有三个非常重要的元素:人、微博客、人和人的关系(单向的关注关系)
举例:假设有A、B、C三个用户,A关注B,C关注A,C关注B。
A发表了3篇微博客a1、a2、a3
B发表了2篇微博客b1、b2,
C关注了A和B 那么C进入twitter系统,会看到以下的信息:
2010-11-9 10:01 A发表了a1
2010-11-9 09:50 B发表了b2
2010-11-8 23:00 A发表了a3
2010-11-8 22:50 A发表了a2
2010-11-8 12:30 B发表了b1
整个系统是一个读多写少的系统。
问题1、请描述要达到这个功能的数据结构设计以及数据查询过程。
问题2、如果C关注了10000个人,或者A被100万人关注,系统你将怎么设计?
问题1:
主要是数据库的设计:
  1. 首先,一张用户表,存储uid和其他属性,uid为主键。
  2. 然后,微博内容一张表,包含tid、time、content属性,id设置为自增主键。这张表随着时间推移,内容会越来越多,可以按照时间划分:历史数据数(使用极少)、最近数据表。另外,这张表也可以不用关系型数据库,存储在NoSQL型数据库也可以。
  3. 关注关系一张表,包含id1、id2,分别表示被关注者id和关注者id,为被关注者id(id1)建立索引
  4. 订阅内容一张表,包含uid, tid, time,分别表示用户id, 微博id和订阅内容到达的时间,为uid建立索引。另外,存储时间属性也是为了以后这张表按照时间划分为:历史数据和最近数据。
A/B用户发微博时的数据生成:
  1. 首先写 博客内容张表
  2. 关注关系表,得到所有关注者的id,
  3. 根据第1、2两步得到的关注者id和微博id,写订阅内容这张表。
C用户登录时的数据读取:
  1. 订阅内容表,得到最近更新的微博id
  2. 根据微博id查微博内容表,得到最近更新微博
建立关注关系时:
  1. 关注关系表插入一条数据即可
取消关注关系时:
  1. 删除关注关系表一条数据即可
除了取消关注操作,其他用户操作所需的数据库操作效率都比较高:
  1. 查询都是在索引建上操作的
  2. 插入操作效率本来就比较高
  3. 取消操作时,需要根据id1和id2在关注关系中删除记录,因为该表只在id1上建立索引了,如果遇到一个人被很多人关注,即一个id1对应大量id2时,删除操作效率比较低。如果遇到这种情况成为了性能瓶颈,可以考虑对id1和id2建立联合索引。
问题2:
按上述设计,C关注10000人,不会有什么问题。如果A被100万人关注,且这100万人中经常有人再取消关注A,最好针对关注关系表的id1和id2建立联合索引。

发表于 2015-01-05 23:26:53 回复(0)