技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> MySQL --> game dba眼中的范式

game dba眼中的范式

浏览:2249次  出处信息

    数据库范式是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这个主键存在传递依耐关系。

     会出现的问题和范式二一样。解决方法也和范式二一样。

建议继续学习:

  1. 数据库设计范式的理解    (阅读:1957)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1