深入浅出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)
);