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

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

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

时间: 2024-10-14 03:01:22

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

数据库设计之外键的思考

关于是否使用外键在业界也没有统一的标准,大家争论的焦点是数据一致性和性能上. 支持使用外键方,强调如果不使用外键,数据一致性无法保证,性能消耗可以忽略. 反对使用外键方,数据一致性可以通过程序保证,性能有大问题,数据维护很麻烦,如果是大系统,整个外键的关系就像编制的一张大网.再者开发人员很难真正用好外键. 其实两种观点我都支持,现状是我基本没用过外键.没使用外键会出现什么问题呢? 1.数据一致性无法保证.出现这种情况最多的情况是,如A表示基础表,它被很多模块引用,B表是业务表,A表中删除了数据,

工作笔记 - 微博数据库设计

users表设计CREATE TABLE `users` ( `UID` int(20) NOT NULL AUTO_INCREMENT, `Username` varchar(20) DEFAULT NULL, `Password` varchar(20) DEFAULT NULL, PRIMARY KEY (`UID`)) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1; fans表设计CREATE TABLE `fans` ( `

数据库设计杂谈

注:本人开发经验尚浅,下文主要谈的是自己的一些想法,不足之处请指出. 最近半年时间都花在管理系统的开放上面,对数据库的设计有一些自己的想法,在我看来数据库设计的key point就是妥协.一个设计的比较好的数据库都是在业务逻辑.设计规约和便于开发这三者之前来回考量,从而获得3-win的结果.下面主要是在思考和总结的点. 如何设计出高灵活性的数据库 可以说在项目交付前,需求不断在变,如何在需求改变的同时尽可能减少对表结构的修改是我现在考虑的问题.对于一般情况而言,在设计的时候我们可以适当添加一些预

软考下午题详解--数据库设计

在前面的两篇博客中,小编分别对软考下午试题中的数据流图设计和uml图的相关知识点进行了详细的阐述,今天我们继续来看软考下午题中的大题部分---数据库设计,数据库的设计我们也已经早早的接触过,在第一次机房收费系统的时候我们直接用的是别人的脚本,也没有想过当时的数据库存在什么样的问题,等到个人重构机房的时候,我们需要重新设计数据库,这个时候,就不再是傻傻的导入数据库脚本文件这么简单了,我们需要从需求分析开始,自己设计数据库,什么三范式,主外键关联这都是我们需要注意的地方,可以这么说数据库设计贯穿我们

手势识别项目小组——数据库设计心得

因为我们的项目是算法类,所以项目本身的需求不太明确.设计数据库的过程其实本身也是在进一步明确需求的过程. 这是我们画出的用例图: 以下是我们小组成员的数据库设计心得: JJ: 通过本次数据库设计的过程,我经历了很多也学会了很多. 首先因为课程组的要求是设计出至少15张表,而我们想要达到15张表是很困难的.我们的设计想法是先根据我们之前设计的原型先设计出一些表,根据登陆.注册.历史记录等设计了几张表.但是这些表也基本是基于用户而设计的,后来我们也寻求了指导老师的帮助,指导老师帮忙想了一个损失函数表

数据库设计之冗余字段设计

在设计数据库时,某一字段属于一个表,但它又同时出现在另一个或多个表,且完全等同于它在其本来所属表的意义表示,那么这个字段就是一个冗余字段. --以上是我自己给出的定义 冗余字段的存在到底是好还是坏呢( 冗余是为了效率,减少join.单表查询比关联查询速度要快.某个访问频繁的字段可以冗余存放在两张表里,不用关联了. )?这是一个不好说的问题.可能在有人看来,这是一个很蹩脚的数据库设计.因为在数据库设计领域,有一个被大家奉为圭臬的数据库设计范式,这个范式理论上要求数据库设计逻辑清晰.关系明确,比如,

一个简单数据库设计例子

一个曾经做过的简单的管理系统中数据库设计的例子,包括设计表.ER图.建模.脚本. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 项目信息 Project Name:   Book Manager System DB:                MySQL5.5 DB Name:         db_library Tables: 1). tb_book

数据库设计又一个新思路

==========================================聊天记录很有价值,以下是全部聊天记录========================================= 码妖][广州]老衲(424469013) 10:09:28服务器上定义好 数据库的各个表 主键 约束 外键 视图等[码妖][广州]老衲(424469013) 10:10:07客户端 依照服务器上的样板 自动 增加 或 删除 ,各个表字段 主键 外键 视图等[码妖][广州]老衲(424469013

【一个电商网站萌发的优化思考(1)】数据库分库读写分离

1. 一个手里的小项目 最近接了一个B2C外包,据称初期用户量大概2000,并发量希望能支撑得起至少300次访问每秒.老实说,这个需求来说,用普通的架构一个好点的服务器加点优化都是卓卓有余的了..但是在重温完<淘宝技术这十年>这本书以后,心中悸动不已,幻想都够架构出一个几万乃至上十万的并发系统,但是实习的时候是做游戏前端,平时接的项目都是小项目,基本没接触过高大上的大项目,所以想对手中这个小项目进行步步优化,看看能到什么程度(当然了,后面可能换别的项目). 2. 项目简述 目前项目的基本业务功