(转载)一个微博数据库设计带来的简单思考
2010-11-23 14:17
621 查看
一个微博数据库设计带来的简单思考
(2010年07月19日) 发表于 Java博客在微博系统中,
当前用户、关注者(也就是粉丝)、被关注者(崇拜对象)这三种角色是少不了的。他们之间看似简单的关系,但是其中数据库表将如何设计,却让我很难琢磨,在如下解决方案中,
你们会选择哪种 ? 为什么要选择这种 ? 是否有更好的解决方案 ?
解决方案一:
表名 | 用户信息表 | ||
字段名 | 字段代码 | 字段类型 | 描述 |
用户名 | User_id | Varchar(20) | 主键 |
登陆密码 | Password | Varchar(20) | |
…… | …… | …… | |
表名 | 关注和被关注者表 | ||
字段名 | 字段代码 | 字段类型 | 描述 |
用户名 | User_id | Varchar(20) | 主键 |
关注者 | Funs | Text | |
被关注者 | Wasfuns | Text |
,那么存入数据库关注者字段的数据将是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) |
个关注者,那么该用户就会在关注者表中存在一万条他的记录,这难道不是严重的数据冗余吗?这甚至不符合数据库的设计规范。但是事实上证明,这种设计对大数据量的扩展是很不错的,既然如此,
那假如用户和用户之间的关系不只是限于关注和被关注的关系,是不是又要新增表?
解决方案三:
话说“合久必分,分久必合”,对上述的设计再进一步修改,于是将方案二的两张表又合二为一,如下:
表名 | 关注和被关注者表 | ||
字段名 | 字段代码 | 字段类型 | 描述 |
编号 | Id | Int | 主键 |
用户名 | User_id | Varchar(20) | |
目标对象 | Operate_object | Varchar(20) | |
状态 | Status | Number | 当目标对象为关注者,标示为1; 当目标对象为被关注者,标示为2; 当双方互相关注,标示为3; 当目标对象为OO,标示为XX。 |
,这样的设计不仅解决了相当一部分的数据冗余,而且还能表示用户之间的多种关系,方便系统日后的扩展。但是问题又出来了,很明显这样设计对状态的维护也是存在疑问的,用一张表代替多张表,数据肯定是成倍的增长,是否不符合当前常说的“拆库拆表”的战略方针(好像这样的状态一般用于“标记男女”或者“是否删除了”之类的,貌似用于这种场合比较的少)。
在上述用户关系的解决方案中,可以很简单的归结为就是一对多,多对一,多对多的关系嘛,那么究竟如何设计,究竟哪种更好,我很难理解,期待大家拍砖!
转载地址:http://itnewsvendor.appspot.com/2004008-%E4%B8%80%E4%B8%AA_%E6%95%B0%E6%8D%AE%E5%BA%93_%E8%AE%BE%E8%AE%A1.html
相关文章推荐
- 一个微博数据库设计带来的简单思考
- 一个微博数据库设计带来的简单思考
- 一个微博数据库设计带来的简单思考
- 一个简单的实现不同权限的用户登录后看到不同的菜单设计的数据库表清单
- 一个简单的实现不同权限的用户登录后看到不同的菜单设计的数据库表清单
- 一个简单的酒店系统的数据库设计
- 一个简单数据库设计例子
- 树状数据库设计方案思考(原创,如需转载请标明出处)
- 一个简单的酒店系统的数据库设计
- 设计模式4思考——对于一个简单"流程"的设计思考
- (转)一个简单的酒店系统的数据库设计
- 一个简单的酒店系统的数据库设计
- 由一个简单的客户端间TCP/UDP通信程序引发的关于设计模式的思考
- 简单设计一个 Java 数据库工具类(第一版,以废弃)
- 一个简单的微博后台设计
- python实现一个简单的图书馆借阅系统(不涉及数据库和界面设计)
- 一个简单的实现不同权限的用户登录后看到不同的菜单设计的数据库表清单
- Yii2.0 对数据库 查询的一些简单的操作(转载)
- C++设计一个简单的壳(1)
- os开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局