1. 什么是第三范式
第三范式(Third Normal Form, 3NF)是数据库设计中的一种概念,它是指一个关系模式R,如果R中的所有非主属性都和R的主属性有函数依赖关系,同时,R中的所有非主属性都不能相互依赖,那么就符合第三范式。
简而言之,第三范式要求数据表必须达到以下三个要求:
每列都不可再分
数据表中的每一列都与主键相关
每个非主键列都不能依赖于其他非主键列
2. 第三范式设计的优点
第三范式设计通过消除数据冗余,提高了数据库的性能和可维护性。
在第三范式设计的数据库中,数据库的数据量相对较小,查询速度也会更快。此外,维护这样的数据库也会更加容易,因为不同表之间的数据是相互独立的,所以修改数据时也就不会影响到其它表的数据。
3. 如何实现第三范式设计
3.1 按需拆分表
在设计数据库时,尽量将一张大表拆分成多张小表,每张表只包含相关联的数据。这样做不仅提高了查询效率,还可以减少数据冗余。例如,我们有一个订单表,里面包含了订单的所有信息,包括订单编号、客户编号、产品编号、价格、数量等等。如果我们按照第三范式设计的要求来设计表,可以将其拆分成订单表、客户表和产品表。订单表只包含订单编号、客户编号和产品编号等主键信息,其它信息(如价格、数量)可以放到另外一张表中。
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
CREATE TABLE order_details (
order_id INT NOT NULL,
product_id INT NOT NULL,
price DECIMAL(10,2) NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
3.2 消除重复数据
在每张表中,尽量减少重复数据。例如,如果一个表中有多个列包含同样的数据,可以将这些数据放到另外一张表中,并在主表和次表之间建立外键关系。
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
department_id INT NOT NULL,
FOREIGN KEY (department_id) REFERENCES departments(department_id)
);
CREATE TABLE departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100) NOT NULL,
location VARCHAR(100) NOT NULL
);
3.3 分离内容和关系
将一个实体的属性拆分成多个子属性,放到另外一张表中。例如,如果我们要为用户存储地址,可以将地址的各个部分分开存储,例如国家、省份、城市、街道等。
CREATE TABLE users (
user_id INT PRIMARY KEY,
user_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
password VARCHAR(100) NOT NULL,
created_at TIMESTAMP NOT NULL
);
CREATE TABLE addresses (
address_id INT PRIMARY KEY,
user_id INT NOT NULL,
country VARCHAR(100) NOT NULL,
province VARCHAR(100) NOT NULL,
city VARCHAR(100) NOT NULL,
street VARCHAR(100) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);