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 范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:第一范式(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学习——查询练习

你可能感兴趣的:(软件测试——数据库,mysql,数据可,软件测试,数据库范式)