数据库设计的三范式

表的范式,是首先符合1NF,才能满足2NF,进一步满足3NF。

为了建立冗余较小,结构合理的数据库,设计数据库时必须遵循一定的规则,在关系性数据库中这种规则就称为范式。

范式是符合某一种设计要求的总结,要想设计一个结构合理的关系型数据库,必须满足一定的范式。

数据在数据库中会占用大量空间,为了节省空间,同时也为了让数据更安全合理,在设计表时要用三范式来规范一下。

在实际开发中最为常见的设计范式:

1. 第一范式(1NF):

字段不可再拆分,每个字段都是不可分解的原子级别的,不能说把id,姓名,班级等都塞在一个字段中,这是不合适的,对以后的应用会造成很大影响。

例:

编号姓名联系方式
1张三15388888888 1732055555

上表不符合第一范式,联系方式列中有两个信息,一个是电话号码一个是QQ号,可以将上表更改为:

编号姓名电话号QQ号
1张三153888888881732055555

2. 第二范式(2NF):

表中要有主键,非主键字段依赖主键(保证表中的记录是唯一的)

例:

姓名性别地址
张三尖草坪
张三尖草坪
李四小店
李四小店

上表中张三和李四两条记录可能输入重复,也可能是现实中就是两个人,只是信息巧合,让人分辨不清楚,可以将上表更改为:

编号姓名性别地址
1张三尖草坪
2张三尖草坪
3李四小店
4李四小店

3. 第三范式(3NF):

表中不能有别的表的非主键列,表中不要有冗余数据,即表中的信息如果能够被推导出来,就不应该单独的设计一个字段来存放,第三范式需要确保数据表中的每一列数据都和主键直接相关,不能间接相关。

例:

stu表:

idnameaddressclassIdclassNamedepart
001张三山西省101一班计算机系
001李四河北省101一班计算机系
001李四山西省101二班计算机系

class表:

classIdclassNamedepart
101一班计算机系
101一班计算机系
201二班计算机系

上两表中stu表包含class表中的classId、className、depart三列数据,但是className、depart两列数据可以通过classId来推导出来,那么这两列数据在stu表中就多余了,可以更改为:

stu表:

idnameaddressclassId
001张三山西省101
001李四河北省101
001李四山西省101

4. 反3NF:

但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

posted @ 2021-01-13 11:14  逍遥客灬  阅读(537)  评论(0编辑  收藏  举报