数据库
首页 > 数据库> > 数据库设计三范式

数据库设计三范式

作者:互联网

  面向对象程序开发都是以类为基础的。实体类中的字段或属性,基本上都是与数据库表中的字段一一对应的,所以数据表设计的好坏直接关系到程序执行的效率。

这里学生类中的Age属性是可以计算出来的,Age = Now.DateTime.Year - Convert.ToDateTime(objStu.Birthday).Year;所以实体类字段不必与数据表中的字段一一对应。如果仅仅想简化表设计,在设计学生信息表时不添加年龄这一字段,数据库也采用这种类似的方式计算Age,那么势必得不偿失。

那么数据表设计的三范式是什么呢?

  1NF:必须满足原子性(字段是否还能在拆分),这是针对具体开发项目而言的。

如下图:针对具体项目中,如家庭地址——是否有明确的省份、城市区分的要求,如果没有则可用一表,否则用二表

  2NF:所有非主属性都完全依赖于主键

从编程的角度看实体类,2NF是不是特别重要。但是从节约数据库内存资源的角度看,2NF很有必要。想象一下,下图中班级名称:varchar(30)类型,每插入一个学生记录,占用的字节不大,但是如果数据有1亿条,可以算一下会吃掉多少内存。下表中班级名称重复出现,这种现象被称为数据冗余。

我们完全可以设计两张表:学生表、班级表,通过班级编号,将两张表关联在一起,减少数据冗余,节约内存资源。

  3NF:所有非主属性字段对主键不存在传递依赖,即每个属性都跟主键有直接关系而不是间接关系。

2NF和3NF联系与区别:

  相同点:通过表格拆分,减少数据冗余

  不同点:3NF被拆分下来的第二张表,某两个字段之间一定描述了一种客观事实,它们一一对应。

比如下图学生表:姓名与所在专业是直接关系、所在专业与全国专业排名也是直接关系,二者短期并不会改变,是一种客观事实(假设全国高校各类专业每20年排名一次)。因此姓名与全国专业排名也就间接联系在了一起,这样的设计就违反了3NF。再比如(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话),所在院校->院校地址,两者也是一一映射,一种事实。姓名->所在院校->院校地址,姓名和院校地址是间接联系的(别钻牛角说学校可能会迁址)。如果院校地址像股票一样随时变化,那就不存在间接关系了,这时就可以用2NF原则来拆分两表了。

 

标签:3NF,范式,院校,数据库,2NF,数据表,地址,设计,主键
来源: https://www.cnblogs.com/pandora2050/p/13728425.html