数据库mysql表设计的三大规范
a 所有字段值都是不可分解的原子值
b 也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
c 数据表中的每一列数据都和主键直接相关,而不能间接相关
1.第一范式(确保每列保持原子性)(一个字段一个值)
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。
上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。
2.第二范式(确保表中的每列都和主键相关)
不存在部分函数依赖,两个字段做联合主键,其中任何一个关键字都是候选关键字
M:N 多对对的关系 设计至少需要三张表
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个学生成绩表
方案一:
学号 籍贯 专业班级 联系方式 课程名称 学分 成绩
不符合第二范式
学号 和 课程名 必须作为联合主键,这样才能决定这张表
方案二:
学生信息表:
学号 籍贯 专业班级 联系方式
课程表:
课程号 课程名 学分
成绩表:
学号 课程号 成绩
3.第三范式(确保每列都和主键列直接相关,而不是间接相关)
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。
这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。
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
下一篇: ORACLE创建表空间