软件测试——数据库|MySQL学习(二)——建表约束与范式

1 建表约束

  • 主键约束
使某个字段不重复且不得为空,确保表内所有数据的唯一性。
CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(20) );

  • 联合主键
联合主键中的每个字段都不能为空,并且加起来不能和已设置的联合主键重复。
CREATE TABLE user ( id INT, name VARCHAR(20), password VARCHAR(20), PRIMARY KEY(id, name) );

  • 自增约束
自增约束的主键由系统自动递增分配。
CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) );

  • 添加主键约束
忘记设置主键,还可以通过SQL语句设置(两种方式):
ALTER TABLE user ADD PRIMARY KEY(id); ALTER TABLE user MODIFY id INT PRIMARY KEY;

  • 删除主键
ALTER TABLE user drop PRIMARY KEY;

  • 非空约束
约束某个字段不能为空
CREATE TABLE user ( id INT, name VARCHAR(20) NOT NULL );

  • 移除非空约束
ALTER TABLE user MODIFY name VARCHAR(20);

  • 默认约束
CREATE TABLE user2 ( id INT, name VARCHAR(20), age INT DEFAULT 10 );

  • 外键约束
```mysql -- 班级 CREATE TABLE classes ( id INT PRIMARY KEY, name VARCHAR(20) ); -- 学生表 CREATE TABLE students ( id INT PRIMARY KEY, name VARCHAR(20), -- 这里的 class_id 要和 classes 中的 id 字段相关联 class_id INT, -- 表示 class_id 的值必须来自于 classes 中的 id 字段值 FOREIGN KEY(class_id) REFERENCES classes(id) ); -- 1. 主表(父表)classes 中没有的数据值,在副表(子表)students 中,是不可以使用的; -- 2. 主表中的记录被副表引用时,主表不可以被删除。 ```

2 数据库的三大设计范式 2.1 范式 【软件测试——数据库|MySQL学习(二)——建表约束与范式】设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
2.2 数据库中一些基本概念
对象object,也称为实体型。在现实世界中具有相同性质、遵循相同规则的一类事物的抽象称为对象。对象是实体集数据化的结果,比如学生、老师、课程等是对象。实例instance 是指对象中的每一个具体的事物,例如学生张三、李四。属性attribute 是实体的某一方面特征的抽象表示,例如学生的姓名、性别、班级、年龄等。主码primary key 能够唯一标识一个实体。次码secondary key 指实体中不能唯一标识实体的属性。域domain 指属性的取值范围,比如性别中的男、女。完整性 指存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。

2.3 范式 2.3.1第一范式
当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
  • 每一列属性都是不可再分的属性值,确保每一列的原子性
  • 两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据。
如果学生成绩表中的一列属性是成绩,而成绩这一列还包含了语文、数学、英语等等小属性,这这张表不满足第一范式

2.3.2 第二范式
如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
关系模式必须满足第一范式,并且所有非主属性都完全依赖于主码。注意,符合第二范式的关系模型可能还存在数据冗余、更新异常等问题。
```mysql -- 订单表 CREATE TABLE myorder ( product_id INT, customer_id INT, product_name VARCHAR(20), customer_name VARCHAR(20), PRIMARY KEY (product_id, customer_id) ); ```

`product_name` 只依赖于 `product_id` ,`customer_name` 只依赖于 `customer_id` 。也就是说,`product_name` 和 `customer_id` 是没用关系的,`customer_name` 和 `product_id` 也是没有关系的。
这就不满足第二范式:其他列都必须完全依赖于主键列,所以需要对表进行拆分
```mysql CREATE TABLE myorder ( order_id INT PRIMARY KEY, product_id INT, customer_id INT ); CREATE TABLE product ( id INT PRIMARY KEY, name VARCHAR(20) ); CREATE TABLE customer ( id INT PRIMARY KEY, name VARCHAR(20) ); ```

拆分之后,`myorder` 表中的 `product_id` 和 `customer_id` 完全依赖于 `order_id` 主键,而 `product` 和 `customer` 表中的其他字段又完全依赖于主键。满足了第二范式的设计.

2.3.3 第三范式
设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
关系模型满足第二范式,所有非主属性对任何候选关键字都不存在传递依赖。即每个属性都跟主键有直接关系而不是间接关系,像:a-->b-->c。一般数据库设计中,一般要求达到3NF,第四第五较少涉及。
```mysql CREATE TABLE myorder ( order_id INT PRIMARY KEY, product_id INT, customer_id INT, customer_phone VARCHAR(15) ); ```

表中的 `customer_phone` 有可能依赖于 `order_id` 、 `customer_id` 两列,也就不满足了第三范式的设计:其他列之间不能有传递依赖关系。
```mysql CREATE TABLE myorder ( order_id INT PRIMARY KEY, product_id INT, customer_id INT ); CREATE TABLE customer ( id INT PRIMARY KEY, name VARCHAR(20), phone VARCHAR(15) ); ```

修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计.
上一篇:MySQL学习——常用语句
下一篇:MySQL学习——查询练习

    推荐阅读