不懂SQL的约束和范式,怎么可能设计好表?

186 阅读2分钟

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

5 完整性约束

约束:对表中的列添加的一些限制条件。只有满足这些条件时才能数据才能插入。

5.1 实体完整性

主键不能为空

5.2 参照完整性

外键的值必须是某张表中存在的值,可以为空

5.3 用户自定义完整性

唯一性约束,某一列虽然不为主键,但是依然不能重复。

5.4 添加约束

ALTER TABLE 表名
	ADD CONSTRAINT 约束名 约束类型(列名);

例如,给users表的role列添加外键约束,引用自roles表的id列

ALTER TABLE users
	ADD CONSTRAINT uq_phone FOREIGN KEY (`role`) 
	REFERENCES `roles` (`id`);

5.5 常见约束类型

1. PRIMARY KEY: 主键 
2. CHECK:限制列中的值的范围。MySQL好像不支持
3. UNIQUE:唯一性约束
4. NOT NULL:非空约束
5. FOREIGN KEY:外键约束

6 范式

函数依赖:如果A依赖B,那么当确定A值后,B值也就确定了。 例如,在一张表中由于主键是唯一确定且不重复的。所以,当主键的值确定了,那么其他列的值也就确定了。我们便说,其他列都依赖主键。

完全函数依赖:如果B函数依赖于A,并且对于A的任何一个真子集A1,都有 B不依赖与A1,称A对B完全函数依赖。

部分函数依赖:如果B函数依赖于A,但是B不完全函数依赖于A,称B对A部分函数依赖。 例如,在一张表中,有两列,一列是用户名,而另一列里某些行里记录的是用户的id,而某些行里在这一列里记录的是用户所在部门的id,那么用户名列便部分函数依赖于id列,因为存在某些行依赖于id列的子集(记录是部门id的行)。

传递函数依赖:如果A函数依赖于B,B函数依赖于C,则称A传递函数依赖于C。

6.1 1NF(第一范式)

确保列不可分,即每一列只描述一个属性,即达到1NF

6.2 2NF(第二范式)

在1NF的基础上消除部分函数依赖即达到2NF。即每一个非主属性(非主键列)完全函数依赖于主键。 例如,可以将上面部分函数依赖的例子中的表,改成两张表,一张用户表,一张部门表,所有的用户名列都完全依赖于主键。便达到2NF。

6.3 3NF(第三范式)

在2NF的基础上消除传递函数依赖便达到3NF。即每一个非主属性(非主键列)即不部分依赖于主键,也不传递依赖于主键。