新浪微博数据库是怎么设计的

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

从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 的,就记录下提到你的数量。


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

     

    4. 发微薄

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

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

     

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


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
数据库系统概论实验-微博系统设计 实验名称:数据库系统概论实验-微博系统设计 实验人员: 实验时间: 实验地点: 实验要求: 了解并使用微博: 参考网站: 搜狐微博 t.sohu.com、 新浪微博 weibo.com 或腾讯微博 t.qq.com 等; 根据你了解到的情况和分析, 划分微博的基本功能, 完成需求分析, 并画出业务流程图; (参 考搜索关键词:微博 数据库 设计) 基本功能: 一、 需求分析 1、 功能需求 (1) 功能描述 用户注册功能 用户注册时,需要分配给每一个用户一个独立的 ID,并且保存用户 的用户名、密码、出生日期、单位等信息。 消息管理功能 发表消息: 用户可以随时发表 140 个字左右的消息,其中可包括音乐, 图片,视频等,发布时会显示发布者、发布时间等。 评论消息:用户可对其它用户发表的消息进行评论,每条消息均会显 示评论条数与评论内容、评论时间。 删除消息:用户对自己不满意或其它原因的消息可删除。 删除评论:用户对自己不满意或其它原因的评论可删除。 转发消息: 用户可以转发关注者所发表的消息,转发后,每条消息转发 次数及转发时间均会显示。 查看消息:用户可以在当前页面查看到被自己关注者的所有消息, 按时间排序。 收藏消息: 用户可对其它用户发表的感兴趣的消息收藏,供以后查看, 每条消息下均会显示收藏次数。 用户关注功能 用户可以关注他人,同时也可以被他人关注。 创建关注组:当用户关注的人特别多时,显得有些不易于查看被关注 者发表的信息,关注组即是对众多用户关注的人进行再次分组,并添加显 示名称,可最为快捷的知道想要特别关注的一些人的最新动态。 删除关注组:即取消关注组里面人的特别关注,此处只是删除关注 组,并不会取消组里用户的关注。 添加用户:添加已关注的用户至关注组中。 删除用户:删除关注组中的用户。 用户查找功能 用户可以查找其他的用户并关注; 用户可以查找已经关注的好友; 用户可以查找自己之前发布过的消息; 用户可以查找好友发布过的消息。 (2) 功能流程图 登陆 2、 数据需求 (1)数据需求描述 消息: 消息包含消息编号, 用户编号, 发表时间, 转发次数, 评论次数组成。 评论:由消息编号,评论编号,用户编号,评论时间,评论内容组成。 用户:用户由用户编号,妮称,用户头像,邮箱,性别,密码,真实姓名, 皮肤编号,QQ,毕业院校,职位,手机号,自我介绍,用户标签,兴趣,个人 博客地址,注册时间组成。 关注组:由关注组编号,被关注组编号,关注名称,创建时间组成。 (2) 数据字典 1. 用户表: 开始 注册 消息 管理 关注 管理 查找 管理 评论 管理 转发 管理 数据项名 取值范围 数据项含义说明 用户编号 以 U 开头加 10 位数字组成 用户编号,唯一识用户的字段 用户名 任意字符 即用户在微博中显示的妮称。 密码 至少 6 个可打印字符 用户登陆所用密码 性别 男,女,保密 用户性别 自我介绍 任意可打印字符 用户一些简要的自我介绍 2、普通消息表: 数据项名 取值范围 数据项含义说明 消息编号 以 M 开头加 15 位数字组成 用户发表消息编号 用户编号 以 U 开头加 10 位数字组成 用户编号 消息内容 任意可打印字符 用户发表消息内容 发表时间 时间 用户发表消息时间 3、转发消息表: 数据项名 取值范围 数据项含义说明 消息编号 以 M 开头加 15 位数字组成 用户发表消息编号 用户编号 以 U 开头加 10 位数字组成 用户编号 转发时间 时间 用户转发消息时间 4、评论表: 数据项名 取值范围 数据项含义说明 评论编号 以 R 开头加 15 位数字组成 用户评论 消息编号 同消息编号 同消息编号 用户编号 同用户编号 同用户编号 评论时间 时间 用户发表评论时间 评论内容 任意可打印字符 用户发表评论内容 5. 关注表: 数据项名 取值范围 数据项含义说明 用户编号 同用户编号 同用户编号 被关注者编号 同用户编号 同用户编号 关注时间 时间 关注时间 (3)数据约束描述(暂无) 二、 功能流程图 登陆 三、 E—R 图 1、用户 开始 注册 消息 管理 关注 管理 查找 管理 评论 管理 转发 管理 用户 用户名 自我介绍 性别 用户编号 密码 2、消息 3、转发表 Relay 4、评论表 Commit 消息 用户编号 内容 消息编号 时间 转发消息 用户编号 消息编号 时间 5 关注表 Attention 四、 数据库设计 消息 用户编号 消息编号 评论编号 时间 时间 关注 用户编号 被关注者 编号 时间 1. 用户 user 表: 属性名称 数据类型 属性说明 备注 Uid char(11) 用户编号 主键 UName varchar(20) 用户

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值