`
chbaowang
  • 浏览: 20735 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

新浪微博数据库是如何设计的

 
阅读更多

转自: http://blog.sina.com.cn/s/blog_7eb42b5a0100wygl.html

 

 

我从4个层面上面来说,
1. Database,其实 @mysqlops 回答就是微薄最基本的数据库方式,我在上面做一下扩展。

  • 微薄内容表A:tid uid src_tid content timeline,其中 tid 是微薄的 ID (自增量),src_tid[1]为转发的源 tid 。
  • 话题表B:kid title lastupdatime total,total是话题总数,kid 是话题的ID (自增量)
  • 话题关联表C:id tid kid,id无意义
  • @用户关联表D:id uid tid,这里的uid是指被提及人的uid,id无意义
  • 收听用户关联表E:id uid follow_uid

上面的 timeline、lastupdatime 均为“发帖时间”,其中timeline是永久不变的字段, lastupdatime 为“该话题最后发帖时间”,属于冗余字段,等同于 SELECT TOP 1 timeline FROM A INNER JOIN C ON C.tid = A.tid WHERE C.kid = #话题id# ORDER BY A.timeline DESC。

[1] src_tid 为何可以这样设计的原因请阅读 "4.发微薄"

SQL:

  • follow 用户列表:SELECT follow_uid FROM E WHERE uid = 102
  • 微薄首页微薄列表:SELECT content,(SELECT content FROM A AS a2 WHERE a2.tid = a1.src_tid AND a1.src_tid > 0) AS src_content FROM A AS a1 WHERE uid IN (SELECT follow_uid FROM E WHERE uid = 102) ORDER BY timeline DESC
  • 某 #话题# 列表:SELECT A.content,(SELECT content FROM A AS a2 WHERE a2.tid = a1.src_tid AND a1.src_tid > 0) AS src_content FROM A AS a1 INNER JOIN C ON C.tid=A.tid WHERE C.kid=#话题id# ORDE BY A.timeline DESC
  • @我 的列表:SELECT A.content,(SELECT content FROM A AS a2 WHERE a2.tid = a1.src_tid AND a1.src_tid > 0) AS src_content FROM A AS a1 INNER JOIN D ON D.tid=A.tid WHERE D.uid=102 ORDE BY A.timeline DESC
  • 转播列表:SELECT content,uid FROM A WHERE src_tid = 源tid ORDE BY A.timeline DESC



2. Cache主要在cache层是最麻烦的,这需要很多主机和很多分布内存,主要以 hashmap 方式存储(memcache)。hashmap 查询时间会比较稳定。

  • cache1,用户最后更新时间 Cache:uid 为 key,timeline[1] 和"帖子列表"[2]为value。
  • cache2,话题最后更新时间 Cache:kid 为 key,lastupdatime[3] 和"帖子列表"[2]为 value。
  • cache3,@用户最后更新时间 Cache:uid为key,timeline[4] 和"帖子列表"[2]为value。
  • cache4,微薄内容表:tid 为 key,timeline[1] 和 content 和 src_tid[5] 为value



[1] 这里的 timeline 均为 “微薄内容表A” 中的 timeline
[2] 与该 cache 相关的最后N条微薄内容:array(tid,timeline),如果有可能的话,可以指向 cache4 中的地址。
[3] 这里的 lastupdatime 为 “话题表B” 中的 lastupdatime 
[4] 这里的 timeline 为 SELECT A.timeline FROM D INNER JOIN A ON a.tid = b.tid
[5] src_tid 可以直接指向 cache4 中对于的内存地址

3.前台页面打开后

首页、话题页面第一次打开:

  • 请参见上面的SQL,换算成Cache也不难
  • 页面前台 < script > 记录SQL返回的第一条微薄的时间 t1。(SELECT TOP 1 ... ORDER BY DESC)



微薄首页Ajax请求:     post你的 t1,和 uid

  • 更新多少条:获取你收听用户的 my_follow_uid_list,循环 my_follow _uid 查询 cache1 ,如果timeline > t1,就根据 my_follow _uid 去读取 cache4 的内容和数量。
  • 提到你的:如果 cache3 的内容 timeline > t1 的,就记录下提到你的数量。



话题页面Ajax请求:      post你的 t1 和话题 kid

  • 更新多少条:查找 cache2 中 kid 的最后更新时间,如果 lastupdatime > t1 则去读取 cache4 的内容和数量。



然后更改前台最后微薄的时间t1为最后一条微薄的时间

4. 发微薄

  • submit;
  • 通过正则分析出 #话题# 和 @人 的内容;
  • 提交到对应的数据库:添加“微薄内容”到表A添加 #话题# 关联到 表C,如果该话题不存在,要先在 表B 中 INSERT更新 #话题# lastupdatime添加 @人 到 表D
  • 更新对应的cache。

转播他人话题,实际上也是先分析你撰写的转播内容中的 #话题# 和 @人
唯一是多一个 src_tid 提交

====================================
我这是最基本的数据结构,中间存在很多值得优化的地方。
楼主特别提出了关注1万人,我记得国内微薄收听有限制吧。如果收听人数过多,查询肯定会慢,不过优化 cache1 就能应对,方法比如拆分、存址都可以。
Cache 的话一般选择分布式,就是给机器编号,每个电脑存储不同uid块

 
 
分享到:
评论

相关推荐

    仿新浪微博数据库+存储过程+asp.net 源码

    仿新浪微博 数据库 存储过程 asp.net 源码GridView 这我写的一个项目,现在把源码写出和大家一起分享一下 我的QQ:979170768想结交更多的软件开发好友,和芯片,嵌入式开发好友,一起学习进步

    新浪微博数据库资源调度平台架构实践.pdf

    《新浪微博数据库资源调度平台架构实践》 在当今互联网时代,大数据处理和高可用性服务已成为企业核心竞争力的重要组成部分。新浪微博作为中国领先的社交媒体平台,其数据库资源调度平台的构建与优化对于支撑公司...

    新浪微博数据库资源调度平台架构实践.pptx

    《新浪微博数据库资源调度平台架构实践》的分享展示了微博在应对海量数据库管理挑战时所采取的创新解决方案。这个名为“Shanks”的平台,以其在漫画《海贼王》中的角色命名,体现了其作为数据库资源调度的核心角色,...

    微博数据库设计

    一套完整的微博数据库设计,仿新浪微博数据库设计,包括Users用户注册信息表,Userinfo 用户详细信息表,Relation 用户关系表,Messages 微博表,Atusers被at用户表,Collections 微博收藏表,Privateletter 私信表...

    新浪微博、腾讯微博:mysql数据库主表设计猜想.doc

    新浪微博、腾讯微博:mysql数据库主表设计猜想

    仿新浪微博php程序xweibo

    新浪微博类应用涉及到大量的用户数据存储和检索,XWeibo可能会使用MySQL或其他关系型数据库系统,进行用户注册、登录、发布动态等操作。这需要开发者熟悉SQL语言,以及PHP与数据库的交互方式,如PDO或mysqli扩展。 ...

    新浪微博代码分享

    在本文中,我们将深入探讨如何实现“新浪微博代码分享”这一功能。这个项目是基于对新浪微博功能的模拟,旨在提供一个类似平台,用户可以在这里分享他们的想法、上传图片,并与他人互动。通过分析“JustShare”这个...

    Android新浪微博完整例子

    在Android平台上,开发一款完整的新浪微博应用涉及到多个技术层面和组件的整合。首先,我们要了解Android的基本架构和开发环境,这通常包括使用Android Studio作为集成开发环境(IDE),以及熟悉Java或Kotlin作为...

    新浪微博爬虫,用python爬取新浪微博数据.zip

    【标题】:“新浪微博爬虫,用python爬取新浪微博数据” 【描述】:“此项目是关于如何使用Python编程语言构建一个爬虫,以抓取并分析新浪微博上的数据。爬虫技术在大数据时代对于获取社交媒体信息、进行网络数据...

    新浪微博客户端 android平台新浪微博客户端

    【标题】:“新浪微博客户端 android平台新浪微博客户端” 这个标题指出我们关注的是新浪微博的Android版客户端应用。新浪微博是中国一个非常流行的社交媒体平台,它允许用户发布、分享和互动内容,类似于Twitter。...

    新浪微博架构和FEED架构分析--人人架构1

    总结来说,新浪微博的架构设计经历了从快速原型到应对大规模用户的过程,涉及了推送模式优化、数据库拆分和索引策略的调整,以及系统的模块化和异步化处理。这些经验对于理解大规模社交网络的架构设计具有重要的参考...

    新浪微博客户端的设计与实现.docx

    总的来说,新浪微博客户端的设计与实现涵盖了移动应用开发的多个关键领域,包括Android SDK的使用、网络编程、UI设计、数据库管理、数据同步以及安全性设计。通过综合运用这些技术,可以构建出一款既满足用户需求又...

    Android 新浪微博客户端

    Android 新浪微博客户端是一款专为Android操作系统设计的应用程序,它允许用户在移动设备上轻松访问和交互微博平台。这款客户端集成了新浪微博的核心功能,包括发布和阅读微博、查看图片、观看视频、参与话题讨论、...

    新浪微博安卓客户端课程设计报告.pdf

    - **数据库设计**:存储授权用户的身份信息,支持快速登录。 - **用户界面**:包括首页、消息、更多、发现和个人中心等模块,实现微博浏览、发布、转发、点赞、评论、收藏等功能。 - **信息获取**:登录用户可以...

    基于Python的新浪微博爬虫程序设计与实现.docx

    本文主要探讨了基于Python的新浪微博爬虫程序的设计与实现,旨在为专科和本科毕业生提供一篇原创的、已降重的毕业论文参考资料。论文涵盖了数据挖掘和网络爬虫的基础知识,特别是利用Python语言和Django框架进行开发...

    仿新浪微博的网站源码

    1. **网站架构**:仿新浪微博的网站源码通常会采用三层架构设计,包括表现层(前端)、业务逻辑层(中间件)和数据访问层(数据库)。在这个项目中,我们可以看到不同的文件夹如"Weibo.Web"、"Weibo.Business"和...

    沈大海 android 新浪微博2.0代码

    新浪微博2.0的界面设计遵循Material Design原则,利用Android的布局管理器如LinearLayout、RelativeLayout和ConstraintLayout构建复杂界面。此外,自定义View和Adapter的应用也是提升用户体验的关键。 3. 数据库...

    基于ThinkPHP框架下的新浪微博用户同步登陆代码

    在这个场景下,我们关注的是一个基于ThinkPHP框架实现的新浪微博用户同步登录功能的代码实例。这个功能允许用户使用他们的新浪微博账号直接登录到你的网站,为用户提供便利,同时也可以帮助开发者吸引并保留更多用户...

    新浪微博自动推广专家

    【标题】:“新浪微博自动推广专家”是一个专门针对新浪微博平台设计的自动化推广工具,旨在帮助用户高效、便捷地进行微博营销活动。它集成了多种功能,包括自动发布、定时任务、内容定制、互动管理等,旨在提升用户...

Global site tag (gtag.js) - Google Analytics