一个微博数据库设计带来的简单思考

简介: http://www.blogjava.net/kalman03/archive/2010/07/19/326558.html     在微博系统中,当前用户、关注者(也就是粉丝)、被关注者(崇拜对象)这三种角色是少不了的。

  http://www.blogjava.net/kalman03/archive/2010/07/19/326558.html  

 

在微博系统中,当前用户、关注者(也就是粉丝)、被关注者(崇拜对象)这三种角色是少不了的。他们之间看似简单的关系,但是其中数据库表将如何设计,却让我很难琢磨,在如下解决方案中,你们会选择哪种?为什么要选择这种?是否有更好的解决方案?

解决方案一:

表名

用户信息表

字段名

字段代码

字段类型

描述

用户名

User_id

Varchar(20)

主键

登陆密码

Password

Varchar(20)

 

……

……

……

 
       

表名

关注和被关注者表

字段名

字段代码

字段类型

描述

用户名

User_id

Varchar(20)

主键

关注者

Funs

Text

 

被关注者

Wasfuns

Text

 

    这是我最初想到的一种设计,这里“关注者”和“被关注者”都是采用拼接一些特殊字符分割存储的,比如A用户有只有关注者B、C、D、E,那么存入数据库关注者字段的数据将是B;C;D;E(暂且认为分割字符为;)。

基于上述方案,我提出一个问题:当这个用户的“关注者”或“被关注者”数量很大的情况下(比如10万个关注者)将是怎样的一串字符呢?而且当我们需要查询“关注者”或者“被关注者”最近的博客信息,将面临和博文信息表的一些时间排序查询,处理难度是要浪费性能的。

解决方案二:

    基于上述面临的问题,有人给我提供了一个扩展性的解决方案,同时也很好的解决了一个字段海量数据的问题。将方案一中的关注和被关注者表分解成两张表,如下:

表名

关注者表

字段名

字段代码

字段类型

描述

编号

Id

Number

主键

用户名

User_id

Varchar(20)

 

关注者编号

Funs_id

Varchar(20)

 

表名

被关注者表

字段名

字段代码

字段类型

描述

编号

Id

Number

主键

用户名

User_id

Varchar(20)

 

被关注者编号

Wasfuns_id

Varchar(20)

 

我看到这样的设计我很吃惊,试想一下,假如我一个用户对应有1W个关注者,那么该用户就会在关注者表中存在一万条他的记录,这难道不是严重的数据冗余吗?这甚至不符合数据库的设计规范。但是事实上证明,这种设计对大数据量的扩展是很不错的,既然如此,那假如用户和用户之间的关系不只是限于关注和被关注的关系,是不是又要新增表?

解决方案三:

         话说“合久必分,分久必合”,对上述的设计再进一步修改,于是将方案二的两张表又合二为一,如下:

表名

关注和被关注者表

字段名

字段代码

字段类型

描述

编号

Id

Int

主键

用户名

User_id

Varchar(20)

 

目标对象

Operate_object

Varchar(20)

 

状态

Status

Number

当目标对象为关注者,标示为1;

当目标对象为被关注者,标示为2;

当双方互相关注,标示为3;

当目标对象为OO,标示为XX。

OK,这样的设计不仅解决了相当一部分的数据冗余,而且还能表示用户之间的多种关系,方便系统日后的扩展。但是问题又出来了,很明显这样设计对状态的维护也是存在疑问的,用一张表代替多张表,数据肯定是成倍的增长,是否不符合当前常说的“拆库拆表”的战略方针(好像这样的状态一般用于“标记男女”或者“是否删除了”之类的,貌似用于这种场合比较的少)。

在上述用户关系的解决方案中,可以很简单的归结为就是一对多,多对一,多对多的关系嘛,那么究竟如何设计,究竟哪种更好,我很难理解,期待大家拍砖!

如何联系我:【万里虎】www.bravetiger.cn 【QQ】3396726884 (咨询问题100元起,帮助解决问题500元起) 【博客】http://www.cnblogs.com/kenshinobiy/
目录
相关文章
|
缓存 运维 关系型数据库
微博热点事件背后数据库运维的“功守道”
微博拥有超过3.76亿月活用户,是当前社会热点事件传播的主要平台。而热点事件往往具有不可预测性和突发性,较短时间内可能带来流量的翻倍增长,甚至更大。如何快速应对突发流量的冲击,确保线上服务的稳定性,对于提供全微博数据托管的服务部门数据库团队来说既是机遇又是挑战。
1882 0
|
SQL 关系型数据库 测试技术
三体PCC大赛题目 - facebook\微博 like场景 数据库设计与性能压测
标签 PostgreSQL , pipelinedb , facebook , 微博 , 流式统计 背景 高可用架构的一个PCC大赛,看了一下比赛规则,发现PostgreSQL很适合做这个场景,原样复刻,使用PG实现以及性能表现到底如何? 比赛内容介绍如下 https://github.
3775 0
|
存储 数据库 数据格式
微博中的图片存储的数据库设计(原创)
Q:  和大家讨论一个图片存储的问题:图片地址= 存储服务器的URL + 文件名;,我现在的一个类似微博的表里面我用image_ids字段来存储多个图片ID,问题来了,存储服务器的URL,是也加一个新字段来存储URL吗(这样貌似会冗余很多,因为都是一样的地址URL),还是我在后台中定义一个全局的图...
1108 0
|
3天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
48 15
|
4天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
8天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
16天前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
28天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
35 1

热门文章

最新文章