数据库范式通俗的描述
那些数据库的书介绍的数据库范式,实在是晦涩难懂,我在这里给出一个通俗的描述:
1NF:一个table中的列是不可再分的(即列的原子性)
2NF:一个table中的行是可以唯一标示的,(即table中的行是不可以有重复的)
3NF:一个table中列不依赖以另一个table中的非主键的列,还是不通俗!巨寒!!
举个例子吧:有一个部门的table,我们叫它tbl_department, 它有这么几列(dept_id(pk),dept_name,dept_memo...) 有一个员工table,我们叫它tbl_employee,在这个table中有一列dept_id(fk)描述关于部门的信息,若tbl_employee要满足3NF,则在tbl_employee中就不得再有除dept_id列的其它有关部门信息的列!
一般数据库的设计满足3NF即可!(个人觉得应该尽可能的满足3NF,一家之言^_^)
BCNF:通常认为BCNF是修正的第三范式,它比3NF又进一步!
4NF:
5NF:将一个table尽可能的分割成小的块,以排除在table中所有冗余的数据
==============================
解释1道数据库规范化/范式的例题?
比如解释例题:有属性SNO(学生号),SNAM(学生姓名),DON(系) MAN(系主任),舍关系R的主键为SNO,则R为1NF\2NF\3NF?
答案是2NF
为什么?
学号是主属性,姓名可以直接被学号给确定,学号可以确定学生所在的系,而系主任不是由主属性学号来确定的,是由系名来确定的,所以问题就在系主任上,在这个关系里学号和系主任之间不是直接确定的而是间接确定的,这就叫非主属性对主属性存在传递函数依赖,所以是2范式,1范式是把两个或几个事在一个关系里说,这个就是稍微好点,可以根据主码确定一个非主属性,还是间接的,所以是第2范式.
因为只要知道姓名就可以查到系,查到班主任,所以姓名并不是只和学生号产生关系。
这是不符合第三范式的。你去仔细研读一下第三范式的定义就能够想通了
其实这种现象就被称为冗余,而且属于复式冗余,因为班主任甚至还和系有关系。
因为只要知道姓名就可以查到系,查到班主任,所以姓名并不是只和学生号产生关系。
这是不符合第三范式的。你去仔细研读一下第三范式的定义就能够想通了
其实这种现象就被称为冗余,而且属于复式冗余,因为班主任甚至还和系有关系。
============================
数据库的规范化,1\2\3范式怎么理解?
所谓1NF,2NF,3NF,各举例说明下吧,让我能理解....
1NF:字段具有原子性,不可再分;
比如说籍贯这个字段,里面是“湖北武汉”的话,它就违反了原子性,因为湖北武汉还可以再分的更具体,分为“湖北”和“武汉”
2NF:组合关键字的表,不存在组合关键字中的任意字段决定其它非关键字段的情部(也就是说不能有两个组合键组成一个主键)
3NF:在2NF的基础上,数据表中如果不存在非关键字段对任一候选字段的传递函数依赖则符合第三范式(也就是说违反了数据冗余)
帐号 身份证号 姓名 密码
1001 410101001 李梅 100001
身份证号和姓名共同决定了密码,姓名是依赖于身份证号的,这样就违反了第三范式
典型的网络结构莫过于MVC结构了,即视图层-模型层-控制层,视图层负责展示页面,就是平时我们上网看到的页面;控制层负责逻辑控制,就是控制我们点击一个链接或点击一个按钮之后,页面要执行什么操作、怎么跳转;业务层就是你所要执行的操作,比如说增、删、改、查询数据,这些操作都是由业务层来完成的。一个好的网络结构一般业务层分为业务层、VO层和数据持久层,业务层负责完成逻辑操作,VO层负责存储数据对象,数据持久层负责数据库操作。所以,页面的数据要经过视图层——〉控制层——〉模型层——〉VO层——〉数据持久层——〉数据库,这样一个流程,数据是一层一层的传递的,不应该跨层操作。
PS:我所说的是一个典型的网站结构,实际上任何一层都可以对数据库进行操作,但是不建议这样做,因为这样做会使层次模糊,不便于模糊与操作