目录
一、什么是数据库设计三范式?
1.1 第一范式
1.2 第二范式
1.3 第三范式
二、 E-R 模型
三、外键约束
3.0 外键约束的定义
3.1 外键约束的作用:
3.2 条件
3.3 外键约束的添加
3.4 外键约束的删除
数据库设计的三范式是一种范式化技术,用于规范化数据库模式。它们是数据库设计中的一些原则,旨在减少数据冗余并提高数据的一致性和品质。
三范式是逐步递增的,每个范式都在前一个范式的基础上添加一些规则。
第一范式(1NF)要求每个属性只能包含单个原子值,而不是多个值或组合值。这消除了重复的数据并确保每个属性是原子的。
该拆的就拆!
第二范式(2NF)要求满足1NF,一个表必须有一个主键!
并且非主键属性必须完全依赖于整个主键,而不仅仅是主键的一部分。这消除了部分依赖,确保数据的逻辑完整性。
第三范式(3NF)要求满足2NF,并且消除了传递依赖,即非主键属性之间不能有依赖关系。这样可以确保数据的整体一致性,并避免数据更新异常。
通过遵循这些规范,数据库设计可以更好地组织和管理数据,减少冗余和不一致性,并提高数据库的性能和可维护性。
MySQL的E-R模型是实体-关系模型,用于设计数据库的结构。
E-R代表实体-关系,其中实体表示一个具有独立身份的对象,可以是任何事物(如人员、部门、产品等),关系表示实体之间的联系。
E-R模型包括以下几个要素:
1. 实体:数据库中具有独立身份的对象,如人员、部门、产品等。
2. 属性:实体具有的特征,如人员的姓名、年龄、性别等。
3. 关系:实体之间的联系,可以是一对一、一对多、多对多等。
4. 范围:表示实体和关系的限制条件,如一个人员可以属于一个部门,一个部门可以有多个人员。
在MySQL中,E-R模型通过DDL(数据定义语言)的方式实现,常用的指令包括CREATE TABLE、ALTER TABLE和DROP TABLE等。
在设计E-R模型时,需要考虑实体和关系之间的约束条件和业务规则,以确保数据库的数据完整性和一致性。
MySQL的外键约束是一种限制,用于确保表与表之间的数据的一致性和完整性。
外键是关联两个表的字段或字段集,它在一个表中引用另一个表的主键,以保证在插入或更新表中的数据时,关联表中的数据完整、准确和一致。
1. 防止数据的不一致性:外键约束可以确保数据在表之间的一致性,避免数据在表之间不匹配或不完整的情况。
2. 维护数据完整性:外键约束可以确保插入或更新数据时,相关表中的数据完整和准确,不允许插入或更新不符合约束条件的数据。
3. 提高查询效率:外键可以提高查询的效率,因为可以在关联表之间建立索引,加快查询速度。
在MySQL中,外键约束需要满足以下两个条件:
1. 外键字段必须与目标表的主键或唯一键相匹配。
2. 外键字段必须是NOT NULL类型的。
可以使用ALTER TABLE语句来添加或删除外键约束。例如,要在表中添加一个外键约束,请使用以下语法:
ALTER TABLE 表名 ADD CONSTRAINT 外键名FOREIGN KEY (字段) REFERENCES 另一表名(字段);
示例
现在有 表 stu class
添加外键约束
mysql> alter table stu add foreign key(classID) references class(id);
Query OK, 20 rows affected (0.15 sec)
Records: 20 Duplicates: 0 Warnings: 0
mysql>
设置外键之后,添加的数据必须满足外键约束
我们再添加一个数据看一看
故意写一个不满足的验证一下
目前的班级满足条件的应该是 1 2 3 ,在此插入一个班级=100的数据
报错误:外键约束失败,所以不能添加
mysql> insert into stu(name,classID) values('rookie',100);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`base_1`.`stu`, CONSTRAINT `stu_ibfk_1` FOREIGN KEY (`classID`) REFERENCES `class` (`id`))
要删除外键约束,请使用以下语法:需要先获取外键名
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
外键名的获取:
通过查看表创建语句
show create table stu;
可以得到外键约束的名字是:stu_ibfk_1
我们删除外键,然后使用上面插入班级=100的命令试一试
mysql> alter table stu drop foreign key stu_ibfk_1;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> insert into stu(name,classID) values('rookie',100);
Query OK, 1 row affected (0.02 sec)
mysql>
成功,说明外键约束被删除了!