Database design 如何实现twitter';s';朋友';时间线';功能

Database design 如何实现twitter';s';朋友';时间线';功能,database-design,optimization,twitter,algorithm,Database Design,Optimization,Twitter,Algorithm,我试图通过创建一个twitter克隆来学习数据库设计。。我想知道创建好友时间轴函数最有效的方法是什么。我在GoogleAppEngine中实现了这个功能,它使用大表来存储数据。IIRC,这意味着非常快的读取速度(gets),但相当慢的页面查询,这也意味着相当慢的写入速度。目前在我看来,有两种方法,每种方法都有其挫折: 对于每个用户,都有一个列表结构,这是他们朋友的时间线。每次有人发tweet时,每个关注者的tweet结构都会得到更新。这个方法使用了很多写操作,但是对于每个检索列表的用户来说,它似

我试图通过创建一个twitter克隆来学习数据库设计。。我想知道创建好友时间轴函数最有效的方法是什么。我在GoogleAppEngine中实现了这个功能,它使用大表来存储数据。IIRC,这意味着非常快的读取速度(gets),但相当慢的页面查询,这也意味着相当慢的写入速度。目前在我看来,有两种方法,每种方法都有其挫折:

对于每个用户,都有一个列表结构,这是他们朋友的时间线。每次有人发tweet时,每个关注者的tweet结构都会得到更新。这个方法使用了很多写操作,但是对于每个检索列表的用户来说,它似乎非常快

对于每个用户,通过获取他跟踪的人的所有tweet动态计算朋友的时间线,并合并所有tweet以获取朋友的时间线(因为每个人的tweet是按时间顺序排序的)。如果一个人跟踪了很多人,这可能会很慢


还有其他我不知道的方法吗?当用户数量增加时,这两种方法似乎都会使系统阻塞。

您需要将重点放在练习的对象上,即学习数据库设计。因此,不要对可伸缩性挂断电话。设计一个适合你和你的伴侣使用的数据库。几乎任何你选择的设计都能处理这种负载。除此之外,如果你开始接近Twitter风格的点击率,GAE许可证将开始向你收取大笔费用

问题是,Twitter和Facebook等玩家的可伸缩性是他们主张的主要部分。因此,他们花费了大量精力来构建可扩展的应用程序。他们通过大量优化来实现这一点,包括针对不同类型数据的不同存储体系结构、分布式服务器和缓存,以及大量缓存。换句话说,它是通过基础设施和体系结构完成的,而不是数据库设计

高可扩展性是相关信息的很好来源。例如,它非常相关:

“[E]现在RAM中的所有内容都是数据库 备份;峰值为每秒300条tweet; 每条推特后平均126条 人物;推特ID的向量缓存;行 缓存;片段缓存;页面缓存; 保留单独的缓存;GC生成Ruby 我也这么认为 Scala;使用Thrift和HTTP 内部;100次内部请求 每个外部请求;重写MQ,但 保持接口相同;有3个队列 用于负载平衡请求; 广泛的A/B向后测试 功能;切换到C memcached 客户机速度;优化关键 路径;更快地获取缓存结果 从网络内存中删除,然后重新计算 他们在当地工作。”

嗯,“数据库只是一个备份”。可怕的东西(对于像我这样的数据库人来说)