深入浅出MySQL 三大范式解析(mysql三大范式定义)

深入浅出:MySQL 三大范式解析

在关系型数据库中,范式是非常重要的概念。它不仅关系到数据的规范性和完整性,还关系到数据库的性能和扩展性。在MySQL中,范式可以分为三个级别:第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。本文将深入浅出地解析MySQL三大范式,并附上相关代码。

1. 第一范式(1NF)

第一范式是最基本的范式,它要求每个数据项都是原子的,也就是不可再分的。举个例子,一张订单表中,每个订单应该只有一个订单号、一个客户ID、一个下单时间等字段,而不是一个数据项中包含多个订单号或多个客户ID。以下是一个简单的订单表示例:

CREATE TABLE order (

order_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

customer_id INT UNSIGNED NOT NULL,

order_date DATE NOT NULL,

total_price DECIMAL(10,2) NOT NULL

);

可以看到,每个字段都只包含了一个数据项,因此满足了第一范式的要求。

2. 第二范式(2NF)

第二范式建立在第一范式的基础之上,它要求每个非主键字段都完全依赖于主键,而不是仅仅依赖于主键的一部分。如果一个表存在非主键字段与部分主键字段的依赖关系,那么就需要对表进行拆分。以下是一个经典的订单详情表示例:

CREATE TABLE order_detl (

order_id INT UNSIGNED NOT NULL,

product_id INT UNSIGNED NOT NULL,

quantity INT UNSIGNED NOT NULL,

price DECIMAL(10,2) NOT NULL,

PRIMARY KEY (order_id, product_id)

);

在这个表中,订单号和商品号组合成了主键,但是数量和价格却只依赖于商品号。因此,如果需要计算商品的总数量或总金额,就需要对表进行拆分:

CREATE TABLE order_product (

order_id INT UNSIGNED NOT NULL,

product_id INT UNSIGNED NOT NULL,

quantity INT UNSIGNED NOT NULL,

PRIMARY KEY (order_id, product_id)

);

CREATE TABLE product_price (

product_id INT UNSIGNED NOT NULL,

price DECIMAL(10,2) NOT NULL,

PRIMARY KEY (product_id)

);

这样,就可以满足第二范式的要求了。

3. 第三范式(3NF)

第三范式要求在满足第二范式的前提下,所有非主键字段都不应该依赖于其他非主键字段。以下是一个订单表示例:

CREATE TABLE order (

order_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

customer_id INT UNSIGNED NOT NULL,

customer_name VARCHAR(50) NOT NULL,

customer_phone VARCHAR(20) NOT NULL,

order_date DATE NOT NULL,

total_price DECIMAL(10,2) NOT NULL

);

可以看到,这个表中,订单号、客户ID、客户姓名、客户电话、下单时间和总价都是非主键字段,其中客户ID、客户姓名和客户电话之间存在显式的依赖关系。因此,需要对表进行拆分:

CREATE TABLE customer (

customer_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

customer_name VARCHAR(50) NOT NULL,

customer_phone VARCHAR(20) NOT NULL

);

CREATE TABLE order (

order_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

customer_id INT UNSIGNED NOT NULL,

order_date DATE NOT NULL,

total_price DECIMAL(10,2) NOT NULL,

CONSTRNT fk_customer_id FOREIGN KEY (customer_id) REFERENCES customer (customer_id)

);

这样,每个表都只包含了一个数据实体,并且不存在冗余数据,因此满足第三范式的要求。

总结

MySQL的三大范式规定了数据库设计的基本原则。严格遵守这些范式,可以保证数据的规范性、完整性和准确性,同时也能提高数据库的性能和扩展性。在实际应用中,设计数据库时应该采用适当的拆分和调整,以便更好地满足业务需求。

参考代码

1. 第一范式示例

CREATE TABLE order (

order_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

customer_id INT UNSIGNED NOT NULL,

order_date DATE NOT NULL,

total_price DECIMAL(10,2) NOT NULL

);

2. 第二范式示例

CREATE TABLE order_detl (

order_id INT UNSIGNED NOT NULL,

product_id INT UNSIGNED NOT NULL,

quantity INT UNSIGNED NOT NULL,

price DECIMAL(10,2) NOT NULL,

PRIMARY KEY (order_id, product_id)

);

CREATE TABLE order_product (

order_id INT UNSIGNED NOT NULL,

product_id INT UNSIGNED NOT NULL,

quantity INT UNSIGNED NOT NULL,

PRIMARY KEY (order_id, product_id)

);

CREATE TABLE product_price (

product_id INT UNSIGNED NOT NULL,

price DECIMAL(10,2) NOT NULL,

PRIMARY KEY (product_id)

);

3. 第三范式示例

CREATE TABLE customer (

customer_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

customer_name VARCHAR(50) NOT NULL,

customer_phone VARCHAR(20) NOT NULL

);

CREATE TABLE order (

order_id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

customer_id INT UNSIGNED NOT NULL,

order_date DATE NOT NULL,

total_price DECIMAL(10,2) NOT NULL,

CONSTRNT fk_customer_id FOREIGN KEY (customer_id) REFERENCES customer (customer_id)

);


数据运维技术 » 深入浅出MySQL 三大范式解析(mysql三大范式定义)