数据库设计之三范式
范式: 对设计数据库提出的一些规范,目前有迹可寻的共有8种范式,一般遵守3范式即可。
第一范式(1NF): 强调的是列的原子性,即列不能够再分成其他几列。
这种表结构设计就没有达到 1NF,要符合 1NF 我们只需把列拆分,即:把 contact 字段拆分成 name 、tel、addr 等字段。
第二范式(2NF): 满足 1NF,另外包含两部分内容,一是表必须有一个主键;二是非主键字段 必须完全依赖于主键,而不能只依赖于主键的一部分。
1)这种表结构设计就没有达到 2NF,因为 Discount(折扣),Quantity(数量)完全依赖于主键(OrderID),而 UnitPrice单价,ProductName产品名称 只依赖于 ProductID, 所以 OrderDetail 表不符合 2NF。
2)我们可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)这样就符合第二范式了。
第三范式(3NF): 满足 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
这种表结构设计就没有达到 3NF,因为 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
我们可以把【Order】表拆分为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。
E-R模型的介绍
E-R模型即实体-关系模型,E-R模型就是描述数据库存储数据的结构模型。
E-R模型的使用场景:
1)对于大型公司开发项目,我们需要根据产品经理的设计,我们先使用建模工具, 如:power designer,db desinger等这些软件来画出实体-关系模型(E-R模型)
2)然后根据三范式设计数据库表结构
- 实体: 用矩形表示,并标注实体名称
- 属性: 用椭圆表示,并标注属性名称,
- 关系: 用菱形表示,并标注关系名称
一对一
一对多
多对多
一对一的关系:
- 关系也是一种数据,需要通过一个字段存储在表中
- 1对1关系,在表A或表B中创建一个字段,存储另一个表的主键值
一对多的关系:
1对多关系,在多的一方表(学生表)中创建一个字段,存储班级表的主键值
多对多的关系:
多对多关系,新建一张表C,这个表只有两个字段,一个用于存储A的主键值,一个用于存储B的主键值
外键SQL语句的编写
1. 外键约束作用
外键约束:对外键字段的值进行更新和插入时会和引用表中字段的数据进行验证,数据如果不合法则更新和插入会失败,保证数据的有效性
2. 对于已经存在的字段添加外键约束
-- 为cls_id字段添加外键约束
alter table students add foreign key(cls_id) references classes(id);
对已存在的表添加数据时,会检查关联表数据是否合理存在,如果不存在会报错
3. 在创建数据表时设置外键约束
-- 创建学校表
create table school(
id int not null primary key auto_increment,
name varchar(10)
);
-- 创建老师表
create table teacher(
id int not null primary key auto_increment,
name varchar(10),
s_id int not null, #创建外键字段,这个字段和school表的ID字段属性一致
foreign key(s_id) references school(id) #设置外键约束
);
4. 删除外键约束
-- 需要先获取外键约束名称,该名称系统会自动生成,可以通过查看表创建语句来获取名称
show create table teacher;
-- 获取名称之后就可以根据名称来删除外键约束
alter table teacher drop foreign key 外键名;