数据库设计之三范式
范式
:对设计数据库
提出的一些规范
,目前有迹可循的共有8中范式,一般遵循3范式即可。
第一范式(1NF)
:强调的是列的原子性
,即列不能够再分为其他几列。
第二范式(2NF)
:满足1NF,另外包含两部分内容,一是:表必须有一个主键
;二是:非主键字段必须完全依赖于主键
,而不能只依赖于主键的一部分。
第三范式(3NF)
:满足2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖
。即不能存在:非主键A依赖于非主键B,非主键B依赖于主键的情况。
以下表结构设计没有达到1NF,要符合1NF我们只需把列拆分,即把contact字段拆分为name,tel,addr等字段
第一范式示例
这种表结构设计没有达到2NF,因为折扣Discount,数量Quantity完全依赖于主键OrderID,而UnitPrice单价,ProductName产品名称 只依赖于ProductID,所以OrderDetail表不符合2NF;
可以把【OrderDetail】
表拆分为【OrderDetail】
(OrderID,ProductID,Discount,Quantity) 和【Product】
(ProductID,UnitPrice,ProductName)这样就符合第二范式。第二范式示例
这种表结构设计没达到3NF,但是符合2NF,因为非主键都完全依赖于主键(OrderID),不过问题是CustomerName,CustomerAddr,CustomerCity直接依赖的是CustomerID(非主键),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合3NF。
可以把【Order】
表拆分为【Order】
(OrderID,OrderDate,CustomerID)和【Customer】
(CustomerID,CustomerName,CustomeAddr,CustomerCity)从而达到3NF第三范式示例
E-R模型
对于大型公司开发项目,需要根据产品经理的设计,先使用建模工具,如power designer 等软件来画出实体-关系模型(E-R模型)
![]()
实体
:用矩形
表示,并标注实体名称
属性
:用椭圆
表示,并标注属性名称
关系
:用菱形
表示,并标注关系名称
关系分以下三种:
一对一
:
一对多
:
多对多
:



外键约束
外键约束作用
对外键字段的值进行更新和插入时会和引入表中字段的数据进行验证,数据如果不合法则更新和插入会失败,保证数据的有效性
对已经存在的字段添加外键约束
--- 为cls_id字段添加外键约束(添加之后,如果students表插入或更新的数据,对于的cls_id在班classes表中的id找不到,那么就会插入或更新数据失败)
alter table students and foregin key(cls_id) references classes(id);
在创建数据表时设置外键约束
/// 创建学校表
create table school(
id int unsigned not null primary key auto_increment,
name varchar(30) not null
);
/// 创建老师表
create table teacher (
id int unsigned not null primary key auto_increment,
name varchar(30) not null,
s_id int unsigned not null,
foreign key(id) references school(id)
);
删除外键约束
// 需要先获取外键约束名称,该名称系统自动生成,可以通过查看列表创建语句来获取名称
show create table teacher;
// 获取名称之后可以根据名称来删除外键约束
alter table teacher drop foreign key 外键命;
网友评论