欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库mysql表设计的三大规范

程序员文章站 2022-05-08 11:20:51
...

a  所有字段值都是不可分解的原子值

b  也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中

c   数据表中的每一列数据都和主键直接相关,而不能间接相关

1.第一范式(确保每列保持原子性)(一个字段一个值)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。

数据库mysql表设计的三大规范

上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。

         

2.第二范式(确保表中的每列都和主键相关)

不存在部分函数依赖,两个字段做联合主键,其中任何一个关键字都是候选关键字

    M:N 多对对的关系 设计至少需要三张表
 

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

比如要设计一个学生成绩表

方案一:

学号 籍贯 专业班级 联系方式 课程名称 学分 成绩

不符合第二范式

学号 和 课程名 必须作为联合主键,这样才能决定这张表

方案二:

学生信息表:

学号 籍贯 专业班级 联系方式 

课程表:

课程号 课程名 学分

成绩表:

学号 课程号 成绩    

3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。

数据库mysql表设计的三大规范

这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。

 

create table hr_dep(depId int primary key,
	depname varchar(50) not null,
	address varchar(50));


create table hr_emp(empId int primary key,
	empname varchar(50),
	tel varchar(50),
	depId int,
	foreign key(depId) references hr_dep(depId));

首先,外键引用的那个列在主表中必须是主键列或者唯一列。
1:n的肯定把外键建立在n的那张表上。
1:1,一般要看谁是主表,谁是附属表,外键当然建立在附属表中。
n:m的情况,需要建立一个关系表,两个原表和其关系分别是1:n,1:m