game dba眼中的范式
数据库范式是DBA必知必会的知识,但是很多半路出家的DBA确往往忽略了这部分知识。eugene面试问应聘者时,爱问int(n)、varchar(n)这里N代表的含义,如果我面试应聘者,我肯定会问范式的相关问题。
为了不难住大家,下面我以一个game dba的角度给大家简单分享下我对范式的认识。
范式简介:
范式的英文名字叫 normal from,他是美国人E.F.Codd在上世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库的理论基础。
要学习范式,我们先学习几个关于范式的术语,当然为了方便大家理解,这里只是列出了部分常用的术语,如果要完整深入的学习,请查考相关数据库书籍。
实体:任何事物都是一个实体,对于游戏数据库来说,一个玩家是一个实体,一个游戏道具是一个实体。
属性:实体具有的某个特性,比如玩家的角色名,等级,性别等,通常属性可以看做表中的一列。
元组:表中的一行就是一个元组。
码:表中可以唯一确定一个行(元组)的某个属性或者属性组叫做码。这里的码一般就是数据库表中的唯一索引,一个表中可以有多个唯一索引,这些唯一索引统称候选码,如果从多个唯一索引中选一个出来作为主键,这个主键叫做主码。
有一些基础的术语知识后,我们来了解范式:
目前关系数据库有六种范式:第一范式、第二范式、第三范式、第四范式、第五范式、第六范式。
满足范式的要求是递增的,也就是要满足第二范式,必须先满足第一范式,要满足第三范式,必须先满足第二范式.类推…
由于第四范式、第五范式、第六范式总要是用于消除冗余数据,现在的存储空间已经比较充裕,并且适当冗余存储可以提高查询的效率,所以当前的数据库设计,一般满足前三个范式即可。
第一范式、无重复的列
这个范式是关系数据库的基本要求,如果不满足,那你的表就不是关系数据库。
要求:数据库中的每一列是具有原子性,不可以拆分的。
如果某个列变成了二叉树那样,那就不是关系数据库了。
第二范式、属性
要求:所有属性完全依耐于主码,消除非候选码对主码的部分函数依耐。
通俗理解:所有属性完全依耐于主键,消除非主属性对主键的部分函数依耐。
通过一个玩家和家族关系的表来说明吧。
CREATE TABLE `family` (
`userid` varchar(34) NOT NULL DEFAULT ”,
`familyid` int(11) NOT NULL DEFAULT ’0′,
`familyname` varchar(32) DEFAULT NULL,
PRIMARY KEY (`userid`,`familyid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
userid 玩家id
familyid 家族id
familyname 家族名
现在familyname其实只应依耐familyid,对(userid,familyid)这个组合主键存在部分依耐关系。
这样的表会出现哪些问题呢?
1、系统创建一个家族,userid的值为null,可以插入吗? 不可以,插入异常了。
有人说:让userid default null,你试试看。还有人说:设定一个系统使用的userid,当然可以,但这不是我们讨论的内容。
2、当一个家族有很多人加入以后,这个家族的名字存储了很多次 数据冗余了
3、当一个家族有很多人加入以后,需要修改一下家族名字? 会修改多少条记录?更新异常了
4、当所有人退出家族后,想要保留家族的存在?可以吗? 不可以,删除异常了
如何解决这个问题?
一般这种分体通过拆表就可以了,将上面的一个表改成下面的两个表,这样问题就都解决了。
CREATE TABLE `family3` (
`userid` varchar(34) NOT NULL,
`familyid` int(11) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `family4` (
`familyid` int(11) NOT NULL DEFAULT ’0′,
`familyname` varchar(32) DEFAULT NULL,
PRIMARY KEY (`familyid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
第三范式、属性
要求:不依耐于其他非组属性,消除传递依耐。
这个咱也用刚才那个表,稍微改一下,把组合主键改成了userid为主键。
CREATE TABLE `family` (
`userid` varchar(34) NOT NULL DEFAULT ”,
`familyid` int(11) DEFAULT NULL,
`familyname` varchar(32) DEFAULT NULL,
PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
现在familyname其实只应依耐familyid,对userid这个主键存在传递依耐关系。
会出现的问题和范式二一样。解决方法也和范式二一样。
建议继续学习:
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:ISADBA 来源: MySQLOPS 数据库与运维自动化技术分享
- 标签: 范式
- 发布时间:2012-03-18 23:38:30
- [54] android 开发入门
- [53] IOS安全–浅谈关于IOS加固的几种方法
- [51] Oracle MTS模式下 进程地址与会话信
- [51] 图书馆的世界纪录
- [50] 如何拿下简短的域名
- [50] Go Reflect 性能
- [48] 读书笔记-壹百度:百度十年千倍的29条法则
- [47] 【社会化设计】自我(self)部分――欢迎区
- [40] 程序员技术练级攻略
- [31] 视觉调整-设计师 vs. 逻辑